ouroboros-ai 0.26.2.dev37__tar.gz → 0.26.2.dev38__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.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/PKG-INFO +1 -1
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/scripts/install.sh +5 -7
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/skills/pm/SKILL.md +20 -1
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/skills/setup/SKILL.md +39 -10
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/skills/update/SKILL.md +31 -9
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/_version.py +2 -2
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/cli/commands/setup.py +100 -52
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/cli/test_setup.py +164 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/.claude/settings.json +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/.claude-plugin/.mcp.json +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/.claude-plugin/marketplace.json +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/.claude-plugin/plugin.json +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/.env.example +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/.github/ISSUE_TEMPLATE/question.yml +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/.github/workflows/dev-publish.yml +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/.github/workflows/lint.yml +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/.github/workflows/release.yml +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/.github/workflows/test.yml +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/.gitignore +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/.mcp.json +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/.ouroboros/mechanical.toml +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/.pre-commit-config.yaml +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/.python-version +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/CHANGELOG.md +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/CLAUDE.md +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/CODE_OF_CONDUCT.md +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/CONTRIBUTING.md +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/HANDOFF.md +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/LICENSE +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/README.ko.md +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/README.md +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/SECURITY.md +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/commands/cancel.md +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/commands/evaluate.md +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/commands/evolve.md +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/commands/help.md +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/commands/interview.md +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/commands/ralph.md +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/commands/run.md +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/commands/seed.md +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/commands/setup.md +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/commands/status.md +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/commands/tutorial.md +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/commands/unstuck.md +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/commands/welcome.md +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/crates/ouroboros-tui/.gitignore +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/crates/ouroboros-tui/Cargo.lock +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/crates/ouroboros-tui/Cargo.toml +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/crates/ouroboros-tui/README.md +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/crates/ouroboros-tui/src/db.rs +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/crates/ouroboros-tui/src/main.rs +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/crates/ouroboros-tui/src/mock.rs +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/crates/ouroboros-tui/src/state.rs +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/crates/ouroboros-tui/src/views/dashboard.rs +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/crates/ouroboros-tui/src/views/execution.rs +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/crates/ouroboros-tui/src/views/lineage.rs +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/crates/ouroboros-tui/src/views/logs.rs +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/crates/ouroboros-tui/src/views/mod.rs +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/crates/ouroboros-tui/src/views/session_selector.rs +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/docs/README.md +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/docs/api/README.md +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/docs/api/core.md +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/docs/api/mcp.md +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/docs/architecture.md +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/docs/cli-reference.md +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/docs/config-reference.md +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/docs/contributing/architecture-overview.md +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/docs/contributing/findings-registry.md +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/docs/contributing/issue-quality-policy.md +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/docs/contributing/key-patterns.md +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/docs/contributing/testing-guide.md +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/docs/examples/mcp-config.yaml +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/docs/getting-started.md +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/docs/guides/evaluation-pipeline.md +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/docs/guides/evolution-loop.md +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/docs/guides/issue-176-subagent-mcp-inheritance.md +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/docs/guides/seed-authoring.md +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/docs/guides/tui-usage.md +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/docs/images/PLACEHOLDER_README.md +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/docs/images/ouroboros.png +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/docs/platform-support.md +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/docs/runtime-capability-matrix.md +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/docs/runtime-guides/claude-code.md +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/docs/runtime-guides/codex.md +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/examples/coordinator_test_seed.yaml +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/examples/dummy_seed.yaml +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/examples/parallel_subac_test_seed.yaml +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/examples/subac_test_seed.yaml +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/examples/task_manager/README.md +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/examples/task_manager/__init__.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/examples/task_manager/__main__.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/examples/task_manager/cli.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/examples/task_manager/models.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/examples/task_manager/storage.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/examples/test_display.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/hooks/hooks.json +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/llms-full.txt +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/llms.txt +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/project-context.md +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/pyproject.toml +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/scripts/drift-monitor.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/scripts/keyword-detector.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/scripts/mcp-serve.sh +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/scripts/ralph-rewind.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/scripts/ralph.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/scripts/ralph.sh +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/scripts/session-start.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/scripts/sync-plugin-version.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/scripts/version-check.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/skills/brownfield/SKILL.md +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/skills/cancel/SKILL.md +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/skills/evaluate/SKILL.md +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/skills/evolve/SKILL.md +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/skills/help/SKILL.md +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/skills/interview/SKILL.md +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/skills/qa/SKILL.md +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/skills/ralph/SKILL.md +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/skills/run/SKILL.md +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/skills/seed/SKILL.md +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/skills/status/SKILL.md +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/skills/tutorial/SKILL.md +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/skills/unstuck/SKILL.md +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/skills/welcome/SKILL.md +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/__init__.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/__main__.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/agents/__init__.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/agents/advocate.md +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/agents/analysis-agent.md +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/agents/architect.md +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/agents/breadth-keeper.md +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/agents/code-executor.md +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/agents/codebase-explorer.md +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/agents/consensus-reviewer.md +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/agents/contrarian.md +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/agents/evaluator.md +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/agents/hacker.md +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/agents/judge.md +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/agents/loader.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/agents/ontologist.md +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/agents/ontology-analyst.md +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/agents/qa-judge.md +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/agents/research-agent.md +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/agents/researcher.md +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/agents/seed-architect.md +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/agents/seed-closer.md +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/agents/semantic-evaluator.md +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/agents/simplifier.md +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/agents/socratic-interviewer.md +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/bigbang/__init__.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/bigbang/ambiguity.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/bigbang/brownfield.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/bigbang/explore.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/bigbang/interview.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/bigbang/pm_document.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/bigbang/pm_interview.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/bigbang/pm_seed.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/bigbang/question_classifier.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/bigbang/seed_generator.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/cli/__init__.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/cli/commands/__init__.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/cli/commands/cancel.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/cli/commands/config.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/cli/commands/init.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/cli/commands/mcp.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/cli/commands/pm.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/cli/commands/run.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/cli/commands/status.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/cli/commands/tui.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/cli/formatters/__init__.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/cli/formatters/panels.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/cli/formatters/progress.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/cli/formatters/tables.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/cli/formatters/workflow_display.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/cli/main.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/codex/__init__.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/codex/artifacts.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/codex/ouroboros.md +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/codex_permissions.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/config/__init__.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/config/loader.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/config/models.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/core/__init__.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/core/ac_tree.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/core/context.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/core/errors.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/core/file_lock.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/core/git_workflow.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/core/lineage.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/core/ontology_aspect.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/core/ontology_questions.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/core/project_paths.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/core/security.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/core/seed.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/core/text.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/core/types.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/core/worktree.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/evaluation/__init__.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/evaluation/artifact_collector.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/evaluation/consensus.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/evaluation/json_utils.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/evaluation/languages.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/evaluation/mechanical.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/evaluation/models.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/evaluation/pipeline.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/evaluation/semantic.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/evaluation/trigger.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/evaluation/verification_artifacts.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/events/__init__.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/events/base.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/events/decomposition.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/events/evaluation.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/events/interview.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/events/lineage.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/events/ontology.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/evolution/__init__.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/evolution/convergence.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/evolution/loop.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/evolution/projector.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/evolution/reflect.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/evolution/regression.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/evolution/wonder.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/execution/__init__.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/execution/atomicity.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/execution/decomposition.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/execution/double_diamond.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/execution/subagent.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/mcp/__init__.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/mcp/client/__init__.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/mcp/client/adapter.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/mcp/client/manager.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/mcp/client/protocol.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/mcp/errors.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/mcp/job_manager.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/mcp/resources/__init__.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/mcp/resources/handlers.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/mcp/server/__init__.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/mcp/server/adapter.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/mcp/server/protocol.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/mcp/server/security.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/mcp/tools/__init__.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/mcp/tools/authoring_handlers.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/mcp/tools/brownfield_handler.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/mcp/tools/dashboard.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/mcp/tools/definitions.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/mcp/tools/evaluation_handlers.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/mcp/tools/evolution_handlers.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/mcp/tools/execution_handlers.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/mcp/tools/job_handlers.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/mcp/tools/pm_handler.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/mcp/tools/qa.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/mcp/tools/query_handlers.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/mcp/tools/registry.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/mcp/types.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/observability/__init__.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/observability/drift.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/observability/logging.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/observability/retrospective.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/orchestrator/__init__.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/orchestrator/adapter.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/orchestrator/codex_cli_runtime.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/orchestrator/command_dispatcher.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/orchestrator/coordinator.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/orchestrator/dependency_analyzer.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/orchestrator/events.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/orchestrator/execution_runtime_scope.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/orchestrator/execution_strategy.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/orchestrator/heartbeat.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/orchestrator/level_context.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/orchestrator/mcp_config.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/orchestrator/mcp_tools.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/orchestrator/parallel_executor.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/orchestrator/parallel_executor_models.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/orchestrator/runner.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/orchestrator/runtime_factory.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/orchestrator/runtime_message_projection.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/orchestrator/session.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/orchestrator/workflow_state.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/persistence/__init__.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/persistence/brownfield.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/persistence/checkpoint.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/persistence/event_store.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/persistence/migrations/__init__.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/persistence/migrations/runner.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/persistence/migrations/scripts/001_initial.sql +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/persistence/migrations/scripts/002_brownfield.sql +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/persistence/schema.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/persistence/uow.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/plugin/__init__.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/plugin/agents/__init__.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/plugin/agents/pool.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/plugin/agents/registry.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/plugin/orchestration/__init__.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/plugin/orchestration/router.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/plugin/orchestration/scheduler.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/plugin/skills/__init__.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/plugin/skills/docs.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/plugin/skills/executor.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/plugin/skills/keywords.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/plugin/skills/registry.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/pm/__init__.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/pm/renderer.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/providers/__init__.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/providers/anthropic_adapter.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/providers/base.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/providers/claude_code_adapter.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/providers/codex_cli_adapter.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/providers/codex_cli_stream.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/providers/factory.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/providers/litellm_adapter.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/py.typed +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/resilience/__init__.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/resilience/lateral.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/resilience/stagnation.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/routing/__init__.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/routing/complexity.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/routing/downgrade.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/routing/escalation.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/routing/router.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/routing/tiers.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/secondary/__init__.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/secondary/scheduler.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/secondary/todo_registry.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/strategies/__init__.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/strategies/devil_advocate.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/tui/__init__.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/tui/app.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/tui/components/__init__.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/tui/components/agents_panel.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/tui/components/event_log.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/tui/components/progress.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/tui/components/token_tracker.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/tui/events.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/tui/screens/__init__.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/tui/screens/confirm_rewind.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/tui/screens/dashboard.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/tui/screens/dashboard_v2.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/tui/screens/dashboard_v3.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/tui/screens/debug.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/tui/screens/execution.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/tui/screens/hud_dashboard.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/tui/screens/lineage_detail.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/tui/screens/lineage_selector.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/tui/screens/logs.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/tui/screens/session_selector.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/tui/widgets/__init__.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/tui/widgets/ac_progress.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/tui/widgets/ac_tree.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/tui/widgets/agent_activity.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/tui/widgets/cost_tracker.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/tui/widgets/drift_meter.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/tui/widgets/lineage_tree.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/tui/widgets/parallel_graph.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/tui/widgets/phase_progress.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/verification/__init__.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/verification/extractor.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/verification/models.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/verification/verifier.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/__init__.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/conftest.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/e2e/__init__.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/e2e/conftest.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/e2e/test_cli_commands.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/e2e/test_full_workflow.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/e2e/test_session_persistence.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/fixtures/test_atomicity_seed.yml +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/integration/__init__.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/integration/conftest.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/integration/mcp/__init__.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/integration/mcp/conftest.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/integration/mcp/test_client_adapter.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/integration/mcp/test_client_manager.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/integration/mcp/test_server_adapter.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/integration/plugin/test_orchestration.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/integration/test_codex_cli_passthrough_smoke.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/integration/test_codex_skill_fallback.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/integration/test_codex_skill_smoke.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/integration/test_entry_point.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/__init__.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/agents/__init__.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/agents/test_loader.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/bigbang/__init__.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/bigbang/test_ambiguity.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/bigbang/test_brownfield.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/bigbang/test_classifier_context.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/bigbang/test_decide_later_items.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/bigbang/test_explore.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/bigbang/test_interview.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/bigbang/test_pm_document_generator.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/bigbang/test_pm_document_writer.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/bigbang/test_pm_interview.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/bigbang/test_pm_interview_brownfield_db.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/bigbang/test_pm_seed_ac12.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/bigbang/test_pm_seed_save.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/bigbang/test_question_classifier.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/bigbang/test_seed_generator.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/cli/__init__.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/cli/formatters/__init__.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/cli/formatters/test_console.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/cli/formatters/test_panels.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/cli/formatters/test_progress.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/cli/formatters/test_tables.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/cli/formatters/test_workflow_display.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/cli/test_cancel.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/cli/test_init_pm_seed_detection.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/cli/test_init_runtime.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/cli/test_main.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/cli/test_mcp_nested_guard.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/cli/test_mcp_startup_cleanup.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/cli/test_pm_brownfield.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/cli/test_pm_overwrite.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/cli/test_pm_select_repos.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/cli/test_run_qa.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/config/__init__.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/config/test_loader.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/config/test_models.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/core/__init__.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/core/test_ac_tree.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/core/test_context.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/core/test_errors.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/core/test_git_workflow.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/core/test_lineage.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/core/test_ontology_aspect.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/core/test_ontology_questions.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/core/test_security.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/core/test_seed.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/core/test_types.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/core/test_worktree.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/evaluation/__init__.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/evaluation/test_consensus.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/evaluation/test_json_utils.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/evaluation/test_languages.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/evaluation/test_mechanical.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/evaluation/test_models.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/evaluation/test_semantic.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/evaluation/test_trigger.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/evaluation/test_verification_artifacts.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/events/__init__.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/events/test_base.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/events/test_decomposition_events.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/evolution/test_wonder_scope.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/execution/__init__.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/execution/test_atomicity.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/execution/test_decomposition.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/execution/test_double_diamond.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/execution/test_subagent_isolation.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/mcp/__init__.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/mcp/client/__init__.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/mcp/client/test_adapter.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/mcp/client/test_manager.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/mcp/conftest.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/mcp/server/__init__.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/mcp/server/test_adapter.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/mcp/server/test_security.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/mcp/test_errors.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/mcp/test_job_manager.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/mcp/test_types.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/mcp/tools/__init__.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/mcp/tools/conftest.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/mcp/tools/test_brownfield_handler.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/mcp/tools/test_definitions.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/mcp/tools/test_pm_handler.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/mcp/tools/test_pm_handler_generate.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/mcp/tools/test_pm_handler_pending_reframe.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/mcp/tools/test_qa_integration.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/mcp/tools/test_registry.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/observability/__init__.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/observability/test_drift.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/observability/test_logging.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/observability/test_retrospective.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/orchestrator/__init__.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/orchestrator/test_adapter.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/orchestrator/test_codex_cli_runtime.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/orchestrator/test_codex_recursion_guard.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/orchestrator/test_command_dispatcher.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/orchestrator/test_coordinator.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/orchestrator/test_dependency_analyzer.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/orchestrator/test_events.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/orchestrator/test_execution_runtime_scope.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/orchestrator/test_execution_strategy.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/orchestrator/test_inflight_cancellation.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/orchestrator/test_level_context.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/orchestrator/test_mcp_config.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/orchestrator/test_mcp_tools.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/orchestrator/test_parallel_executor.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/orchestrator/test_parallel_executor_retry_resume.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/orchestrator/test_runner.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/orchestrator/test_runner_cancellation.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/orchestrator/test_runtime_factory.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/orchestrator/test_runtime_message_projection.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/orchestrator/test_session.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/orchestrator/test_workflow_state.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/persistence/__init__.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/persistence/test_brownfield_store.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/persistence/test_checkpoint.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/persistence/test_event_store.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/persistence/test_schema.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/persistence/test_uow.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/plugin/__init__.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/plugin/agents/__init__.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/plugin/agents/test_registry.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/plugin/orchestration/__init__.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/plugin/orchestration/test_model_router.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/plugin/skills/__init__.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/plugin/skills/test_keywords.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/plugin/skills/test_registry.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/pm/__init__.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/pm/test_renderer.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/providers/__init__.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/providers/test_base.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/providers/test_claude_code_adapter.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/providers/test_codex_cli_adapter.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/providers/test_factory.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/providers/test_litellm_adapter.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/resilience/__init__.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/resilience/test_lateral.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/resilience/test_stagnation.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/routing/__init__.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/routing/test_complexity.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/routing/test_downgrade.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/routing/test_escalation.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/routing/test_router.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/routing/test_tiers.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/scripts/test_keyword_detector.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/scripts/test_version_check.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/secondary/__init__.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/secondary/test_scheduler.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/secondary/test_todo_registry.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/test_artifact_collector.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/test_codex_artifacts.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/test_convergence.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/test_dashboard.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/test_dependencies_configured.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/test_evolve_rewind.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/test_evolve_step.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/test_graceful_shutdown.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/test_main_entry_point.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/test_module_structure.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/test_project_initialization.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/test_projector_rewind.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/test_ralph_parser.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/test_ralph_rewind.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/test_regression.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/test_tooling_configuration.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/test_verification.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/tui/__init__.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/tui/test_app.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/tui/test_cancelled_display.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/tui/test_events.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/tui/test_lineage_viewer.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/tui/test_screens.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/tui/test_session_selector_replay.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/tui/test_widgets.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tools/sync_github_project.py +0 -0
- {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/uv.lock +0 -0
|
@@ -140,11 +140,9 @@ if [ "$HAS_UV" = true ]; then
|
|
|
140
140
|
elif [ "$HAS_PIPX" = true ]; then
|
|
141
141
|
INSTALL_METHOD="pipx"
|
|
142
142
|
if [ -n "$PRE_FLAG" ]; then
|
|
143
|
-
pipx install --pip-args='--pre' "$INSTALL_SPEC"
|
|
144
|
-
|| pipx upgrade --pip-args='--pre' "$INSTALL_SPEC"
|
|
143
|
+
pipx install --force --pip-args='--pre' "$INSTALL_SPEC"
|
|
145
144
|
else
|
|
146
|
-
pipx install "$INSTALL_SPEC"
|
|
147
|
-
|| pipx upgrade "$INSTALL_SPEC"
|
|
145
|
+
pipx install --force "$INSTALL_SPEC"
|
|
148
146
|
fi
|
|
149
147
|
else
|
|
150
148
|
INSTALL_METHOD="pip"
|
|
@@ -184,11 +182,11 @@ if command -v claude &>/dev/null; then
|
|
|
184
182
|
|
|
185
183
|
# MCP command matches the installer that actually ran in step 3
|
|
186
184
|
if [ "$INSTALL_METHOD" = "uv" ]; then
|
|
187
|
-
OUROBOROS_ENTRY='{"command":"uvx","args":["--from","ouroboros-ai[claude]","ouroboros","mcp","serve"]
|
|
185
|
+
OUROBOROS_ENTRY='{"command":"uvx","args":["--from","ouroboros-ai[claude]","ouroboros","mcp","serve"]}'
|
|
188
186
|
elif [ "$INSTALL_METHOD" = "pipx" ]; then
|
|
189
|
-
OUROBOROS_ENTRY='{"command":"ouroboros","args":["mcp","serve"]
|
|
187
|
+
OUROBOROS_ENTRY='{"command":"ouroboros","args":["mcp","serve"]}'
|
|
190
188
|
else
|
|
191
|
-
OUROBOROS_ENTRY='{"command":"python3","args":["-m","ouroboros","mcp","serve"]
|
|
189
|
+
OUROBOROS_ENTRY='{"command":"python3","args":["-m","ouroboros","mcp","serve"]}'
|
|
192
190
|
fi
|
|
193
191
|
|
|
194
192
|
# Find a working Python: system python3, or uv-managed python
|
|
@@ -15,7 +15,26 @@ PM-focused Socratic interview that produces a Product Requirements Document.
|
|
|
15
15
|
ToolSearch query: "+ouroboros pm_interview"
|
|
16
16
|
```
|
|
17
17
|
|
|
18
|
-
If not found →
|
|
18
|
+
If not found → **diagnose before telling user to run setup**:
|
|
19
|
+
|
|
20
|
+
1. Check if MCP is already configured:
|
|
21
|
+
```bash
|
|
22
|
+
grep -q '"ouroboros"' ~/.claude/mcp.json 2>/dev/null && echo "CONFIGURED" || echo "NOT_CONFIGURED"
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
2. **If NOT_CONFIGURED** → tell user to run `ooo setup` first. Stop.
|
|
26
|
+
|
|
27
|
+
3. **If CONFIGURED** → MCP is registered but the server isn't connecting. Do NOT tell the user to run `ooo setup` again. Instead show:
|
|
28
|
+
```
|
|
29
|
+
Ouroboros MCP is configured but not connected.
|
|
30
|
+
|
|
31
|
+
Try these steps in order:
|
|
32
|
+
1. Restart Claude Code (Cmd+Shift+P → "Reload Window" or close/reopen terminal)
|
|
33
|
+
2. Check MCP status: type /mcp in Claude Code
|
|
34
|
+
3. If ouroboros shows "error", try: ooo update
|
|
35
|
+
4. If still failing, re-run: ooo setup
|
|
36
|
+
```
|
|
37
|
+
Stop.
|
|
19
38
|
|
|
20
39
|
### Step 2: Start Interview
|
|
21
40
|
|
|
@@ -123,16 +123,44 @@ Runtime backend [✓] Detected
|
|
|
123
123
|
|
|
124
124
|
| Environment | Mode | Action |
|
|
125
125
|
|:------------|:-----|:-------|
|
|
126
|
-
| uvx +
|
|
127
|
-
|
|
|
126
|
+
| uvx + Python >= 3.12 | **Ready** | Proceed to MCP registration (uvx mode — extras always included) |
|
|
127
|
+
| No uvx + `ouroboros` binary in PATH | **Check deps** | Verify `[claude]` extras, then proceed (binary mode) |
|
|
128
|
+
| No uvx + Python >= 3.12 + `python3 -m ouroboros` works | **Check deps** | Verify `[claude]` extras, then proceed (pip mode) |
|
|
128
129
|
| uvx + Python < 3.12 only | **Install needed** | Run `uv python install 3.12` then proceed |
|
|
129
|
-
| No uvx | **Install needed** |
|
|
130
|
+
| No uvx + no ouroboros binary + no pip package | **Install needed** | Install uv first, then proceed |
|
|
130
131
|
|
|
131
|
-
**
|
|
132
|
+
**For binary/pip modes — verify `[claude]` extras are installed:**
|
|
133
|
+
|
|
134
|
+
Check method depends on how ouroboros was installed:
|
|
135
|
+
```bash
|
|
136
|
+
# Detect install method
|
|
137
|
+
pipx list 2>/dev/null | grep -q ouroboros && echo "PIPX" || echo "NOT_PIPX"
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
- **pipx users** (binary mode, installed via pipx):
|
|
141
|
+
```bash
|
|
142
|
+
pipx runpip ouroboros-ai show claude-agent-sdk 2>/dev/null && echo "DEPS_OK" || echo "DEPS_MISSING"
|
|
143
|
+
```
|
|
144
|
+
If `DEPS_MISSING`: `pipx install --force ouroboros-ai[claude]`
|
|
145
|
+
|
|
146
|
+
- **pip users** (pip mode):
|
|
147
|
+
```bash
|
|
148
|
+
python3 -c "import claude_agent_sdk" 2>/dev/null && echo "DEPS_OK" || echo "DEPS_MISSING"
|
|
149
|
+
```
|
|
150
|
+
If `DEPS_MISSING`: `python3 -m pip install ouroboros-ai[claude]`
|
|
151
|
+
|
|
152
|
+
If deps are missing and the user doesn't want to fix manually, recommend uvx:
|
|
153
|
+
```
|
|
154
|
+
Or install uvx (recommended — handles deps automatically):
|
|
155
|
+
curl -LsSf https://astral.sh/uv/install.sh | sh
|
|
156
|
+
Then re-run: ooo setup
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
**IMPORTANT**: The MCP server requires one of: (1) uvx, (2) ouroboros binary in PATH, or (3) ouroboros pip-installed. For options 2 and 3, the `[claude]` extra must also be installed. If none are available, guide the user to install uv — do NOT write a non-working fallback to mcp.json.
|
|
132
160
|
|
|
133
161
|
**If prerequisites are missing, show:**
|
|
134
162
|
```
|
|
135
|
-
Ouroboros requires
|
|
163
|
+
Ouroboros requires uvx (recommended) or the ouroboros package installed.
|
|
136
164
|
|
|
137
165
|
Quick install (< 1 minute):
|
|
138
166
|
curl -LsSf https://astral.sh/uv/install.sh | sh
|
|
@@ -173,12 +201,13 @@ This enables:
|
|
|
173
201
|
|
|
174
202
|
**Automatically create or update `~/.claude/mcp.json`** (user-level, works across all projects).
|
|
175
203
|
|
|
176
|
-
Choose the MCP command based on how ouroboros is installed:
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
-
|
|
204
|
+
Choose the MCP command based on how ouroboros is installed (check in order):
|
|
205
|
+
1. If `which uvx` succeeds: `{"command": "uvx", "args": ["--from", "ouroboros-ai[claude]", "ouroboros", "mcp", "serve"]}`
|
|
206
|
+
2. If `which ouroboros` succeeds: `{"command": "ouroboros", "args": ["mcp", "serve"]}`
|
|
207
|
+
3. If `python3 -c "import ouroboros"` succeeds: `{"command": "python3", "args": ["-m", "ouroboros", "mcp", "serve"]}`
|
|
208
|
+
4. If none of the above → **do NOT write to mcp.json**. Instead show the prerequisites message from Step 1 and stop.
|
|
180
209
|
|
|
181
|
-
If `~/.claude/mcp.json` already exists,
|
|
210
|
+
If `~/.claude/mcp.json` already exists, read it, **always overwrite the `ouroboros` key** with the entry above (to fix stale args from older versions), and preserve all other server entries.
|
|
182
211
|
|
|
183
212
|
**Celebration Checkpoint 2:**
|
|
184
213
|
```
|
|
@@ -80,38 +80,46 @@ When the user invokes this skill:
|
|
|
80
80
|
|
|
81
81
|
4. **Run update** (if user chose to update):
|
|
82
82
|
|
|
83
|
-
a. **Update PyPI package** — detect the original install method and
|
|
83
|
+
a. **Update PyPI package** — detect the original install method and preserve `[claude]` extras:
|
|
84
84
|
|
|
85
|
-
Check which installer was used
|
|
85
|
+
Check which installer was used:
|
|
86
86
|
```bash
|
|
87
87
|
uv tool list 2>/dev/null | grep -q ouroboros && echo "uv"
|
|
88
88
|
pipx list 2>/dev/null | grep -q ouroboros && echo "pipx"
|
|
89
89
|
```
|
|
90
90
|
|
|
91
|
+
> This skill runs inside Claude Code, so always use `ouroboros-ai[claude]`
|
|
92
|
+
> (includes `claude-agent-sdk` and `anthropic` required for MCP tools).
|
|
93
|
+
|
|
91
94
|
- If installed via **uv tool** (most common with install.sh):
|
|
92
95
|
```bash
|
|
93
96
|
# For pre-release targets:
|
|
94
|
-
uv tool install --upgrade --prerelease=allow ouroboros-ai
|
|
97
|
+
uv tool install --upgrade --prerelease=allow ouroboros-ai[claude]
|
|
95
98
|
# For stable targets:
|
|
96
|
-
uv tool install --upgrade ouroboros-ai
|
|
99
|
+
uv tool install --upgrade ouroboros-ai[claude]
|
|
97
100
|
```
|
|
98
101
|
|
|
99
102
|
- If installed via **pipx**:
|
|
103
|
+
> `pipx upgrade` cannot add extras to an existing venv — use `install --force` to reinstall with extras.
|
|
100
104
|
```bash
|
|
101
105
|
# For pre-release targets:
|
|
102
|
-
pipx
|
|
106
|
+
pipx install --force --pip-args='--pre' ouroboros-ai[claude]
|
|
103
107
|
# For stable targets:
|
|
104
|
-
pipx
|
|
108
|
+
pipx install --force ouroboros-ai[claude]
|
|
105
109
|
```
|
|
106
110
|
|
|
107
111
|
- If installed via **pip** (fallback):
|
|
108
112
|
```bash
|
|
109
113
|
# For pre-release targets:
|
|
110
|
-
python3 -m pip install --upgrade --pre ouroboros-ai
|
|
114
|
+
python3 -m pip install --upgrade --pre ouroboros-ai[claude]
|
|
111
115
|
# For stable targets:
|
|
112
|
-
python3 -m pip install --upgrade ouroboros-ai
|
|
116
|
+
python3 -m pip install --upgrade ouroboros-ai[claude]
|
|
113
117
|
```
|
|
114
118
|
|
|
119
|
+
> **Note**: The `[claude]` extra is critical — it installs `claude-agent-sdk` and
|
|
120
|
+
> `anthropic` which are required for MCP tool execution. Omitting it causes MCP
|
|
121
|
+
> tools to fail silently at call time.
|
|
122
|
+
|
|
115
123
|
b. **Update runtime integration**:
|
|
116
124
|
|
|
117
125
|
For Claude Code:
|
|
@@ -125,7 +133,21 @@ When the user invokes this skill:
|
|
|
125
133
|
ouroboros setup --runtime codex --non-interactive
|
|
126
134
|
```
|
|
127
135
|
|
|
128
|
-
c. **
|
|
136
|
+
c. **Refresh MCP server config** (fixes stale args from older versions):
|
|
137
|
+
|
|
138
|
+
Run the same setup command used in step b to ensure MCP config is current:
|
|
139
|
+
|
|
140
|
+
For Claude Code:
|
|
141
|
+
```bash
|
|
142
|
+
ouroboros setup --runtime claude --non-interactive
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
For Codex CLI (already handled by step b above — skip this step).
|
|
146
|
+
|
|
147
|
+
This ensures `~/.claude/mcp.json` has the latest MCP command and args
|
|
148
|
+
(e.g., `ouroboros-ai[claude]` extras). Skips if already up to date.
|
|
149
|
+
|
|
150
|
+
d. **Verify and update CLAUDE.md version marker**:
|
|
129
151
|
```bash
|
|
130
152
|
NEW_VERSION=$(ouroboros --version 2>/dev/null | grep -oE '[0-9]+\.[0-9]+\.[0-9]+[a-z0-9.]*')
|
|
131
153
|
echo "Installed: v$NEW_VERSION"
|
|
@@ -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.26.2.
|
|
22
|
-
__version_tuple__ = version_tuple = (0, 26, 2, '
|
|
21
|
+
__version__ = version = '0.26.2.dev38'
|
|
22
|
+
__version_tuple__ = version_tuple = (0, 26, 2, 'dev38')
|
|
23
23
|
|
|
24
24
|
__commit_id__ = commit_id = None
|
|
@@ -32,6 +32,101 @@ from ouroboros.cli.formatters.panels import (
|
|
|
32
32
|
)
|
|
33
33
|
from ouroboros.persistence.brownfield import BrownfieldStore
|
|
34
34
|
|
|
35
|
+
# Canonical MCP args for Claude Code uvx installs — single source of truth.
|
|
36
|
+
_CLAUDE_UVX_ARGS: list[str] = [
|
|
37
|
+
"--from",
|
|
38
|
+
"ouroboros-ai[claude]",
|
|
39
|
+
"ouroboros",
|
|
40
|
+
"mcp",
|
|
41
|
+
"serve",
|
|
42
|
+
]
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
def _detect_mcp_entry() -> dict[str, object] | None:
|
|
46
|
+
"""Build the correct MCP entry based on how ouroboros is installed.
|
|
47
|
+
|
|
48
|
+
Priority: uvx > ouroboros binary > python3 -m ouroboros (verified).
|
|
49
|
+
Returns None if no working method is found.
|
|
50
|
+
Matches the contract in install.sh and skills/setup/SKILL.md.
|
|
51
|
+
"""
|
|
52
|
+
if shutil.which("uvx"):
|
|
53
|
+
return {"command": "uvx", "args": list(_CLAUDE_UVX_ARGS)}
|
|
54
|
+
if shutil.which("ouroboros"):
|
|
55
|
+
return {"command": "ouroboros", "args": ["mcp", "serve"]}
|
|
56
|
+
# Only use python3 fallback if ouroboros is actually importable
|
|
57
|
+
import subprocess
|
|
58
|
+
|
|
59
|
+
try:
|
|
60
|
+
subprocess.run(
|
|
61
|
+
["python3", "-c", "import ouroboros"],
|
|
62
|
+
capture_output=True,
|
|
63
|
+
timeout=10,
|
|
64
|
+
check=True,
|
|
65
|
+
)
|
|
66
|
+
except (subprocess.CalledProcessError, FileNotFoundError, subprocess.TimeoutExpired):
|
|
67
|
+
return None
|
|
68
|
+
return {"command": "python3", "args": ["-m", "ouroboros", "mcp", "serve"]}
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
def _ensure_claude_mcp_entry() -> None:
|
|
72
|
+
"""Ensure ~/.claude/mcp.json has a correct ouroboros MCP entry.
|
|
73
|
+
|
|
74
|
+
Creates the entry if missing (detecting install method), updates stale
|
|
75
|
+
uvx args (e.g. ouroboros-ai without [claude] extras), and removes the
|
|
76
|
+
legacy timeout key. Skips the file write when nothing changed.
|
|
77
|
+
"""
|
|
78
|
+
mcp_config_path = Path.home() / ".claude" / "mcp.json"
|
|
79
|
+
mcp_config_path.parent.mkdir(parents=True, exist_ok=True)
|
|
80
|
+
|
|
81
|
+
mcp_data: dict = {}
|
|
82
|
+
if mcp_config_path.exists():
|
|
83
|
+
mcp_data = json.loads(mcp_config_path.read_text())
|
|
84
|
+
|
|
85
|
+
mcp_data.setdefault("mcpServers", {})
|
|
86
|
+
|
|
87
|
+
existing = mcp_data["mcpServers"].get("ouroboros")
|
|
88
|
+
detected = _detect_mcp_entry()
|
|
89
|
+
needs_write = False
|
|
90
|
+
|
|
91
|
+
if existing is None:
|
|
92
|
+
if detected is None:
|
|
93
|
+
print_warning(
|
|
94
|
+
"Cannot register MCP server: no working ouroboros installation found.\n"
|
|
95
|
+
"Install with: curl -LsSf https://astral.sh/uv/install.sh | sh"
|
|
96
|
+
)
|
|
97
|
+
return
|
|
98
|
+
mcp_data["mcpServers"]["ouroboros"] = detected
|
|
99
|
+
needs_write = True
|
|
100
|
+
print_success("Registered MCP server in ~/.claude/mcp.json")
|
|
101
|
+
else:
|
|
102
|
+
# Remove legacy timeout key
|
|
103
|
+
if "timeout" in existing:
|
|
104
|
+
del existing["timeout"]
|
|
105
|
+
needs_write = True
|
|
106
|
+
print_info("Removed legacy MCP timeout override.")
|
|
107
|
+
|
|
108
|
+
# Update entry to match currently detected install method, but only
|
|
109
|
+
# for known standard commands. Custom entries (docker, nix, etc.) are
|
|
110
|
+
# left untouched so we don't break user-managed configurations.
|
|
111
|
+
_KNOWN_COMMANDS = {"uvx", "ouroboros", "python3", "python"}
|
|
112
|
+
if detected is not None and existing.get("command") in _KNOWN_COMMANDS:
|
|
113
|
+
if (
|
|
114
|
+
existing.get("command") != detected["command"]
|
|
115
|
+
or existing.get("args") != detected["args"]
|
|
116
|
+
):
|
|
117
|
+
existing["command"] = detected["command"]
|
|
118
|
+
existing["args"] = detected["args"]
|
|
119
|
+
needs_write = True
|
|
120
|
+
print_info("Updated MCP server entry to match current install method.")
|
|
121
|
+
|
|
122
|
+
if not needs_write:
|
|
123
|
+
print_info("MCP server already registered.")
|
|
124
|
+
|
|
125
|
+
if needs_write:
|
|
126
|
+
with mcp_config_path.open("w") as f:
|
|
127
|
+
json.dump(mcp_data, f, indent=2)
|
|
128
|
+
|
|
129
|
+
|
|
35
130
|
app = typer.Typer(
|
|
36
131
|
name="setup",
|
|
37
132
|
help="Set up Ouroboros for your environment.",
|
|
@@ -227,32 +322,9 @@ def _setup_codex(codex_path: str) -> None:
|
|
|
227
322
|
_register_codex_mcp_server()
|
|
228
323
|
_print_codex_config_guidance(config_path)
|
|
229
324
|
|
|
230
|
-
# Also register MCP server for Codex users who also have Claude Code
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
mcp_config_path.parent.mkdir(parents=True, exist_ok=True)
|
|
234
|
-
|
|
235
|
-
mcp_data: dict = {}
|
|
236
|
-
if mcp_config_path.exists():
|
|
237
|
-
mcp_data = json.loads(mcp_config_path.read_text())
|
|
238
|
-
|
|
239
|
-
mcp_data.setdefault("mcpServers", {})
|
|
240
|
-
entry = mcp_data["mcpServers"].get("ouroboros", {})
|
|
241
|
-
if not entry:
|
|
242
|
-
entry = {
|
|
243
|
-
"command": "uvx",
|
|
244
|
-
"args": ["--from", "ouroboros-ai", "ouroboros", "mcp", "serve"],
|
|
245
|
-
}
|
|
246
|
-
removed_timeout = entry.pop("timeout", None) is not None
|
|
247
|
-
mcp_data["mcpServers"]["ouroboros"] = entry
|
|
248
|
-
|
|
249
|
-
with mcp_config_path.open("w") as f:
|
|
250
|
-
json.dump(mcp_data, f, indent=2)
|
|
251
|
-
|
|
252
|
-
if removed_timeout:
|
|
253
|
-
print_info("Removed legacy Claude MCP timeout override.")
|
|
254
|
-
else:
|
|
255
|
-
print_info("Updated Claude MCP server config.")
|
|
325
|
+
# Also register/fix MCP server for Codex users who also have Claude Code
|
|
326
|
+
if (Path.home() / ".claude").is_dir():
|
|
327
|
+
_ensure_claude_mcp_entry()
|
|
256
328
|
|
|
257
329
|
|
|
258
330
|
def _setup_claude(claude_path: str) -> None:
|
|
@@ -279,32 +351,8 @@ def _setup_claude(claude_path: str) -> None:
|
|
|
279
351
|
with config_path.open("w") as f:
|
|
280
352
|
yaml.dump(config_dict, f, default_flow_style=False, sort_keys=False)
|
|
281
353
|
|
|
282
|
-
# Register MCP server in ~/.claude/mcp.json
|
|
283
|
-
|
|
284
|
-
mcp_config_path.parent.mkdir(parents=True, exist_ok=True)
|
|
285
|
-
|
|
286
|
-
mcp_data: dict = {}
|
|
287
|
-
if mcp_config_path.exists():
|
|
288
|
-
mcp_data = json.loads(mcp_config_path.read_text())
|
|
289
|
-
|
|
290
|
-
mcp_data.setdefault("mcpServers", {})
|
|
291
|
-
if "ouroboros" not in mcp_data["mcpServers"]:
|
|
292
|
-
mcp_data["mcpServers"]["ouroboros"] = {
|
|
293
|
-
"command": "uvx",
|
|
294
|
-
"args": ["--from", "ouroboros-ai", "ouroboros", "mcp", "serve"],
|
|
295
|
-
}
|
|
296
|
-
with mcp_config_path.open("w") as f:
|
|
297
|
-
json.dump(mcp_data, f, indent=2)
|
|
298
|
-
print_success("Registered MCP server in ~/.claude/mcp.json")
|
|
299
|
-
else:
|
|
300
|
-
entry = mcp_data["mcpServers"]["ouroboros"]
|
|
301
|
-
if "timeout" in entry:
|
|
302
|
-
del entry["timeout"]
|
|
303
|
-
with mcp_config_path.open("w") as f:
|
|
304
|
-
json.dump(mcp_data, f, indent=2)
|
|
305
|
-
print_info("Removed legacy MCP timeout override.")
|
|
306
|
-
else:
|
|
307
|
-
print_info("MCP server already registered.")
|
|
354
|
+
# Register/fix MCP server in ~/.claude/mcp.json
|
|
355
|
+
_ensure_claude_mcp_entry()
|
|
308
356
|
|
|
309
357
|
print_success(f"Configured Claude Code runtime (CLI: {claude_path})")
|
|
310
358
|
print_info(f"Config saved to: {config_path}")
|
|
@@ -264,9 +264,173 @@ class TestClaudeSetup:
|
|
|
264
264
|
config_dict = yaml.safe_load(config_path.read_text(encoding="utf-8"))
|
|
265
265
|
|
|
266
266
|
assert "timeout" not in claude_mcp["mcpServers"]["ouroboros"]
|
|
267
|
+
# Stale args (ouroboros-ai without [claude]) should be updated
|
|
268
|
+
assert claude_mcp["mcpServers"]["ouroboros"]["args"] == [
|
|
269
|
+
"--from",
|
|
270
|
+
"ouroboros-ai[claude]",
|
|
271
|
+
"ouroboros",
|
|
272
|
+
"mcp",
|
|
273
|
+
"serve",
|
|
274
|
+
]
|
|
267
275
|
assert config_dict["orchestrator"]["runtime_backend"] == "claude"
|
|
268
276
|
assert config_dict["llm"]["backend"] == "claude"
|
|
269
277
|
|
|
278
|
+
@pytest.mark.parametrize(
|
|
279
|
+
"which_side_effect, expected_cmd, expected_args",
|
|
280
|
+
[
|
|
281
|
+
# uvx available → uvx entry with [claude] extras
|
|
282
|
+
(
|
|
283
|
+
lambda cmd: "/usr/local/bin/uvx" if cmd == "uvx" else None,
|
|
284
|
+
"uvx",
|
|
285
|
+
["--from", "ouroboros-ai[claude]", "ouroboros", "mcp", "serve"],
|
|
286
|
+
),
|
|
287
|
+
# no uvx, ouroboros binary available → binary entry
|
|
288
|
+
(
|
|
289
|
+
lambda cmd: "/usr/local/bin/ouroboros" if cmd == "ouroboros" else None,
|
|
290
|
+
"ouroboros",
|
|
291
|
+
["mcp", "serve"],
|
|
292
|
+
),
|
|
293
|
+
# no uvx, no binary → python3 -m fallback
|
|
294
|
+
(
|
|
295
|
+
lambda _cmd: None,
|
|
296
|
+
"python3",
|
|
297
|
+
["-m", "ouroboros", "mcp", "serve"],
|
|
298
|
+
),
|
|
299
|
+
],
|
|
300
|
+
ids=["uvx", "pipx-binary", "pip-fallback"],
|
|
301
|
+
)
|
|
302
|
+
def test_setup_claude_creates_new_entry_per_install_method(
|
|
303
|
+
self,
|
|
304
|
+
tmp_path: Path,
|
|
305
|
+
which_side_effect,
|
|
306
|
+
expected_cmd: str,
|
|
307
|
+
expected_args: list[str],
|
|
308
|
+
) -> None:
|
|
309
|
+
"""New MCP entry command/args should match the detected install method."""
|
|
310
|
+
config_dir = tmp_path / ".ouroboros"
|
|
311
|
+
config_dir.mkdir()
|
|
312
|
+
config_path = config_dir / "config.yaml"
|
|
313
|
+
config_path.write_text("{}", encoding="utf-8")
|
|
314
|
+
|
|
315
|
+
claude_dir = tmp_path / ".claude"
|
|
316
|
+
claude_dir.mkdir()
|
|
317
|
+
claude_config = claude_dir / "mcp.json"
|
|
318
|
+
claude_config.write_text(json.dumps({"mcpServers": {}}), encoding="utf-8")
|
|
319
|
+
|
|
320
|
+
with (
|
|
321
|
+
patch("pathlib.Path.home", return_value=tmp_path),
|
|
322
|
+
patch("ouroboros.config.loader.ensure_config_dir", return_value=config_dir),
|
|
323
|
+
patch("ouroboros.cli.commands.setup.shutil.which", side_effect=which_side_effect),
|
|
324
|
+
):
|
|
325
|
+
setup_cmd._setup_claude("/usr/local/bin/claude")
|
|
326
|
+
|
|
327
|
+
claude_mcp = json.loads(claude_config.read_text(encoding="utf-8"))
|
|
328
|
+
entry = claude_mcp["mcpServers"]["ouroboros"]
|
|
329
|
+
assert entry["command"] == expected_cmd
|
|
330
|
+
assert entry["args"] == expected_args
|
|
331
|
+
|
|
332
|
+
def test_setup_claude_preserves_custom_command(self, tmp_path: Path) -> None:
|
|
333
|
+
"""Custom (non-standard) MCP command should not be overwritten."""
|
|
334
|
+
config_dir = tmp_path / ".ouroboros"
|
|
335
|
+
config_dir.mkdir()
|
|
336
|
+
config_path = config_dir / "config.yaml"
|
|
337
|
+
config_path.write_text("{}", encoding="utf-8")
|
|
338
|
+
|
|
339
|
+
custom_args = ["run", "--rm", "ouroboros-mcp"]
|
|
340
|
+
claude_dir = tmp_path / ".claude"
|
|
341
|
+
claude_dir.mkdir()
|
|
342
|
+
claude_config = claude_dir / "mcp.json"
|
|
343
|
+
claude_config.write_text(
|
|
344
|
+
json.dumps(
|
|
345
|
+
{
|
|
346
|
+
"mcpServers": {
|
|
347
|
+
"ouroboros": {
|
|
348
|
+
"command": "docker",
|
|
349
|
+
"args": custom_args,
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
),
|
|
354
|
+
encoding="utf-8",
|
|
355
|
+
)
|
|
356
|
+
|
|
357
|
+
with (
|
|
358
|
+
patch("pathlib.Path.home", return_value=tmp_path),
|
|
359
|
+
patch("ouroboros.config.loader.ensure_config_dir", return_value=config_dir),
|
|
360
|
+
):
|
|
361
|
+
setup_cmd._setup_claude("/usr/local/bin/claude")
|
|
362
|
+
|
|
363
|
+
claude_mcp = json.loads(claude_config.read_text(encoding="utf-8"))
|
|
364
|
+
# Custom command (docker) should be left untouched
|
|
365
|
+
assert claude_mcp["mcpServers"]["ouroboros"]["command"] == "docker"
|
|
366
|
+
assert claude_mcp["mcpServers"]["ouroboros"]["args"] == custom_args
|
|
367
|
+
|
|
368
|
+
def test_setup_claude_updates_stale_standard_entry(self, tmp_path: Path) -> None:
|
|
369
|
+
"""Stale standard entry (e.g. python3) should be updated to detected method."""
|
|
370
|
+
config_dir = tmp_path / ".ouroboros"
|
|
371
|
+
config_dir.mkdir()
|
|
372
|
+
config_path = config_dir / "config.yaml"
|
|
373
|
+
config_path.write_text("{}", encoding="utf-8")
|
|
374
|
+
|
|
375
|
+
claude_dir = tmp_path / ".claude"
|
|
376
|
+
claude_dir.mkdir()
|
|
377
|
+
claude_config = claude_dir / "mcp.json"
|
|
378
|
+
claude_config.write_text(
|
|
379
|
+
json.dumps(
|
|
380
|
+
{
|
|
381
|
+
"mcpServers": {
|
|
382
|
+
"ouroboros": {
|
|
383
|
+
"command": "python3",
|
|
384
|
+
"args": ["-m", "ouroboros", "mcp", "serve"],
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
),
|
|
389
|
+
encoding="utf-8",
|
|
390
|
+
)
|
|
391
|
+
|
|
392
|
+
# Simulate uvx now being available
|
|
393
|
+
with (
|
|
394
|
+
patch("pathlib.Path.home", return_value=tmp_path),
|
|
395
|
+
patch("ouroboros.config.loader.ensure_config_dir", return_value=config_dir),
|
|
396
|
+
patch(
|
|
397
|
+
"ouroboros.cli.commands.setup.shutil.which",
|
|
398
|
+
side_effect=lambda cmd: "/usr/local/bin/uvx" if cmd == "uvx" else None,
|
|
399
|
+
),
|
|
400
|
+
):
|
|
401
|
+
setup_cmd._setup_claude("/usr/local/bin/claude")
|
|
402
|
+
|
|
403
|
+
claude_mcp = json.loads(claude_config.read_text(encoding="utf-8"))
|
|
404
|
+
# Should be updated from python3 to uvx
|
|
405
|
+
assert claude_mcp["mcpServers"]["ouroboros"]["command"] == "uvx"
|
|
406
|
+
assert "ouroboros-ai[claude]" in str(claude_mcp["mcpServers"]["ouroboros"]["args"])
|
|
407
|
+
|
|
408
|
+
def test_setup_claude_skips_write_when_args_already_current(self, tmp_path: Path) -> None:
|
|
409
|
+
"""No file write when args are already up to date."""
|
|
410
|
+
config_dir = tmp_path / ".ouroboros"
|
|
411
|
+
config_dir.mkdir()
|
|
412
|
+
config_path = config_dir / "config.yaml"
|
|
413
|
+
config_path.write_text("{}", encoding="utf-8")
|
|
414
|
+
|
|
415
|
+
current_args = ["--from", "ouroboros-ai[claude]", "ouroboros", "mcp", "serve"]
|
|
416
|
+
claude_dir = tmp_path / ".claude"
|
|
417
|
+
claude_dir.mkdir()
|
|
418
|
+
claude_config = claude_dir / "mcp.json"
|
|
419
|
+
claude_config.write_text(
|
|
420
|
+
json.dumps({"mcpServers": {"ouroboros": {"command": "uvx", "args": current_args}}}),
|
|
421
|
+
encoding="utf-8",
|
|
422
|
+
)
|
|
423
|
+
mtime_before = claude_config.stat().st_mtime
|
|
424
|
+
|
|
425
|
+
with (
|
|
426
|
+
patch("pathlib.Path.home", return_value=tmp_path),
|
|
427
|
+
patch("ouroboros.config.loader.ensure_config_dir", return_value=config_dir),
|
|
428
|
+
):
|
|
429
|
+
setup_cmd._setup_claude("/usr/local/bin/claude")
|
|
430
|
+
|
|
431
|
+
# File should not be rewritten when nothing changed
|
|
432
|
+
assert claude_config.stat().st_mtime == mtime_before
|
|
433
|
+
|
|
270
434
|
|
|
271
435
|
# ── Brownfield helper function tests ─────────────────────────────
|
|
272
436
|
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/.github/ISSUE_TEMPLATE/bug_report.yml
RENAMED
|
File without changes
|
|
File without changes
|
{ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/.github/ISSUE_TEMPLATE/feature_request.yml
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|