ouroboros-ai 0.31.2.dev11__tar.gz → 0.31.2.dev13__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.dev11 → ouroboros_ai-0.31.2.dev13}/PKG-INFO +1 -1
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/docs/README.md +1 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/docs/architecture.md +6 -0
- ouroboros_ai-0.31.2.dev13/docs/contributing/agent-os-kernel-terminology.md +73 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/_version.py +2 -2
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/cli/commands/setup.py +24 -5
- ouroboros_ai-0.31.2.dev13/src/ouroboros/cli/opencode_config.py +179 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/opencode/plugin/ouroboros-bridge.test.ts +10 -2
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/opencode/plugin/ouroboros-bridge.ts +2 -3
- ouroboros_ai-0.31.2.dev13/tests/unit/cli/test_opencode_config.py +244 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/cli/test_setup.py +39 -0
- ouroboros_ai-0.31.2.dev11/src/ouroboros/cli/opencode_config.py +0 -95
- ouroboros_ai-0.31.2.dev11/tests/unit/cli/test_opencode_config.py +0 -111
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/.claude/settings.json +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/.claude-plugin/.mcp.json +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/.claude-plugin/marketplace.json +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/.claude-plugin/plugin.json +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/.env.example +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/.github/ISSUE_TEMPLATE/question.yml +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/.github/workflows/dev-publish.yml +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/.github/workflows/lint.yml +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/.github/workflows/release.yml +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/.github/workflows/test.yml +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/.gitignore +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/.mcp.json +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/.ouroboros/mechanical.toml +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/.ouroboros/seeds/seed_73827177a2a3.yaml +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/.ouroboros/seeds/seed_78c8e6e41813.yaml +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/.pre-commit-config.yaml +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/.python-version +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/CHANGELOG.md +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/CLAUDE.md +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/CODE_OF_CONDUCT.md +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/CONTRIBUTING.md +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/Code-Review-Claude.md +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/Code-Review-Codex.md +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/HANDOFF.md +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/LICENSE +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/README.ko.md +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/README.md +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/SECURITY.md +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/UNINSTALL.md +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/commands/cancel.md +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/commands/evaluate.md +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/commands/evolve.md +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/commands/help.md +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/commands/interview.md +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/commands/ralph.md +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/commands/run.md +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/commands/seed.md +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/commands/setup.md +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/commands/status.md +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/commands/tutorial.md +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/commands/unstuck.md +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/commands/welcome.md +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/crates/ouroboros-tui/.gitignore +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/crates/ouroboros-tui/Cargo.lock +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/crates/ouroboros-tui/Cargo.toml +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/crates/ouroboros-tui/README.md +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/crates/ouroboros-tui/src/db.rs +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/crates/ouroboros-tui/src/main.rs +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/crates/ouroboros-tui/src/mock.rs +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/crates/ouroboros-tui/src/state.rs +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/crates/ouroboros-tui/src/views/dashboard.rs +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/crates/ouroboros-tui/src/views/execution.rs +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/crates/ouroboros-tui/src/views/lineage.rs +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/crates/ouroboros-tui/src/views/logs.rs +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/crates/ouroboros-tui/src/views/mod.rs +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/crates/ouroboros-tui/src/views/session_selector.rs +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/docs/api/README.md +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/docs/api/core.md +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/docs/api/mcp.md +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/docs/cli-reference.md +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/docs/config-reference.md +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/docs/contributing/architecture-overview.md +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/docs/contributing/findings-registry.md +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/docs/contributing/issue-quality-policy.md +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/docs/contributing/key-patterns.md +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/docs/contributing/testing-guide.md +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/docs/events.md +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/docs/examples/mcp-config.yaml +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/docs/examples/workflows/design-code-verify.md +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/docs/examples/workflows/research-to-deliverable.md +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/docs/getting-started.md +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/docs/guides/evaluation-pipeline.md +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/docs/guides/evolution-loop.md +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/docs/guides/issue-176-subagent-mcp-inheritance.md +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/docs/guides/mcp-best-practices.md +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/docs/guides/mcp-bridge.md +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/docs/guides/ooo-skill-dispatch-router.md +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/docs/guides/opencode-subagent-bridge.md +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/docs/guides/qa-backends.md +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/docs/guides/seed-authoring.md +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/docs/guides/tui-usage.md +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/docs/images/PLACEHOLDER_README.md +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/docs/images/ouroboros.png +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/docs/platform-support.md +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/docs/runtime-capability-matrix.md +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/docs/runtime-guides/claude-code.md +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/docs/runtime-guides/codex.md +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/docs/runtime-guides/gemini.md +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/docs/runtime-guides/hermes.md +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/docs/runtime-guides/opencode.md +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/examples/coordinator_test_seed.yaml +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/examples/dummy_seed.yaml +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/examples/parallel_subac_test_seed.yaml +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/examples/subac_test_seed.yaml +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/examples/task_manager/README.md +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/examples/task_manager/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/examples/task_manager/__main__.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/examples/task_manager/cli.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/examples/task_manager/models.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/examples/task_manager/storage.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/examples/test_display.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/hooks/hooks.json +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/llms-full.txt +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/llms.txt +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/project-context.md +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/pyproject.toml +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/scripts/drift-monitor.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/scripts/install.sh +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/scripts/keyword-detector.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/scripts/mcp-serve.sh +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/scripts/ralph-rewind.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/scripts/ralph.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/scripts/ralph.sh +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/scripts/session-start.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/scripts/sync-plugin-version.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/scripts/version-check.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/skills/brownfield/SKILL.md +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/skills/cancel/SKILL.md +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/skills/evaluate/SKILL.md +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/skills/evolve/SKILL.md +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/skills/help/SKILL.md +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/skills/interview/SKILL.md +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/skills/pm/SKILL.md +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/skills/publish/SKILL.md +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/skills/qa/SKILL.md +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/skills/ralph/SKILL.md +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/skills/resume-session/SKILL.md +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/skills/run/SKILL.md +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/skills/seed/SKILL.md +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/skills/setup/SKILL.md +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/skills/status/SKILL.md +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/skills/tutorial/SKILL.md +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/skills/unstuck/SKILL.md +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/skills/update/SKILL.md +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/skills/welcome/SKILL.md +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/__main__.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/agents/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/agents/advocate.md +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/agents/analysis-agent.md +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/agents/architect.md +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/agents/breadth-keeper.md +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/agents/code-executor.md +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/agents/codebase-explorer.md +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/agents/consensus-reviewer.md +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/agents/contrarian.md +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/agents/evaluator.md +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/agents/hacker.md +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/agents/judge.md +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/agents/loader.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/agents/ontologist.md +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/agents/ontology-analyst.md +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/agents/qa-judge.md +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/agents/research-agent.md +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/agents/researcher.md +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/agents/seed-architect.md +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/agents/seed-closer.md +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/agents/semantic-evaluator.md +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/agents/simplifier.md +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/agents/socratic-interviewer.md +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/bigbang/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/bigbang/ambiguity.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/bigbang/brownfield.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/bigbang/explore.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/bigbang/interview.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/bigbang/pm_completion.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/bigbang/pm_document.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/bigbang/pm_interview.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/bigbang/pm_seed.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/bigbang/question_classifier.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/bigbang/seed_generator.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/claude_permissions.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/cli/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/cli/commands/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/cli/commands/cancel.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/cli/commands/config.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/cli/commands/detect.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/cli/commands/init.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/cli/commands/mcp.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/cli/commands/mcp_doctor.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/cli/commands/pm.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/cli/commands/resume.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/cli/commands/run.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/cli/commands/status.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/cli/commands/tui.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/cli/commands/uninstall.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/cli/formatters/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/cli/formatters/panels.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/cli/formatters/progress.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/cli/formatters/prompting.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/cli/formatters/tables.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/cli/formatters/workflow_display.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/cli/jsonc.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/cli/main.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/codex/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/codex/artifacts.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/codex/cli_policy.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/codex/ouroboros.md +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/codex_permissions.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/config/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/config/loader.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/config/models.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/core/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/core/ac_tree.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/core/context.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/core/directive.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/core/errors.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/core/file_lock.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/core/git_workflow.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/core/initial_context.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/core/json_utils.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/core/lineage.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/core/ontology_aspect.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/core/ontology_questions.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/core/project_paths.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/core/retry.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/core/security.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/core/seed.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/core/seed_contract.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/core/seed_contract_prompt.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/core/text.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/core/ttl_cache.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/core/types.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/core/worktree.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/evaluation/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/evaluation/artifact_collector.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/evaluation/checklist.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/evaluation/consensus.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/evaluation/detector.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/evaluation/json_utils.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/evaluation/languages.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/evaluation/mechanical.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/evaluation/models.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/evaluation/pipeline.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/evaluation/semantic.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/evaluation/trigger.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/evaluation/verification_artifacts.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/events/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/events/base.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/events/control.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/events/decomposition.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/events/evaluation.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/events/interview.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/events/lineage.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/events/ontology.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/evolution/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/evolution/convergence.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/evolution/loop.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/evolution/projector.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/evolution/reflect.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/evolution/regression.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/evolution/wonder.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/execution/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/execution/atomicity.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/execution/decomposition.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/execution/double_diamond.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/execution/subagent.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/hermes/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/hermes/artifacts.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/mcp/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/mcp/bridge/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/mcp/bridge/bridge.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/mcp/bridge/config.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/mcp/bridge/factory.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/mcp/client/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/mcp/client/adapter.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/mcp/client/manager.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/mcp/client/protocol.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/mcp/errors.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/mcp/job_manager.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/mcp/resources/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/mcp/resources/handlers.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/mcp/server/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/mcp/server/adapter.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/mcp/server/protocol.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/mcp/server/security.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/mcp/tools/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/mcp/tools/ac_tree_hud_handler.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/mcp/tools/ac_tree_hud_render.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/mcp/tools/authoring_handlers.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/mcp/tools/bridge_mixin.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/mcp/tools/brownfield_handler.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/mcp/tools/dashboard.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/mcp/tools/definitions.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/mcp/tools/evaluation_handlers.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/mcp/tools/evolution_handlers.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/mcp/tools/execution_handlers.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/mcp/tools/job_handlers.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/mcp/tools/pm_handler.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/mcp/tools/qa.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/mcp/tools/query_handlers.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/mcp/tools/registry.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/mcp/tools/subagent.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/mcp/types.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/observability/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/observability/drift.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/observability/logging.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/observability/retrospective.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/opencode/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/opencode/plugin/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/opencode/plugin/opencode-plugin.d.ts +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/opencode/plugin/package.json +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/opencode/plugin/tsconfig.json +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/orchestrator/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/orchestrator/adapter.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/orchestrator/capabilities.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/orchestrator/codex_cli_runtime.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/orchestrator/command_dispatcher.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/orchestrator/control_plane.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/orchestrator/coordinator.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/orchestrator/dependency_analyzer.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/orchestrator/events.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/orchestrator/execution_runtime_scope.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/orchestrator/execution_strategy.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/orchestrator/gemini_cli_runtime.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/orchestrator/heartbeat.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/orchestrator/hermes_runtime.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/orchestrator/level_context.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/orchestrator/mcp_config.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/orchestrator/mcp_tools.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/orchestrator/opencode_event_normalizer.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/orchestrator/opencode_runtime.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/orchestrator/parallel_executor.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/orchestrator/parallel_executor_models.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/orchestrator/policy.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/orchestrator/rate_limit.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/orchestrator/runner.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/orchestrator/runtime_factory.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/orchestrator/runtime_message_projection.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/orchestrator/session.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/orchestrator/workflow_state.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/persistence/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/persistence/brownfield.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/persistence/checkpoint.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/persistence/event_store.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/persistence/migrations/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/persistence/migrations/runner.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/persistence/migrations/scripts/001_initial.sql +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/persistence/migrations/scripts/002_brownfield.sql +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/persistence/schema.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/persistence/uow.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/plugin/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/plugin/agents/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/plugin/agents/pool.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/plugin/agents/registry.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/plugin/orchestration/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/plugin/orchestration/router.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/plugin/orchestration/scheduler.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/plugin/skills/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/plugin/skills/docs.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/plugin/skills/executor.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/plugin/skills/keywords.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/plugin/skills/registry.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/pm/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/pm/handoff.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/pm/renderer.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/providers/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/providers/anthropic_adapter.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/providers/base.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/providers/claude_code_adapter.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/providers/codex_cli_adapter.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/providers/codex_cli_stream.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/providers/factory.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/providers/gemini_cli_adapter.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/providers/gemini_event_normalizer.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/providers/litellm_adapter.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/providers/opencode_adapter.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/py.typed +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/resilience/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/resilience/lateral.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/resilience/recovery.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/resilience/stagnation.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/router/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/router/command_parser.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/router/dispatch.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/router/registry.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/router/types.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/routing/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/routing/complexity.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/routing/downgrade.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/routing/escalation.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/routing/router.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/routing/tiers.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/sandbox.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/secondary/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/secondary/scheduler.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/secondary/todo_registry.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/skills/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/skills/artifacts.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/strategies/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/strategies/devil_advocate.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/tui/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/tui/app.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/tui/components/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/tui/components/agents_panel.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/tui/components/event_log.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/tui/components/progress.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/tui/components/token_tracker.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/tui/events.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/tui/screens/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/tui/screens/confirm_rewind.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/tui/screens/dashboard.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/tui/screens/dashboard_v2.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/tui/screens/dashboard_v3.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/tui/screens/debug.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/tui/screens/execution.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/tui/screens/hud_dashboard.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/tui/screens/lineage_detail.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/tui/screens/lineage_selector.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/tui/screens/logs.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/tui/screens/session_selector.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/tui/widgets/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/tui/widgets/ac_progress.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/tui/widgets/ac_tree.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/tui/widgets/agent_activity.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/tui/widgets/cost_tracker.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/tui/widgets/drift_meter.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/tui/widgets/lineage_tree.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/tui/widgets/parallel_graph.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/tui/widgets/phase_progress.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/verification/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/verification/extractor.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/verification/models.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/verification/verifier.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/conftest.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/e2e/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/e2e/conftest.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/e2e/mcp_bridge_test_config.yaml +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/e2e/test_cli_commands.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/e2e/test_full_workflow.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/e2e/test_session_persistence.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/fixtures/router/skills/frontmatter-body/run/SKILL.md +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/fixtures/test_atomicity_seed.yml +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/integration/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/integration/conftest.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/integration/mcp/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/integration/mcp/bridge/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/integration/mcp/bridge/test_bridge_server_to_server.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/integration/mcp/conftest.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/integration/mcp/test_client_adapter.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/integration/mcp/test_client_manager.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/integration/mcp/test_server_adapter.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/integration/plugin/test_orchestration.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/integration/test_cancel_subprocess_termination.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/integration/test_codex_cli_passthrough_smoke.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/integration/test_codex_skill_fallback.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/integration/test_codex_skill_smoke.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/integration/test_entry_point.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/test-execution-plan.md +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/agents/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/agents/test_loader.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/bigbang/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/bigbang/test_ambiguity.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/bigbang/test_brownfield.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/bigbang/test_classifier_context.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/bigbang/test_decide_later_items.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/bigbang/test_explore.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/bigbang/test_interview.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/bigbang/test_interview_async_io.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/bigbang/test_interview_no_web_search_hint.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/bigbang/test_interview_research_prefix.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/bigbang/test_pm_completion.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/bigbang/test_pm_document_generator.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/bigbang/test_pm_document_writer.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/bigbang/test_pm_interview.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/bigbang/test_pm_interview_brownfield_db.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/bigbang/test_pm_seed_ac12.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/bigbang/test_pm_seed_save.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/bigbang/test_question_classifier.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/bigbang/test_seed_generator.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/cli/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/cli/commands/test_tui_command.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/cli/conftest.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/cli/formatters/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/cli/formatters/test_console.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/cli/formatters/test_panels.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/cli/formatters/test_progress.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/cli/formatters/test_prompting.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/cli/formatters/test_tables.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/cli/formatters/test_workflow_display.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/cli/test_bridge_plugin_hardening.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/cli/test_bridge_plugin_lifecycle.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/cli/test_cancel.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/cli/test_config.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/cli/test_doc_commands.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/cli/test_init_pm_seed_detection.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/cli/test_init_runtime.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/cli/test_jsonc.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/cli/test_main.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/cli/test_mcp_doctor.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/cli/test_mcp_nested_guard.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/cli/test_mcp_shell_env.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/cli/test_mcp_startup_cleanup.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/cli/test_mcp_validate_transport_stderr.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/cli/test_pm.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/cli/test_pm_brownfield.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/cli/test_pm_completion.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/cli/test_pm_interactive_logging.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/cli/test_pm_missing_litellm.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/cli/test_pm_overwrite.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/cli/test_pm_runtime_adapter.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/cli/test_pm_select_repos.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/cli/test_resume.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/cli/test_run_qa.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/cli/test_uninstall.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/codex/test_cli_policy.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/config/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/config/test_loader.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/config/test_loader_env.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/config/test_models.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/core/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/core/test_ac_tree.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/core/test_context.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/core/test_directive.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/core/test_errors.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/core/test_file_lock.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/core/test_git_workflow.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/core/test_initial_context.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/core/test_lineage.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/core/test_ontology_aspect.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/core/test_ontology_questions.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/core/test_retry.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/core/test_security.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/core/test_seed.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/core/test_ttl_cache.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/core/test_types.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/core/test_worktree.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/evaluation/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/evaluation/test_artifact_collector_file_prefix.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/evaluation/test_checklist.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/evaluation/test_consensus.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/evaluation/test_detector.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/evaluation/test_json_utils.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/evaluation/test_languages.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/evaluation/test_mechanical.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/evaluation/test_models.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/evaluation/test_pipeline_stage1_reuse.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/evaluation/test_pipeline_trigger_consensus.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/evaluation/test_review_fixes.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/evaluation/test_semantic.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/evaluation/test_trigger.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/evaluation/test_trigger_consensus.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/evaluation/test_verification_artifacts.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/events/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/events/test_base.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/events/test_control_events.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/events/test_decomposition_events.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/evolution/test_wonder_scope.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/execution/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/execution/test_atomicity.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/execution/test_decomposition.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/execution/test_double_diamond.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/execution/test_subagent_isolation.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/hermes/test_artifacts.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/mcp/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/mcp/bridge/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/mcp/bridge/test_bridge.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/mcp/bridge/test_config.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/mcp/bridge/test_factory.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/mcp/bridge/test_handler_wiring.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/mcp/bridge/test_stability.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/mcp/client/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/mcp/client/test_adapter.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/mcp/client/test_adapter_transport_lifecycle.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/mcp/client/test_manager.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/mcp/conftest.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/mcp/server/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/mcp/server/test_adapter.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/mcp/server/test_security.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/mcp/test_errors.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/mcp/test_job_manager.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/mcp/test_types.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/mcp/tools/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/mcp/tools/conftest.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/mcp/tools/test_ac_tree_hud_footer.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/mcp/tools/test_ac_tree_hud_handler.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/mcp/tools/test_ac_tree_hud_handler_completed.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/mcp/tools/test_ac_tree_hud_handler_cursor_changed.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/mcp/tools/test_ac_tree_hud_handler_invalid_session.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/mcp/tools/test_ac_tree_hud_handler_no_execution.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/mcp/tools/test_ac_tree_hud_handler_waiting.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/mcp/tools/test_ac_tree_hud_max_nodes.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/mcp/tools/test_ac_tree_hud_render_depth2.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/mcp/tools/test_ac_tree_hud_render_depth3.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/mcp/tools/test_ac_tree_hud_status_icons.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/mcp/tools/test_ac_tree_hud_truncation.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/mcp/tools/test_brownfield_handler.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/mcp/tools/test_checklist_verify.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/mcp/tools/test_definitions.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/mcp/tools/test_evaluate_multi_ac.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/mcp/tools/test_handler_subagent_wiring.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/mcp/tools/test_interview_done_streak.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/mcp/tools/test_interview_reopen_seed_ready.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/mcp/tools/test_lateral_think_handler.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/mcp/tools/test_mcp_manager_wiring.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/mcp/tools/test_pm_handler.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/mcp/tools/test_pm_handler_pending_reframe.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/mcp/tools/test_qa_parser.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/mcp/tools/test_registry.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/mcp/tools/test_round5_fixes.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/mcp/tools/test_subagent.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/observability/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/observability/test_drift.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/observability/test_logging.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/observability/test_retrospective.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/orchestrator/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/orchestrator/test_adapter.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/orchestrator/test_capabilities.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/orchestrator/test_codex_cli_runtime.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/orchestrator/test_codex_recursion_guard.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/orchestrator/test_command_dispatcher.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/orchestrator/test_control_plane.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/orchestrator/test_coordinator.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/orchestrator/test_dependency_analyzer.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/orchestrator/test_events.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/orchestrator/test_execution_runtime_scope.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/orchestrator/test_execution_strategy.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/orchestrator/test_gemini_cli_runtime.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/orchestrator/test_hermes_runtime.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/orchestrator/test_inflight_cancellation.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/orchestrator/test_level_context.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/orchestrator/test_mcp_config.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/orchestrator/test_mcp_tools.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/orchestrator/test_opencode_runtime.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/orchestrator/test_parallel_executor.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/orchestrator/test_parallel_executor_atomic_judgment.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/orchestrator/test_parallel_executor_recursive_depth.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/orchestrator/test_parallel_executor_retry_resume.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/orchestrator/test_policy.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/orchestrator/test_rate_limit.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/orchestrator/test_runner.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/orchestrator/test_runner_cancellation.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/orchestrator/test_runtime_factory.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/orchestrator/test_runtime_message_projection.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/orchestrator/test_sandbox_class.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/orchestrator/test_seed_prompt.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/orchestrator/test_session.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/orchestrator/test_workflow_state.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/persistence/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/persistence/test_brownfield_store.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/persistence/test_checkpoint.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/persistence/test_event_store.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/persistence/test_schema.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/persistence/test_uow.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/plugin/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/plugin/agents/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/plugin/agents/test_registry.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/plugin/orchestration/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/plugin/orchestration/test_model_router.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/plugin/skills/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/plugin/skills/test_keywords.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/plugin/skills/test_registry.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/pm/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/pm/test_renderer.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/providers/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/providers/test_base.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/providers/test_claude_code_adapter.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/providers/test_codex_cli_adapter.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/providers/test_factory.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/providers/test_gemini_cli_adapter.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/providers/test_litellm_adapter.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/providers/test_opencode_adapter.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/resilience/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/resilience/test_lateral.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/resilience/test_recovery.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/resilience/test_stagnation.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/router/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/router/test_command_parser.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/router/test_dispatch.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/router/test_dispatch_result_shapes.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/router/test_extract_first_argument.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/router/test_invalid_dispatch_input_types.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/router/test_malformed_unknown_dispatch_errors.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/router/test_not_handled_resolution.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/router/test_registry.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/router/test_repository_dispatch_guard.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/router/test_router_resolution_pipeline.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/router/test_typed_frontmatter_fields.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/router/test_valid_dispatch_normalization.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/routing/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/routing/test_complexity.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/routing/test_downgrade.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/routing/test_escalation.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/routing/test_router.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/routing/test_tiers.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/scripts/test_keyword_detector.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/scripts/test_session_start.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/scripts/test_version_check.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/secondary/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/secondary/test_scheduler.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/secondary/test_todo_registry.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/skills/test_skill_artifacts.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/test_artifact_collector.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/test_codex_artifacts.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/test_convergence.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/test_dashboard.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/test_dependencies_configured.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/test_evolve_rewind.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/test_evolve_step.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/test_graceful_shutdown.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/test_main_entry_point.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/test_module_structure.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/test_project_initialization.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/test_projector_rewind.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/test_ralph_parser.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/test_ralph_rewind.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/test_regression.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/test_tooling_configuration.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/test_verification.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/tui/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/tui/test_app.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/tui/test_cancelled_display.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/tui/test_events.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/tui/test_lineage_viewer.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/tui/test_screens.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/tui/test_session_selector_replay.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/tui/test_widgets.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tools/sync_github_project.py +0 -0
- {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/uv.lock +0 -0
|
@@ -48,6 +48,7 @@ replayable execution contract on your choice of runtime backend.
|
|
|
48
48
|
|
|
49
49
|
- [Contributing Guide](../CONTRIBUTING.md) - How to set up, code, test, and submit PRs
|
|
50
50
|
- [Architecture for Contributors](./contributing/architecture-overview.md) - How modules connect
|
|
51
|
+
- [Agent OS Kernel Terminology](./contributing/agent-os-kernel-terminology.md) - Locked vocabulary for `AgentRuntimeContext`, `ControlPlane`, `ControlContract`, `Directive`, `ControlBus`, and `IOJournal`
|
|
51
52
|
- [Testing Guide](./contributing/testing-guide.md) - Writing and running tests
|
|
52
53
|
- [Key Patterns](./contributing/key-patterns.md) - Result type, immutability, event sourcing, protocols
|
|
53
54
|
- [Findings Registry](./contributing/findings-registry.md) - Documentation audit findings registry
|
|
@@ -4,6 +4,12 @@
|
|
|
4
4
|
|
|
5
5
|
Ouroboros is a **specification-first AI workflow engine** that transforms vague ideas into validated specifications before execution. Built on event sourcing with a rich TUI interface, it provides complete lifecycle management from requirements to evaluation.
|
|
6
6
|
|
|
7
|
+
Agent OS terminology is intentionally locked so kernel-level PRs do not blur
|
|
8
|
+
runtime context, control contracts, transport, and observability. See
|
|
9
|
+
[Agent OS Kernel Terminology](./contributing/agent-os-kernel-terminology.md)
|
|
10
|
+
for the canonical meanings of `AgentRuntimeContext`, `ControlPlane`,
|
|
11
|
+
`ControlContract`, `Directive`, `ControlBus`, and `IOJournal`.
|
|
12
|
+
|
|
7
13
|
```
|
|
8
14
|
┌─────────────────────────────────────────────────────────────────────────────────────────────────────┐
|
|
9
15
|
│ OUROBOROS ARCHITECTURE │
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
# Agent OS Kernel Terminology
|
|
2
|
+
|
|
3
|
+
This document locks the kernel-level vocabulary for the Agent OS workstream.
|
|
4
|
+
It exists so review comments and stacked PRs use the same words for runtime
|
|
5
|
+
context, control decisions, transport, and journaled observability.
|
|
6
|
+
|
|
7
|
+
## Locked Terms
|
|
8
|
+
|
|
9
|
+
| Term | Layer | Definition | Naming Rule |
|
|
10
|
+
|------|-------|------------|-------------|
|
|
11
|
+
| `AgentRuntimeContext` | Runtime context | The per-agent execution envelope. It carries stable runtime dependencies and capabilities such as event storage, runtime backend identity, LLM backend identity, MCP bridge access, and control surfaces. | Use when describing what an agent process is allowed to see or use during a run. |
|
|
12
|
+
| `ControlPlane` | Kernel control layer | The top-level conceptual layer for workflow control. It owns the vocabulary, contracts, routing rules, and transport surfaces that tell a runtime what should happen next. | Use for the architecture layer. Do not use `ControlBus` as the top-level concept. |
|
|
13
|
+
| `ControlContract` | Control invariant layer | The stable schema and behavioral contract for control messages: allowed directives, terminal semantics, retry budgets, timeout behavior, resume invariants, and required journaling. | Use when a PR defines or changes an invariant that consumers must obey. |
|
|
14
|
+
| `Directive` | Control vocabulary | The small, stable action alphabet emitted by decision sites, for example `CONTINUE`, `RETRY`, `WAIT`, `CANCEL`, and `CONVERGE`. | Use for the actual command value. Do not introduce local synonyms when an existing directive carries the meaning. |
|
|
15
|
+
| `ControlBus` | Control transport | The in-process publish/subscribe implementation that delivers control events or directives to subscribers. It is a transport inside the `ControlPlane`, not the plane itself. | Use only for the implementation that dispatches messages. |
|
|
16
|
+
| `IOJournal` | Observability journal | The durable record of external I/O, including paired LLM and tool call events. It explains what the runtime asked, what came back, and whether a call failed. | Use for the event-backed I/O log. Avoid treating ad hoc logs or stdout as the journal. |
|
|
17
|
+
|
|
18
|
+
## Layering
|
|
19
|
+
|
|
20
|
+
The intended relationship is:
|
|
21
|
+
|
|
22
|
+
```text
|
|
23
|
+
AgentRuntimeContext
|
|
24
|
+
-> exposes ControlPlane and runtime capabilities to a running agent
|
|
25
|
+
|
|
26
|
+
ControlPlane
|
|
27
|
+
-> governed by ControlContract
|
|
28
|
+
-> emits Directive values
|
|
29
|
+
-> may use ControlBus as an in-process transport
|
|
30
|
+
-> persists durable decisions through control.* events
|
|
31
|
+
|
|
32
|
+
IOJournal
|
|
33
|
+
-> records external LLM/tool I/O alongside control decisions
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
In OS terms, `AgentRuntimeContext` is the process execution envelope,
|
|
37
|
+
`ControlPlane` is the kernel control layer, `ControlContract` is the syscall
|
|
38
|
+
contract, `Directive` is the command vocabulary, `ControlBus` is one local
|
|
39
|
+
delivery mechanism, and `IOJournal` is the replayable black box.
|
|
40
|
+
|
|
41
|
+
## Control Contract Invariants
|
|
42
|
+
|
|
43
|
+
The following invariants should guide Agent OS PR review:
|
|
44
|
+
|
|
45
|
+
- Terminal directives are terminal. After `CANCEL` or `CONVERGE`, a runtime
|
|
46
|
+
must not start new work for the same execution unless a new contract ID or
|
|
47
|
+
explicit rerun is allocated.
|
|
48
|
+
- Retry behavior belongs to the control contract. `RETRY` must respect the
|
|
49
|
+
owning retry budget and must be journaled with enough context to explain why
|
|
50
|
+
the retry happened.
|
|
51
|
+
- `WAIT` means no forward progress until the awaited input, timeout, or queued
|
|
52
|
+
event arrives.
|
|
53
|
+
- Resume must preserve the original execution envelope: runtime backend, LLM
|
|
54
|
+
backend, working directory, MCP bridge capability, and user-selected safety
|
|
55
|
+
options must not silently change.
|
|
56
|
+
- Every durable control decision must be reconstructable from the event store.
|
|
57
|
+
Reactive delivery through `ControlBus` is not a substitute for persistence.
|
|
58
|
+
- External I/O that influences a decision must be reconstructable from the
|
|
59
|
+
`IOJournal`, using paired request/return events when possible.
|
|
60
|
+
|
|
61
|
+
## Review Guidance
|
|
62
|
+
|
|
63
|
+
When reviewing Agent OS PRs:
|
|
64
|
+
|
|
65
|
+
- Ask whether the change belongs to context, contract, vocabulary, transport,
|
|
66
|
+
or journal.
|
|
67
|
+
- Prefer `ControlPlane` for architecture discussions and `ControlBus` only for
|
|
68
|
+
the in-process pub/sub implementation.
|
|
69
|
+
- Treat `ControlContract` changes as compatibility-sensitive, even when the
|
|
70
|
+
code diff is small.
|
|
71
|
+
- Treat `IOJournal` gaps as observability bugs when they prevent replaying why
|
|
72
|
+
a control decision happened.
|
|
73
|
+
- Treat resume drift as a control-contract bug, not a CLI polish issue.
|
|
@@ -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.dev13'
|
|
22
|
+
__version_tuple__ = version_tuple = (0, 31, 2, 'dev13')
|
|
23
23
|
|
|
24
24
|
__commit_id__ = commit_id = None
|
|
@@ -12,7 +12,9 @@ Also provides brownfield repository management subcommands:
|
|
|
12
12
|
from __future__ import annotations
|
|
13
13
|
|
|
14
14
|
import asyncio
|
|
15
|
+
from contextlib import contextmanager
|
|
15
16
|
import json
|
|
17
|
+
import os
|
|
16
18
|
from pathlib import Path
|
|
17
19
|
import shutil
|
|
18
20
|
from typing import Annotated
|
|
@@ -718,6 +720,21 @@ def _detect_opencode_mcp_command() -> dict[str, list[str]] | None:
|
|
|
718
720
|
# this file keeps its historic `_BRIDGE_PLUGIN_*` naming.
|
|
719
721
|
|
|
720
722
|
|
|
723
|
+
@contextmanager
|
|
724
|
+
def _temporary_opencode_cli_path(opencode_path: str):
|
|
725
|
+
"""Expose the setup-selected OpenCode CLI path to config-dir discovery."""
|
|
726
|
+
key = "OUROBOROS_OPENCODE_CLI_PATH"
|
|
727
|
+
previous = os.environ.get(key)
|
|
728
|
+
os.environ[key] = opencode_path
|
|
729
|
+
try:
|
|
730
|
+
yield
|
|
731
|
+
finally:
|
|
732
|
+
if previous is None:
|
|
733
|
+
os.environ.pop(key, None)
|
|
734
|
+
else:
|
|
735
|
+
os.environ[key] = previous
|
|
736
|
+
|
|
737
|
+
|
|
721
738
|
def _bridge_plugin_source_text() -> str | None:
|
|
722
739
|
"""Return the bridge plugin TypeScript source, or ``None`` when missing.
|
|
723
740
|
|
|
@@ -778,7 +795,7 @@ def _install_opencode_bridge_plugin() -> bool:
|
|
|
778
795
|
Writes to the platform-appropriate OpenCode plugins directory:
|
|
779
796
|
|
|
780
797
|
* Linux: ``~/.config/opencode/plugins/ouroboros-bridge/``
|
|
781
|
-
* macOS:
|
|
798
|
+
* macOS: ``~/.config/opencode/plugins/ouroboros-bridge/`` (or the directory reported by ``opencode debug paths``)
|
|
782
799
|
* Windows: ``%APPDATA%\\OpenCode\\plugins\\ouroboros-bridge\\``
|
|
783
800
|
|
|
784
801
|
Robustness:
|
|
@@ -1003,7 +1020,8 @@ def _setup_opencode(opencode_path: str, mode: str = "plugin") -> bool:
|
|
|
1003
1020
|
|
|
1004
1021
|
# Mutual-exclusion cleanup: remove plugin-mode artifacts so both
|
|
1005
1022
|
# paths are not active simultaneously (duplicate dispatch).
|
|
1006
|
-
|
|
1023
|
+
with _temporary_opencode_cli_path(opencode_path):
|
|
1024
|
+
_cleanup_plugin_artifacts()
|
|
1007
1025
|
|
|
1008
1026
|
print_success(f"Configured OpenCode subprocess runtime (CLI: {opencode_path})")
|
|
1009
1027
|
print_info(f"Config saved to: {config_path}")
|
|
@@ -1013,9 +1031,10 @@ def _setup_opencode(opencode_path: str, mode: str = "plugin") -> bool:
|
|
|
1013
1031
|
# if ALL steps succeed (fail-closed). Without this, a failed bridge install
|
|
1014
1032
|
# leaves the user in plugin mode without a working bridge — subsequent runs
|
|
1015
1033
|
# take the plugin dispatch path and silently break.
|
|
1016
|
-
|
|
1017
|
-
|
|
1018
|
-
|
|
1034
|
+
with _temporary_opencode_cli_path(opencode_path):
|
|
1035
|
+
_install_ok = _install_opencode_bridge_plugin()
|
|
1036
|
+
_mcp_ok = _ensure_opencode_mcp_entry()
|
|
1037
|
+
_plugin_ok = _ensure_opencode_plugin_entry()
|
|
1019
1038
|
|
|
1020
1039
|
if not (_install_ok and _mcp_ok and _plugin_ok):
|
|
1021
1040
|
failed = []
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
"""Shared helpers for locating the OpenCode configuration file.
|
|
2
|
+
|
|
3
|
+
Both :mod:`~ouroboros.cli.commands.setup` and
|
|
4
|
+
:mod:`~ouroboros.cli.commands.uninstall` need to find the same config file;
|
|
5
|
+
centralising the logic here avoids duplication and keeps the ``PermissionError``
|
|
6
|
+
/ ``OSError`` guard in one place.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from __future__ import annotations
|
|
10
|
+
|
|
11
|
+
import os
|
|
12
|
+
from pathlib import Path
|
|
13
|
+
import subprocess
|
|
14
|
+
import sys
|
|
15
|
+
|
|
16
|
+
import yaml
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def _expand_config_dir(raw: str) -> Path:
|
|
20
|
+
"""Expand an OpenCode config directory string into a :class:`Path`."""
|
|
21
|
+
return Path(raw).expanduser()
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def _configured_opencode_cli_path() -> Path | None:
|
|
25
|
+
"""Return the setup-selected OpenCode CLI path when one is persisted.
|
|
26
|
+
|
|
27
|
+
Path discovery must be stable across setup, cleanup, and uninstall. Do not
|
|
28
|
+
fall back to whichever ``opencode`` happens to be on ``PATH`` here: machines
|
|
29
|
+
can have several OpenCode installs, and uninstall should target the same
|
|
30
|
+
install tree that setup recorded.
|
|
31
|
+
"""
|
|
32
|
+
for key in ("OUROBOROS_OPENCODE_CLI_PATH", "OPENCODE_CLI_PATH"):
|
|
33
|
+
raw = os.environ.get(key, "").strip()
|
|
34
|
+
if raw:
|
|
35
|
+
return Path(raw).expanduser()
|
|
36
|
+
|
|
37
|
+
config_path = Path.home() / ".ouroboros" / "config.yaml"
|
|
38
|
+
try:
|
|
39
|
+
config = yaml.safe_load(config_path.read_text(encoding="utf-8")) or {}
|
|
40
|
+
except (OSError, yaml.YAMLError):
|
|
41
|
+
return None
|
|
42
|
+
if not isinstance(config, dict):
|
|
43
|
+
return None
|
|
44
|
+
orchestrator = config.get("orchestrator")
|
|
45
|
+
if not isinstance(orchestrator, dict):
|
|
46
|
+
return None
|
|
47
|
+
raw = orchestrator.get("opencode_cli_path")
|
|
48
|
+
if not isinstance(raw, str) or not raw.strip():
|
|
49
|
+
return None
|
|
50
|
+
return Path(raw.strip()).expanduser()
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
def _debug_paths_config_dir() -> Path | None:
|
|
54
|
+
"""Return ``opencode debug paths`` config dir when the CLI reports one.
|
|
55
|
+
|
|
56
|
+
Current OpenCode releases expose the authoritative runtime directories via
|
|
57
|
+
``opencode debug paths``. Querying it first avoids baking version-specific
|
|
58
|
+
platform assumptions into Ouroboros. Any failure falls back to deterministic
|
|
59
|
+
local resolution so setup still works on machines without OpenCode on PATH.
|
|
60
|
+
"""
|
|
61
|
+
opencode = _configured_opencode_cli_path()
|
|
62
|
+
if not opencode:
|
|
63
|
+
return None
|
|
64
|
+
try:
|
|
65
|
+
result = subprocess.run(
|
|
66
|
+
[str(opencode), "debug", "paths"],
|
|
67
|
+
capture_output=True,
|
|
68
|
+
check=False,
|
|
69
|
+
text=True,
|
|
70
|
+
timeout=5,
|
|
71
|
+
)
|
|
72
|
+
except (FileNotFoundError, OSError, subprocess.TimeoutExpired):
|
|
73
|
+
return None
|
|
74
|
+
if result.returncode != 0:
|
|
75
|
+
return None
|
|
76
|
+
for line in result.stdout.splitlines():
|
|
77
|
+
parts = line.split(None, 1)
|
|
78
|
+
if len(parts) == 2 and parts[0] == "config":
|
|
79
|
+
return _expand_config_dir(parts[1])
|
|
80
|
+
return None
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
def opencode_config_dir() -> Path:
|
|
84
|
+
"""Return the active OpenCode global config directory.
|
|
85
|
+
|
|
86
|
+
Resolution order:
|
|
87
|
+
|
|
88
|
+
1. ``OPENCODE_CONFIG_DIR`` when explicitly set.
|
|
89
|
+
2. ``opencode debug paths`` ``config`` value when the CLI is available.
|
|
90
|
+
3. XDG-style default (``$XDG_CONFIG_HOME/opencode`` or
|
|
91
|
+
``~/.config/opencode``) on macOS/Linux/other Unix platforms.
|
|
92
|
+
4. Windows roaming config directory for Windows.
|
|
93
|
+
|
|
94
|
+
Older Ouroboros releases wrote macOS config under
|
|
95
|
+
``~/Library/Application Support/OpenCode``. Current OpenCode releases use
|
|
96
|
+
XDG config paths on macOS too, so that legacy directory is intentionally not
|
|
97
|
+
the default unless OpenCode itself reports it through ``debug paths``.
|
|
98
|
+
"""
|
|
99
|
+
explicit = os.environ.get("OPENCODE_CONFIG_DIR")
|
|
100
|
+
if explicit:
|
|
101
|
+
return _expand_config_dir(explicit)
|
|
102
|
+
|
|
103
|
+
reported = _debug_paths_config_dir()
|
|
104
|
+
if reported is not None:
|
|
105
|
+
return reported
|
|
106
|
+
|
|
107
|
+
if sys.platform == "win32":
|
|
108
|
+
appdata = os.environ.get("APPDATA") or str(Path.home() / "AppData" / "Roaming")
|
|
109
|
+
return Path(appdata) / "OpenCode"
|
|
110
|
+
|
|
111
|
+
xdg = os.environ.get("XDG_CONFIG_HOME") or str(Path.home() / ".config")
|
|
112
|
+
return Path(xdg) / "opencode"
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
def find_opencode_config(*, allow_default: bool = True) -> Path | None:
|
|
116
|
+
"""Locate the existing OpenCode config file.
|
|
117
|
+
|
|
118
|
+
OpenCode checks (in order): ``opencode.jsonc``, ``opencode.json`` —
|
|
119
|
+
both inside :func:`opencode_config_dir`.
|
|
120
|
+
|
|
121
|
+
Args:
|
|
122
|
+
allow_default: When ``True`` (setup path), return
|
|
123
|
+
``<config_dir>/opencode.json`` as a default for new
|
|
124
|
+
installations if neither file exists. When ``False``
|
|
125
|
+
(uninstall path), return ``None`` so the caller can skip
|
|
126
|
+
cleanly when no config is present.
|
|
127
|
+
|
|
128
|
+
Returns:
|
|
129
|
+
The first existing config path, the default path (when
|
|
130
|
+
*allow_default* is ``True``), or ``None``.
|
|
131
|
+
"""
|
|
132
|
+
explicit_config = os.environ.get("OPENCODE_CONFIG")
|
|
133
|
+
if explicit_config:
|
|
134
|
+
config_path = Path(explicit_config).expanduser()
|
|
135
|
+
if allow_default or config_path.exists():
|
|
136
|
+
return config_path
|
|
137
|
+
return None
|
|
138
|
+
|
|
139
|
+
config_dir = opencode_config_dir()
|
|
140
|
+
for name in ("opencode.jsonc", "opencode.json"):
|
|
141
|
+
candidate = config_dir / name
|
|
142
|
+
try:
|
|
143
|
+
if candidate.exists():
|
|
144
|
+
return candidate
|
|
145
|
+
except OSError:
|
|
146
|
+
continue
|
|
147
|
+
return (config_dir / "opencode.json") if allow_default else None
|
|
148
|
+
|
|
149
|
+
|
|
150
|
+
# ── Bridge-plugin identity ───────────────────────────────────────
|
|
151
|
+
# Canonical subdirectory + filename of the OpenCode bridge plugin.
|
|
152
|
+
# Shared by setup (install + dedupe) and uninstall (tail-match removal)
|
|
153
|
+
# so both paths agree on what counts as "a bridge-plugin entry".
|
|
154
|
+
BRIDGE_PLUGIN_SUBDIR: tuple[str, str] = ("plugins", "ouroboros-bridge")
|
|
155
|
+
BRIDGE_PLUGIN_FILENAME: str = "ouroboros-bridge.ts"
|
|
156
|
+
|
|
157
|
+
|
|
158
|
+
def is_bridge_plugin_entry(entry: object) -> bool:
|
|
159
|
+
"""Return ``True`` when *entry* refers to any bridge-plugin install.
|
|
160
|
+
|
|
161
|
+
Matches by directory-tail (``plugins/ouroboros-bridge``) + basename
|
|
162
|
+
(``ouroboros-bridge.ts``) rather than exact string equality — catches
|
|
163
|
+
stale entries from XDG reshuffles, Windows mixed separators, legacy
|
|
164
|
+
install paths, and sudo/root migrations. Setup uses this for dedupe;
|
|
165
|
+
uninstall uses it to remove stale entries, not just the exact
|
|
166
|
+
canonical path for this machine's current config layout.
|
|
167
|
+
"""
|
|
168
|
+
if not isinstance(entry, str) or not entry:
|
|
169
|
+
return False
|
|
170
|
+
# Normalise path separators so Windows entries (``\``) compare equal.
|
|
171
|
+
normalised = entry.replace("\\", "/")
|
|
172
|
+
parts = [p for p in normalised.split("/") if p]
|
|
173
|
+
if len(parts) < 3:
|
|
174
|
+
return False
|
|
175
|
+
return (
|
|
176
|
+
parts[-1] == BRIDGE_PLUGIN_FILENAME
|
|
177
|
+
and parts[-2] == BRIDGE_PLUGIN_SUBDIR[1]
|
|
178
|
+
and parts[-3] == BRIDGE_PLUGIN_SUBDIR[0]
|
|
179
|
+
)
|
|
@@ -64,10 +64,18 @@ describe("cfg — platform config dir", () => {
|
|
|
64
64
|
expect(cfg()).toBe("/home/u/.config/opencode")
|
|
65
65
|
})
|
|
66
66
|
|
|
67
|
-
test("darwin uses
|
|
67
|
+
test("darwin uses XDG-style config path", () => {
|
|
68
68
|
process.env.HOME = "/Users/u"
|
|
69
|
+
delete process.env.XDG_CONFIG_HOME
|
|
70
|
+
Object.defineProperty(process, "platform", { value: "darwin" })
|
|
71
|
+
expect(cfg()).toBe("/Users/u/.config/opencode")
|
|
72
|
+
})
|
|
73
|
+
|
|
74
|
+
test("OPENCODE_CONFIG_DIR overrides platform defaults", () => {
|
|
75
|
+
process.env.HOME = "/Users/u"
|
|
76
|
+
process.env.OPENCODE_CONFIG_DIR = "/custom/opencode"
|
|
69
77
|
Object.defineProperty(process, "platform", { value: "darwin" })
|
|
70
|
-
expect(cfg()).toBe("/
|
|
78
|
+
expect(cfg()).toBe("/custom/opencode")
|
|
71
79
|
})
|
|
72
80
|
|
|
73
81
|
test("win32 uses APPDATA when present", () => {
|
|
@@ -6,10 +6,10 @@ import { randomBytes } from "crypto"
|
|
|
6
6
|
// Platform-aware opencode config dir
|
|
7
7
|
export function cfg(): string {
|
|
8
8
|
const home = process.env.HOME ?? process.env.USERPROFILE ?? "/tmp"
|
|
9
|
+
if (process.env.OPENCODE_CONFIG_DIR)
|
|
10
|
+
return process.env.OPENCODE_CONFIG_DIR
|
|
9
11
|
if (process.platform === "win32")
|
|
10
12
|
return join(process.env.APPDATA ?? join(home, "AppData", "Roaming"), "OpenCode")
|
|
11
|
-
if (process.platform === "darwin")
|
|
12
|
-
return join(home, "Library", "Application Support", "OpenCode")
|
|
13
13
|
return join(process.env.XDG_CONFIG_HOME ?? join(home, ".config"), "opencode")
|
|
14
14
|
}
|
|
15
15
|
|
|
@@ -557,4 +557,3 @@ export default {
|
|
|
557
557
|
|
|
558
558
|
// Test-only exports for mocked-client coverage.
|
|
559
559
|
export { resolveMid as _resolveMid, dispatch as _dispatch, patch as _patch, sleep as _sleep, PATCH_RETRIES as _PATCH_RETRIES, RESOLVE_RETRIES as _RESOLVE_RETRIES }
|
|
560
|
-
|
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
"""Unit tests for the shared opencode_config helper.
|
|
2
|
+
|
|
3
|
+
All tests patch ``opencode_config_dir`` directly so they are
|
|
4
|
+
platform-agnostic — no reliance on Linux-specific XDG paths.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
from pathlib import Path
|
|
10
|
+
from types import SimpleNamespace
|
|
11
|
+
from unittest.mock import patch
|
|
12
|
+
|
|
13
|
+
import pytest
|
|
14
|
+
|
|
15
|
+
from ouroboros.cli.opencode_config import find_opencode_config, opencode_config_dir
|
|
16
|
+
|
|
17
|
+
_OCD = "ouroboros.cli.opencode_config.opencode_config_dir"
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class TestFindOpencodeConfig:
|
|
21
|
+
"""Tests for find_opencode_config()."""
|
|
22
|
+
|
|
23
|
+
def test_prefers_jsonc_over_json(self, tmp_path: Path) -> None:
|
|
24
|
+
"""opencode.jsonc takes priority over opencode.json when both exist."""
|
|
25
|
+
config_dir = tmp_path / "opencode"
|
|
26
|
+
config_dir.mkdir()
|
|
27
|
+
jsonc = config_dir / "opencode.jsonc"
|
|
28
|
+
json_ = config_dir / "opencode.json"
|
|
29
|
+
jsonc.write_text("{}")
|
|
30
|
+
json_.write_text("{}")
|
|
31
|
+
|
|
32
|
+
with patch(_OCD, return_value=config_dir):
|
|
33
|
+
result = find_opencode_config(allow_default=True)
|
|
34
|
+
|
|
35
|
+
assert result == jsonc
|
|
36
|
+
|
|
37
|
+
def test_falls_back_to_json_when_no_jsonc(self, tmp_path: Path) -> None:
|
|
38
|
+
"""Returns opencode.json when only that file exists."""
|
|
39
|
+
config_dir = tmp_path / "opencode"
|
|
40
|
+
config_dir.mkdir()
|
|
41
|
+
json_ = config_dir / "opencode.json"
|
|
42
|
+
json_.write_text("{}")
|
|
43
|
+
|
|
44
|
+
with patch(_OCD, return_value=config_dir):
|
|
45
|
+
result = find_opencode_config(allow_default=True)
|
|
46
|
+
|
|
47
|
+
assert result == json_
|
|
48
|
+
|
|
49
|
+
def test_allow_default_true_returns_default_when_missing(self, tmp_path: Path) -> None:
|
|
50
|
+
"""Returns default opencode.json path when no config exists and allow_default=True."""
|
|
51
|
+
config_dir = tmp_path / "opencode"
|
|
52
|
+
config_dir.mkdir()
|
|
53
|
+
|
|
54
|
+
with patch(_OCD, return_value=config_dir):
|
|
55
|
+
result = find_opencode_config(allow_default=True)
|
|
56
|
+
|
|
57
|
+
assert result == config_dir / "opencode.json"
|
|
58
|
+
assert result is not None
|
|
59
|
+
|
|
60
|
+
def test_allow_default_false_returns_none_when_missing(self, tmp_path: Path) -> None:
|
|
61
|
+
"""Returns None when no config exists and allow_default=False."""
|
|
62
|
+
config_dir = tmp_path / "opencode"
|
|
63
|
+
config_dir.mkdir()
|
|
64
|
+
|
|
65
|
+
with patch(_OCD, return_value=config_dir):
|
|
66
|
+
result = find_opencode_config(allow_default=False)
|
|
67
|
+
|
|
68
|
+
assert result is None
|
|
69
|
+
|
|
70
|
+
def test_allow_default_false_returns_existing_file(self, tmp_path: Path) -> None:
|
|
71
|
+
"""Returns existing file even when allow_default=False."""
|
|
72
|
+
config_dir = tmp_path / "opencode"
|
|
73
|
+
config_dir.mkdir()
|
|
74
|
+
jsonc = config_dir / "opencode.jsonc"
|
|
75
|
+
jsonc.write_text("{}")
|
|
76
|
+
|
|
77
|
+
with patch(_OCD, return_value=config_dir):
|
|
78
|
+
result = find_opencode_config(allow_default=False)
|
|
79
|
+
|
|
80
|
+
assert result == jsonc
|
|
81
|
+
|
|
82
|
+
def test_oserror_on_candidate_is_skipped(self, tmp_path: Path) -> None:
|
|
83
|
+
"""OSError on exists() check is silently skipped — fallback continues."""
|
|
84
|
+
config_dir = tmp_path / "opencode"
|
|
85
|
+
config_dir.mkdir()
|
|
86
|
+
json_ = config_dir / "opencode.json"
|
|
87
|
+
json_.write_text("{}")
|
|
88
|
+
|
|
89
|
+
original_exists = Path.exists
|
|
90
|
+
|
|
91
|
+
def patched_exists(self: Path) -> bool:
|
|
92
|
+
if self.name == "opencode.jsonc":
|
|
93
|
+
raise OSError("permission denied")
|
|
94
|
+
return original_exists(self)
|
|
95
|
+
|
|
96
|
+
with (
|
|
97
|
+
patch(_OCD, return_value=config_dir),
|
|
98
|
+
patch.object(Path, "exists", patched_exists),
|
|
99
|
+
):
|
|
100
|
+
result = find_opencode_config(allow_default=True)
|
|
101
|
+
|
|
102
|
+
# jsonc errored, falls through to json which exists
|
|
103
|
+
assert result == json_
|
|
104
|
+
|
|
105
|
+
def test_returns_jsonc_path_type(self, tmp_path: Path) -> None:
|
|
106
|
+
"""Return value is always a Path instance (not str)."""
|
|
107
|
+
config_dir = tmp_path / "opencode"
|
|
108
|
+
config_dir.mkdir()
|
|
109
|
+
(config_dir / "opencode.jsonc").write_text("{}")
|
|
110
|
+
|
|
111
|
+
with patch(_OCD, return_value=config_dir):
|
|
112
|
+
result = find_opencode_config(allow_default=True)
|
|
113
|
+
|
|
114
|
+
assert isinstance(result, Path)
|
|
115
|
+
|
|
116
|
+
def test_honors_opencode_config_file_env(
|
|
117
|
+
self, tmp_path: Path, monkeypatch: pytest.MonkeyPatch
|
|
118
|
+
) -> None:
|
|
119
|
+
"""OPENCODE_CONFIG points setup at an explicit config file."""
|
|
120
|
+
explicit = tmp_path / "custom" / "opencode.json"
|
|
121
|
+
monkeypatch.setenv("OPENCODE_CONFIG", str(explicit))
|
|
122
|
+
|
|
123
|
+
result = find_opencode_config(allow_default=True)
|
|
124
|
+
|
|
125
|
+
assert result == explicit
|
|
126
|
+
|
|
127
|
+
def test_opencode_config_file_env_requires_existing_when_no_default(
|
|
128
|
+
self, tmp_path: Path, monkeypatch: pytest.MonkeyPatch
|
|
129
|
+
) -> None:
|
|
130
|
+
"""Uninstall-style lookup ignores a missing OPENCODE_CONFIG file."""
|
|
131
|
+
explicit = tmp_path / "missing.json"
|
|
132
|
+
monkeypatch.setenv("OPENCODE_CONFIG", str(explicit))
|
|
133
|
+
|
|
134
|
+
result = find_opencode_config(allow_default=False)
|
|
135
|
+
|
|
136
|
+
assert result is None
|
|
137
|
+
|
|
138
|
+
|
|
139
|
+
class TestOpencodeConfigDir:
|
|
140
|
+
"""Tests for active OpenCode config-directory resolution."""
|
|
141
|
+
|
|
142
|
+
def test_honors_opencode_config_dir_env(
|
|
143
|
+
self, tmp_path: Path, monkeypatch: pytest.MonkeyPatch
|
|
144
|
+
) -> None:
|
|
145
|
+
"""OPENCODE_CONFIG_DIR is the strongest explicit directory override."""
|
|
146
|
+
custom = tmp_path / "custom-opencode"
|
|
147
|
+
monkeypatch.setenv("OPENCODE_CONFIG_DIR", str(custom))
|
|
148
|
+
|
|
149
|
+
result = opencode_config_dir()
|
|
150
|
+
|
|
151
|
+
assert result == custom
|
|
152
|
+
|
|
153
|
+
def test_uses_debug_paths_config_when_available(
|
|
154
|
+
self, tmp_path: Path, monkeypatch: pytest.MonkeyPatch
|
|
155
|
+
) -> None:
|
|
156
|
+
"""The OpenCode CLI-reported config dir is authoritative."""
|
|
157
|
+
reported = tmp_path / ".config" / "opencode"
|
|
158
|
+
monkeypatch.delenv("OPENCODE_CONFIG_DIR", raising=False)
|
|
159
|
+
monkeypatch.setenv("OUROBOROS_OPENCODE_CLI_PATH", "/bin/opencode")
|
|
160
|
+
monkeypatch.delenv("OPENCODE_CLI_PATH", raising=False)
|
|
161
|
+
|
|
162
|
+
completed = SimpleNamespace(
|
|
163
|
+
returncode=0,
|
|
164
|
+
stdout=f"home {tmp_path}\nconfig {reported}\nstate {tmp_path / '.state'}\n",
|
|
165
|
+
)
|
|
166
|
+
with patch("ouroboros.cli.opencode_config.subprocess.run", return_value=completed) as run:
|
|
167
|
+
result = opencode_config_dir()
|
|
168
|
+
|
|
169
|
+
assert result == reported
|
|
170
|
+
run.assert_called_once()
|
|
171
|
+
assert run.call_args.args[0][:3] == ["/bin/opencode", "debug", "paths"]
|
|
172
|
+
|
|
173
|
+
def test_uses_persisted_opencode_cli_path_for_debug_paths(
|
|
174
|
+
self, tmp_path: Path, monkeypatch: pytest.MonkeyPatch
|
|
175
|
+
) -> None:
|
|
176
|
+
"""Post-setup cleanup/uninstall use the configured OpenCode binary."""
|
|
177
|
+
reported = tmp_path / "active" / "opencode"
|
|
178
|
+
config_dir = tmp_path / ".ouroboros"
|
|
179
|
+
config_dir.mkdir()
|
|
180
|
+
(config_dir / "config.yaml").write_text(
|
|
181
|
+
"orchestrator:\n opencode_cli_path: /configured/bin/opencode\n",
|
|
182
|
+
encoding="utf-8",
|
|
183
|
+
)
|
|
184
|
+
monkeypatch.delenv("OPENCODE_CONFIG_DIR", raising=False)
|
|
185
|
+
monkeypatch.delenv("OUROBOROS_OPENCODE_CLI_PATH", raising=False)
|
|
186
|
+
monkeypatch.delenv("OPENCODE_CLI_PATH", raising=False)
|
|
187
|
+
|
|
188
|
+
completed = SimpleNamespace(returncode=0, stdout=f"config {reported}\n")
|
|
189
|
+
with (
|
|
190
|
+
patch("pathlib.Path.home", return_value=tmp_path),
|
|
191
|
+
patch("ouroboros.cli.opencode_config.subprocess.run", return_value=completed) as run,
|
|
192
|
+
):
|
|
193
|
+
result = opencode_config_dir()
|
|
194
|
+
|
|
195
|
+
assert result == reported
|
|
196
|
+
assert run.call_args.args[0][:3] == ["/configured/bin/opencode", "debug", "paths"]
|
|
197
|
+
|
|
198
|
+
def test_does_not_query_path_opencode_without_configured_cli(
|
|
199
|
+
self, tmp_path: Path, monkeypatch: pytest.MonkeyPatch
|
|
200
|
+
) -> None:
|
|
201
|
+
"""Avoid targeting a different OpenCode install from PATH after setup."""
|
|
202
|
+
monkeypatch.delenv("OPENCODE_CONFIG_DIR", raising=False)
|
|
203
|
+
monkeypatch.delenv("OUROBOROS_OPENCODE_CLI_PATH", raising=False)
|
|
204
|
+
monkeypatch.delenv("OPENCODE_CLI_PATH", raising=False)
|
|
205
|
+
monkeypatch.delenv("XDG_CONFIG_HOME", raising=False)
|
|
206
|
+
|
|
207
|
+
with (
|
|
208
|
+
patch("pathlib.Path.home", return_value=tmp_path),
|
|
209
|
+
patch("ouroboros.cli.opencode_config.subprocess.run") as run,
|
|
210
|
+
):
|
|
211
|
+
result = opencode_config_dir()
|
|
212
|
+
|
|
213
|
+
assert result == tmp_path / ".config" / "opencode"
|
|
214
|
+
run.assert_not_called()
|
|
215
|
+
|
|
216
|
+
def test_darwin_defaults_to_xdg_config_path(
|
|
217
|
+
self, tmp_path: Path, monkeypatch: pytest.MonkeyPatch
|
|
218
|
+
) -> None:
|
|
219
|
+
"""Modern OpenCode uses XDG config on macOS, not Application Support."""
|
|
220
|
+
monkeypatch.delenv("OPENCODE_CONFIG_DIR", raising=False)
|
|
221
|
+
monkeypatch.delenv("XDG_CONFIG_HOME", raising=False)
|
|
222
|
+
|
|
223
|
+
with (
|
|
224
|
+
patch("ouroboros.cli.opencode_config.sys.platform", "darwin"),
|
|
225
|
+
patch("pathlib.Path.home", return_value=tmp_path),
|
|
226
|
+
):
|
|
227
|
+
result = opencode_config_dir()
|
|
228
|
+
|
|
229
|
+
assert result == tmp_path / ".config" / "opencode"
|
|
230
|
+
|
|
231
|
+
def test_darwin_honors_xdg_config_home(
|
|
232
|
+
self, tmp_path: Path, monkeypatch: pytest.MonkeyPatch
|
|
233
|
+
) -> None:
|
|
234
|
+
"""XDG_CONFIG_HOME applies on macOS as it does on Linux."""
|
|
235
|
+
xdg = tmp_path / "xdg"
|
|
236
|
+
monkeypatch.delenv("OPENCODE_CONFIG_DIR", raising=False)
|
|
237
|
+
monkeypatch.setenv("XDG_CONFIG_HOME", str(xdg))
|
|
238
|
+
|
|
239
|
+
with (
|
|
240
|
+
patch("ouroboros.cli.opencode_config.sys.platform", "darwin"),
|
|
241
|
+
):
|
|
242
|
+
result = opencode_config_dir()
|
|
243
|
+
|
|
244
|
+
assert result == xdg / "opencode"
|