ouroboros-ai 0.26.0b8.dev1__tar.gz → 0.26.1.dev2__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.1.dev2/.claude-plugin/.mcp.json +9 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/.claude-plugin/marketplace.json +1 -1
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/.claude-plugin/plugin.json +1 -1
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/PKG-INFO +10 -35
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/README.ko.md +1 -1
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/README.md +6 -34
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/pyproject.toml +3 -4
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/scripts/install.sh +5 -5
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/skills/setup/SKILL.md +1 -1
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/skills/update/SKILL.md +2 -1
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/_version.py +2 -2
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/bigbang/ambiguity.py +28 -10
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/cli/commands/run.py +9 -1
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/evolution/loop.py +9 -1
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/mcp/tools/execution_handlers.py +12 -1
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/orchestrator/codex_cli_runtime.py +20 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/orchestrator/parallel_executor.py +165 -1
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/orchestrator/runner.py +25 -72
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/orchestrator/session.py +7 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/persistence/event_store.py +7 -7
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/providers/__init__.py +8 -5
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/providers/codex_cli_adapter.py +17 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/tui/screens/session_selector.py +9 -1
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/bigbang/test_ambiguity.py +62 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/cli/test_main.py +5 -4
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/core/test_context.py +8 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/mcp/tools/test_qa_integration.py +6 -1
- ouroboros_ai-0.26.1.dev2/tests/unit/orchestrator/test_codex_recursion_guard.py +90 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/orchestrator/test_runner.py +119 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/orchestrator/test_session.py +78 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/persistence/test_event_store.py +64 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/providers/test_litellm_adapter.py +1 -1
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/test_artifact_collector.py +19 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/test_dependencies_configured.py +1 -1
- ouroboros_ai-0.26.1.dev2/tests/unit/tui/test_session_selector_replay.py +184 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/uv.lock +1051 -207
- ouroboros_ai-0.26.0b8.dev1/.claude-plugin/.mcp.json +0 -9
- ouroboros_ai-0.26.0b8.dev1/crates/ouroboros-tui/COLOR_SYSTEM.md +0 -320
- ouroboros_ai-0.26.0b8.dev1/docs/images/demo-evaluation.png +0 -0
- ouroboros_ai-0.26.0b8.dev1/docs/images/demo-interview.png +0 -0
- ouroboros_ai-0.26.0b8.dev1/docs/images/demo-seed.png +0 -0
- ouroboros_ai-0.26.0b8.dev1/docs/images/demo-tui-dashboard.png +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/.claude/settings.json +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/.env.example +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/.github/workflows/dev-publish.yml +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/.github/workflows/lint.yml +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/.github/workflows/release.yml +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/.github/workflows/test.yml +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/.gitignore +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/.mcp.json +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/.ouroboros/mechanical.toml +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/.pre-commit-config.yaml +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/.python-version +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/CHANGELOG.md +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/CLAUDE.md +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/CONTRIBUTING.md +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/HANDOFF.md +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/LICENSE +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/SECURITY.md +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/commands/cancel.md +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/commands/evaluate.md +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/commands/evolve.md +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/commands/help.md +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/commands/interview.md +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/commands/ralph.md +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/commands/run.md +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/commands/seed.md +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/commands/setup.md +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/commands/status.md +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/commands/tutorial.md +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/commands/unstuck.md +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/commands/welcome.md +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/crates/ouroboros-tui/.gitignore +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/crates/ouroboros-tui/Cargo.lock +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/crates/ouroboros-tui/Cargo.toml +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/crates/ouroboros-tui/README.md +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/crates/ouroboros-tui/src/db.rs +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/crates/ouroboros-tui/src/main.rs +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/crates/ouroboros-tui/src/mock.rs +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/crates/ouroboros-tui/src/state.rs +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/crates/ouroboros-tui/src/views/dashboard.rs +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/crates/ouroboros-tui/src/views/execution.rs +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/crates/ouroboros-tui/src/views/lineage.rs +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/crates/ouroboros-tui/src/views/logs.rs +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/crates/ouroboros-tui/src/views/mod.rs +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/crates/ouroboros-tui/src/views/session_selector.rs +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/docs/README.md +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/docs/api/README.md +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/docs/api/core.md +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/docs/api/mcp.md +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/docs/architecture.md +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/docs/cli-reference.md +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/docs/config-reference.md +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/docs/contributing/architecture-overview.md +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/docs/contributing/findings-registry.md +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/docs/contributing/key-patterns.md +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/docs/contributing/testing-guide.md +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/docs/examples/mcp-config.yaml +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/docs/getting-started.md +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/docs/guides/evaluation-pipeline.md +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/docs/guides/evolution-loop.md +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/docs/guides/issue-176-subagent-mcp-inheritance.md +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/docs/guides/seed-authoring.md +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/docs/guides/tui-usage.md +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/docs/images/PLACEHOLDER_README.md +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/docs/images/ouroboros.png +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/docs/platform-support.md +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/docs/runtime-capability-matrix.md +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/docs/runtime-guides/claude-code.md +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/docs/runtime-guides/codex.md +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/examples/coordinator_test_seed.yaml +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/examples/dummy_seed.yaml +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/examples/parallel_subac_test_seed.yaml +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/examples/subac_test_seed.yaml +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/examples/task_manager/README.md +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/examples/task_manager/__init__.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/examples/task_manager/__main__.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/examples/task_manager/cli.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/examples/task_manager/models.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/examples/task_manager/storage.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/examples/test_display.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/hooks/hooks.json +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/llms-full.txt +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/llms.txt +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/project-context.md +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/scripts/drift-monitor.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/scripts/keyword-detector.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/scripts/mcp-serve.sh +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/scripts/ralph-rewind.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/scripts/ralph.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/scripts/ralph.sh +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/scripts/session-start.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/scripts/sync-plugin-version.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/scripts/version-check.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/skills/brownfield/SKILL.md +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/skills/cancel/SKILL.md +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/skills/evaluate/SKILL.md +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/skills/evolve/SKILL.md +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/skills/help/SKILL.md +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/skills/interview/SKILL.md +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/skills/pm/SKILL.md +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/skills/qa/SKILL.md +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/skills/ralph/SKILL.md +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/skills/run/SKILL.md +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/skills/seed/SKILL.md +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/skills/status/SKILL.md +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/skills/tutorial/SKILL.md +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/skills/unstuck/SKILL.md +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/skills/welcome/SKILL.md +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/__init__.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/__main__.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/agents/__init__.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/agents/advocate.md +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/agents/analysis-agent.md +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/agents/architect.md +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/agents/breadth-keeper.md +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/agents/code-executor.md +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/agents/codebase-explorer.md +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/agents/consensus-reviewer.md +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/agents/contrarian.md +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/agents/evaluator.md +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/agents/hacker.md +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/agents/judge.md +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/agents/loader.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/agents/ontologist.md +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/agents/ontology-analyst.md +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/agents/qa-judge.md +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/agents/research-agent.md +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/agents/researcher.md +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/agents/seed-architect.md +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/agents/seed-closer.md +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/agents/semantic-evaluator.md +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/agents/simplifier.md +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/agents/socratic-interviewer.md +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/bigbang/__init__.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/bigbang/brownfield.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/bigbang/explore.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/bigbang/interview.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/bigbang/pm_document.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/bigbang/pm_interview.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/bigbang/pm_seed.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/bigbang/question_classifier.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/bigbang/seed_generator.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/cli/__init__.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/cli/commands/__init__.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/cli/commands/cancel.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/cli/commands/config.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/cli/commands/init.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/cli/commands/mcp.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/cli/commands/pm.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/cli/commands/setup.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/cli/commands/status.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/cli/commands/tui.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/cli/formatters/__init__.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/cli/formatters/panels.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/cli/formatters/progress.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/cli/formatters/tables.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/cli/formatters/workflow_display.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/cli/main.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/codex/__init__.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/codex/artifacts.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/codex/ouroboros.md +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/codex_permissions.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/config/__init__.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/config/loader.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/config/models.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/core/__init__.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/core/ac_tree.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/core/context.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/core/errors.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/core/file_lock.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/core/git_workflow.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/core/lineage.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/core/ontology_aspect.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/core/ontology_questions.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/core/security.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/core/seed.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/core/text.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/core/types.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/evaluation/__init__.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/evaluation/artifact_collector.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/evaluation/consensus.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/evaluation/json_utils.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/evaluation/languages.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/evaluation/mechanical.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/evaluation/models.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/evaluation/pipeline.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/evaluation/semantic.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/evaluation/trigger.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/events/__init__.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/events/base.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/events/decomposition.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/events/evaluation.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/events/interview.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/events/lineage.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/events/ontology.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/evolution/__init__.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/evolution/convergence.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/evolution/projector.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/evolution/reflect.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/evolution/regression.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/evolution/wonder.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/execution/__init__.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/execution/atomicity.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/execution/decomposition.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/execution/double_diamond.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/execution/subagent.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/mcp/__init__.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/mcp/client/__init__.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/mcp/client/adapter.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/mcp/client/manager.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/mcp/client/protocol.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/mcp/errors.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/mcp/job_manager.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/mcp/resources/__init__.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/mcp/resources/handlers.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/mcp/server/__init__.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/mcp/server/adapter.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/mcp/server/protocol.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/mcp/server/security.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/mcp/tools/__init__.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/mcp/tools/authoring_handlers.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/mcp/tools/brownfield_handler.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/mcp/tools/dashboard.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/mcp/tools/definitions.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/mcp/tools/evaluation_handlers.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/mcp/tools/evolution_handlers.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/mcp/tools/job_handlers.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/mcp/tools/pm_handler.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/mcp/tools/qa.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/mcp/tools/query_handlers.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/mcp/tools/registry.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/mcp/types.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/observability/__init__.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/observability/drift.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/observability/logging.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/observability/retrospective.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/orchestrator/__init__.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/orchestrator/adapter.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/orchestrator/command_dispatcher.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/orchestrator/coordinator.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/orchestrator/dependency_analyzer.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/orchestrator/events.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/orchestrator/execution_runtime_scope.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/orchestrator/execution_strategy.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/orchestrator/heartbeat.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/orchestrator/level_context.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/orchestrator/mcp_config.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/orchestrator/mcp_tools.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/orchestrator/parallel_executor_models.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/orchestrator/runtime_factory.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/orchestrator/runtime_message_projection.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/orchestrator/workflow_state.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/persistence/__init__.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/persistence/brownfield.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/persistence/checkpoint.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/persistence/migrations/__init__.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/persistence/migrations/runner.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/persistence/migrations/scripts/001_initial.sql +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/persistence/migrations/scripts/002_brownfield.sql +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/persistence/schema.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/persistence/uow.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/plugin/__init__.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/plugin/agents/__init__.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/plugin/agents/pool.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/plugin/agents/registry.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/plugin/orchestration/__init__.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/plugin/orchestration/router.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/plugin/orchestration/scheduler.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/plugin/skills/__init__.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/plugin/skills/docs.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/plugin/skills/executor.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/plugin/skills/keywords.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/plugin/skills/registry.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/pm/__init__.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/pm/renderer.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/providers/anthropic_adapter.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/providers/base.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/providers/claude_code_adapter.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/providers/codex_cli_stream.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/providers/factory.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/providers/litellm_adapter.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/py.typed +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/resilience/__init__.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/resilience/lateral.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/resilience/stagnation.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/routing/__init__.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/routing/complexity.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/routing/downgrade.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/routing/escalation.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/routing/router.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/routing/tiers.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/secondary/__init__.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/secondary/scheduler.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/secondary/todo_registry.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/strategies/__init__.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/strategies/devil_advocate.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/tui/__init__.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/tui/app.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/tui/components/__init__.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/tui/components/agents_panel.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/tui/components/event_log.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/tui/components/progress.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/tui/components/token_tracker.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/tui/events.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/tui/screens/__init__.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/tui/screens/confirm_rewind.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/tui/screens/dashboard.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/tui/screens/dashboard_v2.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/tui/screens/dashboard_v3.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/tui/screens/debug.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/tui/screens/execution.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/tui/screens/hud_dashboard.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/tui/screens/lineage_detail.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/tui/screens/lineage_selector.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/tui/screens/logs.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/tui/widgets/__init__.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/tui/widgets/ac_progress.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/tui/widgets/ac_tree.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/tui/widgets/agent_activity.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/tui/widgets/cost_tracker.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/tui/widgets/drift_meter.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/tui/widgets/lineage_tree.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/tui/widgets/parallel_graph.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/tui/widgets/phase_progress.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/verification/__init__.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/verification/extractor.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/verification/models.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/src/ouroboros/verification/verifier.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/__init__.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/conftest.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/e2e/__init__.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/e2e/conftest.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/e2e/test_cli_commands.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/e2e/test_full_workflow.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/e2e/test_session_persistence.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/fixtures/test_atomicity_seed.yml +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/integration/__init__.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/integration/conftest.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/integration/mcp/__init__.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/integration/mcp/conftest.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/integration/mcp/test_client_adapter.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/integration/mcp/test_client_manager.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/integration/mcp/test_server_adapter.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/integration/plugin/test_orchestration.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/integration/test_codex_cli_passthrough_smoke.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/integration/test_codex_skill_fallback.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/integration/test_codex_skill_smoke.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/integration/test_entry_point.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/__init__.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/agents/__init__.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/agents/test_loader.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/bigbang/__init__.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/bigbang/test_brownfield.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/bigbang/test_classifier_context.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/bigbang/test_decide_later_items.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/bigbang/test_explore.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/bigbang/test_interview.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/bigbang/test_pm_document_generator.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/bigbang/test_pm_document_writer.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/bigbang/test_pm_interview.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/bigbang/test_pm_interview_brownfield_db.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/bigbang/test_pm_seed_ac12.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/bigbang/test_pm_seed_save.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/bigbang/test_question_classifier.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/bigbang/test_seed_generator.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/cli/__init__.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/cli/formatters/__init__.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/cli/formatters/test_console.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/cli/formatters/test_panels.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/cli/formatters/test_progress.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/cli/formatters/test_tables.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/cli/formatters/test_workflow_display.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/cli/test_cancel.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/cli/test_init_pm_seed_detection.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/cli/test_init_runtime.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/cli/test_mcp_nested_guard.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/cli/test_mcp_startup_cleanup.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/cli/test_pm_brownfield.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/cli/test_pm_overwrite.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/cli/test_pm_select_repos.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/cli/test_setup.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/config/__init__.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/config/test_loader.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/config/test_models.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/core/__init__.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/core/test_ac_tree.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/core/test_errors.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/core/test_git_workflow.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/core/test_lineage.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/core/test_ontology_aspect.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/core/test_ontology_questions.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/core/test_security.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/core/test_seed.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/core/test_types.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/evaluation/__init__.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/evaluation/test_consensus.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/evaluation/test_json_utils.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/evaluation/test_languages.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/evaluation/test_mechanical.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/evaluation/test_models.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/evaluation/test_semantic.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/evaluation/test_trigger.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/events/__init__.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/events/test_base.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/events/test_decomposition_events.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/evolution/test_wonder_scope.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/execution/__init__.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/execution/test_atomicity.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/execution/test_decomposition.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/execution/test_double_diamond.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/execution/test_subagent_isolation.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/mcp/__init__.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/mcp/client/__init__.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/mcp/client/test_adapter.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/mcp/client/test_manager.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/mcp/conftest.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/mcp/server/__init__.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/mcp/server/test_adapter.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/mcp/server/test_security.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/mcp/test_errors.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/mcp/test_job_manager.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/mcp/test_types.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/mcp/tools/__init__.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/mcp/tools/conftest.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/mcp/tools/test_brownfield_handler.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/mcp/tools/test_definitions.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/mcp/tools/test_pm_handler.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/mcp/tools/test_pm_handler_generate.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/mcp/tools/test_pm_handler_pending_reframe.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/mcp/tools/test_registry.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/observability/__init__.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/observability/test_drift.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/observability/test_logging.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/observability/test_retrospective.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/orchestrator/__init__.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/orchestrator/test_adapter.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/orchestrator/test_codex_cli_runtime.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/orchestrator/test_command_dispatcher.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/orchestrator/test_coordinator.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/orchestrator/test_dependency_analyzer.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/orchestrator/test_events.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/orchestrator/test_execution_runtime_scope.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/orchestrator/test_execution_strategy.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/orchestrator/test_inflight_cancellation.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/orchestrator/test_level_context.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/orchestrator/test_mcp_config.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/orchestrator/test_mcp_tools.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/orchestrator/test_parallel_executor.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/orchestrator/test_parallel_executor_retry_resume.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/orchestrator/test_runner_cancellation.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/orchestrator/test_runtime_factory.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/orchestrator/test_runtime_message_projection.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/orchestrator/test_workflow_state.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/persistence/__init__.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/persistence/test_brownfield_store.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/persistence/test_checkpoint.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/persistence/test_schema.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/persistence/test_uow.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/plugin/__init__.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/plugin/agents/__init__.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/plugin/agents/test_registry.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/plugin/orchestration/__init__.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/plugin/orchestration/test_model_router.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/plugin/skills/__init__.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/plugin/skills/test_keywords.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/plugin/skills/test_registry.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/pm/__init__.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/pm/test_renderer.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/providers/__init__.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/providers/test_base.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/providers/test_claude_code_adapter.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/providers/test_codex_cli_adapter.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/providers/test_factory.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/resilience/__init__.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/resilience/test_lateral.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/resilience/test_stagnation.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/routing/__init__.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/routing/test_complexity.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/routing/test_downgrade.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/routing/test_escalation.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/routing/test_router.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/routing/test_tiers.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/scripts/test_keyword_detector.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/scripts/test_version_check.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/secondary/__init__.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/secondary/test_scheduler.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/secondary/test_todo_registry.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/test_codex_artifacts.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/test_convergence.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/test_dashboard.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/test_evolve_rewind.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/test_evolve_step.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/test_main_entry_point.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/test_module_structure.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/test_project_initialization.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/test_projector_rewind.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/test_ralph_parser.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/test_ralph_rewind.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/test_regression.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/test_tooling_configuration.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/test_verification.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/tui/__init__.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/tui/test_app.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/tui/test_cancelled_display.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/tui/test_events.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/tui/test_lineage_viewer.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/tui/test_screens.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tests/unit/tui/test_widgets.py +0 -0
- {ouroboros_ai-0.26.0b8.dev1 → ouroboros_ai-0.26.1.dev2}/tools/sync_github_project.py +0 -0
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
{
|
|
11
11
|
"name": "ouroboros",
|
|
12
12
|
"description": "Transform vague ideas into validated seed specifications through Socratic questioning and ontological analysis",
|
|
13
|
-
"version": "0.26.
|
|
13
|
+
"version": "0.26.0",
|
|
14
14
|
"author": {
|
|
15
15
|
"name": "Q00",
|
|
16
16
|
"email": "jqyu.lee@gmail.com"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ouroboros",
|
|
3
|
-
"version": "0.26.
|
|
3
|
+
"version": "0.26.0",
|
|
4
4
|
"description": "Self-improving AI workflow system. Crystallize requirements before execution with Socratic interview, ambiguity scoring, and 3-stage evaluation.",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Q00",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: ouroboros-ai
|
|
3
|
-
Version: 0.26.
|
|
3
|
+
Version: 0.26.1.dev2
|
|
4
4
|
Summary: Specification-first workflow engine for AI coding agents. Works with Claude Code and Codex CLI.
|
|
5
5
|
Author-email: Q00 <jqyu.lee@gmail.com>
|
|
6
6
|
License-File: LICENSE
|
|
@@ -23,6 +23,7 @@ Requires-Dist: typer>=0.12.0
|
|
|
23
23
|
Provides-Extra: all
|
|
24
24
|
Requires-Dist: anthropic>=0.52.0; extra == 'all'
|
|
25
25
|
Requires-Dist: claude-agent-sdk>=0.1.0; extra == 'all'
|
|
26
|
+
Requires-Dist: litellm<=1.82.6,>=1.80.0; extra == 'all'
|
|
26
27
|
Requires-Dist: pandas>=2.2.0; extra == 'all'
|
|
27
28
|
Requires-Dist: plotly>=5.24.0; extra == 'all'
|
|
28
29
|
Requires-Dist: streamlit>=1.40.0; extra == 'all'
|
|
@@ -33,6 +34,8 @@ Provides-Extra: dashboard
|
|
|
33
34
|
Requires-Dist: pandas>=2.2.0; extra == 'dashboard'
|
|
34
35
|
Requires-Dist: plotly>=5.24.0; extra == 'dashboard'
|
|
35
36
|
Requires-Dist: streamlit>=1.40.0; extra == 'dashboard'
|
|
37
|
+
Provides-Extra: litellm
|
|
38
|
+
Requires-Dist: litellm<=1.82.6,>=1.80.0; extra == 'litellm'
|
|
36
39
|
Description-Content-Type: text/markdown
|
|
37
40
|
|
|
38
41
|
<p align="right">
|
|
@@ -77,18 +80,14 @@ Description-Content-Type: text/markdown
|
|
|
77
80
|
|
|
78
81
|
> **Security Notice (2026-03-24): LiteLLM PyPI Supply Chain Attack**
|
|
79
82
|
>
|
|
80
|
-
> LiteLLM versions 1.82.7 and 1.82.8 on PyPI contained a malicious `.pth` file that
|
|
83
|
+
> LiteLLM versions **1.82.7** and **1.82.8** on PyPI contained a malicious `.pth` file that auto-executes on every Python startup, exfiltrating environment variables, API keys, and credentials to an external server.
|
|
81
84
|
>
|
|
82
|
-
> **
|
|
83
|
-
> - Fresh-installed Ouroboros (`pip install ouroboros-ai`, `uv tool install ouroboros-ai`), or
|
|
84
|
-
> - Upgraded an existing install (`pip install --upgrade ouroboros-ai`)
|
|
85
|
+
> **What we did:** Ouroboros now pins LiteLLM to **`<=1.82.6`** (safe versions only) as an optional dependency. LiteLLM is no longer a core dependency — it is only installed when you explicitly opt in via `pip install ouroboros-ai[litellm]`.
|
|
85
86
|
>
|
|
86
|
-
>
|
|
87
|
-
>
|
|
88
|
-
> **Ouroboros has removed litellm entirely** as of v0.25.2 (stable) and v0.26.0b7 (beta). However, **upgrading Ouroboros only removes litellm from the dependency list — it does NOT uninstall litellm itself or delete the malicious `.pth` file already on your system.** You must clean up manually:
|
|
87
|
+
> **If you previously installed litellm 1.82.7 or 1.82.8**, the malicious `.pth` file may still be on your system even after upgrading. Clean up manually:
|
|
89
88
|
>
|
|
90
89
|
> ```bash
|
|
91
|
-
> # 1. Find the malicious file
|
|
90
|
+
> # 1. Find and delete the malicious file
|
|
92
91
|
> find / -name "litellm_init.pth" 2>/dev/null
|
|
93
92
|
>
|
|
94
93
|
> # 2. Clean package manager caches
|
|
@@ -98,7 +97,7 @@ Description-Content-Type: text/markdown
|
|
|
98
97
|
> # 3. Rotate ALL credentials that were on your system during the exposure window
|
|
99
98
|
> ```
|
|
100
99
|
>
|
|
101
|
-
> References: [LiteLLM #24512](https://github.com/BerriAI/litellm/issues/24512) · [Ouroboros #195](https://github.com/Q00/ouroboros/issues/195) · [
|
|
100
|
+
> References: [LiteLLM #24512](https://github.com/BerriAI/litellm/issues/24512) · [Ouroboros #195](https://github.com/Q00/ouroboros/issues/195) · [DSPy mitigation](https://github.com/stanfordnlp/dspy/commit/66e33399bf29)
|
|
102
101
|
|
|
103
102
|
---
|
|
104
103
|
|
|
@@ -106,11 +105,6 @@ Description-Content-Type: text/markdown
|
|
|
106
105
|
|
|
107
106
|
Ouroboros sits between you and your AI runtime (Claude Code, Codex CLI, or others). It replaces ad-hoc prompting with a structured specification-first workflow: interview, crystallize, execute, evaluate, evolve.
|
|
108
107
|
|
|
109
|
-
<!-- TODO: Replace with demo GIF or asciicast -->
|
|
110
|
-
<p align="center">
|
|
111
|
-
<em>[Demo: 2-minute walkthrough from vague idea to verified code -- coming soon]</em>
|
|
112
|
-
</p>
|
|
113
|
-
|
|
114
108
|
---
|
|
115
109
|
|
|
116
110
|
## Why Ouroboros?
|
|
@@ -130,7 +124,7 @@ Most AI coding fails at the **input**, not the output. The bottleneck is not AI
|
|
|
130
124
|
**Install** — one command, everything auto-detected:
|
|
131
125
|
|
|
132
126
|
```bash
|
|
133
|
-
curl -fsSL https://raw.githubusercontent.com/Q00/ouroboros/
|
|
127
|
+
curl -fsSL https://raw.githubusercontent.com/Q00/ouroboros/main/scripts/install.sh | bash
|
|
134
128
|
```
|
|
135
129
|
|
|
136
130
|
**Build** — open your AI coding agent and go:
|
|
@@ -176,25 +170,6 @@ After one loop of the Ouroboros cycle, a vague idea becomes a verified codebase:
|
|
|
176
170
|
| **Seed** | No spec | Immutable specification with acceptance criteria, ontology, constraints |
|
|
177
171
|
| **Evaluate** | Manual review | 3-stage gate: Mechanical (free) -> Semantic -> Multi-Model Consensus |
|
|
178
172
|
|
|
179
|
-
<!-- Screenshots: replace placeholder paths with actual images after recording -->
|
|
180
|
-
<p align="center">
|
|
181
|
-
<strong>Interview Transcript</strong><br/>
|
|
182
|
-
<img src="./docs/images/demo-interview.png" width="720" alt="Ouroboros Socratic interview exposing hidden assumptions from a vague prompt"/><br/>
|
|
183
|
-
<sub>The Socratic Interviewer turns "build me a task CLI" into 12 clarified decisions.</sub>
|
|
184
|
-
</p>
|
|
185
|
-
|
|
186
|
-
<p align="center">
|
|
187
|
-
<strong>Seed Artifact</strong><br/>
|
|
188
|
-
<img src="./docs/images/demo-seed.png" width="720" alt="Ouroboros seed specification with acceptance criteria, ontology, and constraints"/><br/>
|
|
189
|
-
<sub>Immutable seed spec locks intent -- acceptance criteria, ontology, and constraints -- before a line of code is written.</sub>
|
|
190
|
-
</p>
|
|
191
|
-
|
|
192
|
-
<p align="center">
|
|
193
|
-
<strong>Evaluation Verdict</strong><br/>
|
|
194
|
-
<img src="./docs/images/demo-evaluation.png" width="720" alt="Ouroboros 3-stage evaluation gate showing mechanical, semantic, and consensus results"/><br/>
|
|
195
|
-
<sub>3-stage verification gate: Mechanical (free) -> Semantic -> Multi-Model Consensus.</sub>
|
|
196
|
-
</p>
|
|
197
|
-
|
|
198
173
|
<details>
|
|
199
174
|
<summary><strong>What just happened?</strong></summary>
|
|
200
175
|
|
|
@@ -112,7 +112,7 @@ Ouroboros는 이 철학을 **Double Diamond** 구조로 풀어냅니다:
|
|
|
112
112
|
**설치** — 한 줄이면 전부 자동:
|
|
113
113
|
|
|
114
114
|
```bash
|
|
115
|
-
curl -fsSL https://raw.githubusercontent.com/Q00/ouroboros/
|
|
115
|
+
curl -fsSL https://raw.githubusercontent.com/Q00/ouroboros/main/scripts/install.sh | bash
|
|
116
116
|
```
|
|
117
117
|
|
|
118
118
|
**시작** — AI 코딩 에이전트를 열고 바로:
|
|
@@ -40,18 +40,14 @@
|
|
|
40
40
|
|
|
41
41
|
> **Security Notice (2026-03-24): LiteLLM PyPI Supply Chain Attack**
|
|
42
42
|
>
|
|
43
|
-
> LiteLLM versions 1.82.7 and 1.82.8 on PyPI contained a malicious `.pth` file that
|
|
43
|
+
> LiteLLM versions **1.82.7** and **1.82.8** on PyPI contained a malicious `.pth` file that auto-executes on every Python startup, exfiltrating environment variables, API keys, and credentials to an external server.
|
|
44
44
|
>
|
|
45
|
-
> **
|
|
46
|
-
> - Fresh-installed Ouroboros (`pip install ouroboros-ai`, `uv tool install ouroboros-ai`), or
|
|
47
|
-
> - Upgraded an existing install (`pip install --upgrade ouroboros-ai`)
|
|
45
|
+
> **What we did:** Ouroboros now pins LiteLLM to **`<=1.82.6`** (safe versions only) as an optional dependency. LiteLLM is no longer a core dependency — it is only installed when you explicitly opt in via `pip install ouroboros-ai[litellm]`.
|
|
48
46
|
>
|
|
49
|
-
>
|
|
50
|
-
>
|
|
51
|
-
> **Ouroboros has removed litellm entirely** as of v0.25.2 (stable) and v0.26.0b7 (beta). However, **upgrading Ouroboros only removes litellm from the dependency list — it does NOT uninstall litellm itself or delete the malicious `.pth` file already on your system.** You must clean up manually:
|
|
47
|
+
> **If you previously installed litellm 1.82.7 or 1.82.8**, the malicious `.pth` file may still be on your system even after upgrading. Clean up manually:
|
|
52
48
|
>
|
|
53
49
|
> ```bash
|
|
54
|
-
> # 1. Find the malicious file
|
|
50
|
+
> # 1. Find and delete the malicious file
|
|
55
51
|
> find / -name "litellm_init.pth" 2>/dev/null
|
|
56
52
|
>
|
|
57
53
|
> # 2. Clean package manager caches
|
|
@@ -61,7 +57,7 @@
|
|
|
61
57
|
> # 3. Rotate ALL credentials that were on your system during the exposure window
|
|
62
58
|
> ```
|
|
63
59
|
>
|
|
64
|
-
> References: [LiteLLM #24512](https://github.com/BerriAI/litellm/issues/24512) · [Ouroboros #195](https://github.com/Q00/ouroboros/issues/195) · [
|
|
60
|
+
> References: [LiteLLM #24512](https://github.com/BerriAI/litellm/issues/24512) · [Ouroboros #195](https://github.com/Q00/ouroboros/issues/195) · [DSPy mitigation](https://github.com/stanfordnlp/dspy/commit/66e33399bf29)
|
|
65
61
|
|
|
66
62
|
---
|
|
67
63
|
|
|
@@ -69,11 +65,6 @@
|
|
|
69
65
|
|
|
70
66
|
Ouroboros sits between you and your AI runtime (Claude Code, Codex CLI, or others). It replaces ad-hoc prompting with a structured specification-first workflow: interview, crystallize, execute, evaluate, evolve.
|
|
71
67
|
|
|
72
|
-
<!-- TODO: Replace with demo GIF or asciicast -->
|
|
73
|
-
<p align="center">
|
|
74
|
-
<em>[Demo: 2-minute walkthrough from vague idea to verified code -- coming soon]</em>
|
|
75
|
-
</p>
|
|
76
|
-
|
|
77
68
|
---
|
|
78
69
|
|
|
79
70
|
## Why Ouroboros?
|
|
@@ -93,7 +84,7 @@ Most AI coding fails at the **input**, not the output. The bottleneck is not AI
|
|
|
93
84
|
**Install** — one command, everything auto-detected:
|
|
94
85
|
|
|
95
86
|
```bash
|
|
96
|
-
curl -fsSL https://raw.githubusercontent.com/Q00/ouroboros/
|
|
87
|
+
curl -fsSL https://raw.githubusercontent.com/Q00/ouroboros/main/scripts/install.sh | bash
|
|
97
88
|
```
|
|
98
89
|
|
|
99
90
|
**Build** — open your AI coding agent and go:
|
|
@@ -139,25 +130,6 @@ After one loop of the Ouroboros cycle, a vague idea becomes a verified codebase:
|
|
|
139
130
|
| **Seed** | No spec | Immutable specification with acceptance criteria, ontology, constraints |
|
|
140
131
|
| **Evaluate** | Manual review | 3-stage gate: Mechanical (free) -> Semantic -> Multi-Model Consensus |
|
|
141
132
|
|
|
142
|
-
<!-- Screenshots: replace placeholder paths with actual images after recording -->
|
|
143
|
-
<p align="center">
|
|
144
|
-
<strong>Interview Transcript</strong><br/>
|
|
145
|
-
<img src="./docs/images/demo-interview.png" width="720" alt="Ouroboros Socratic interview exposing hidden assumptions from a vague prompt"/><br/>
|
|
146
|
-
<sub>The Socratic Interviewer turns "build me a task CLI" into 12 clarified decisions.</sub>
|
|
147
|
-
</p>
|
|
148
|
-
|
|
149
|
-
<p align="center">
|
|
150
|
-
<strong>Seed Artifact</strong><br/>
|
|
151
|
-
<img src="./docs/images/demo-seed.png" width="720" alt="Ouroboros seed specification with acceptance criteria, ontology, and constraints"/><br/>
|
|
152
|
-
<sub>Immutable seed spec locks intent -- acceptance criteria, ontology, and constraints -- before a line of code is written.</sub>
|
|
153
|
-
</p>
|
|
154
|
-
|
|
155
|
-
<p align="center">
|
|
156
|
-
<strong>Evaluation Verdict</strong><br/>
|
|
157
|
-
<img src="./docs/images/demo-evaluation.png" width="720" alt="Ouroboros 3-stage evaluation gate showing mechanical, semantic, and consensus results"/><br/>
|
|
158
|
-
<sub>3-stage verification gate: Mechanical (free) -> Semantic -> Multi-Model Consensus.</sub>
|
|
159
|
-
</p>
|
|
160
|
-
|
|
161
133
|
<details>
|
|
162
134
|
<summary><strong>What just happened?</strong></summary>
|
|
163
135
|
|
|
@@ -12,7 +12,6 @@ dependencies = [
|
|
|
12
12
|
"cachetools>=5.0.0",
|
|
13
13
|
"filelock>=3.13.0",
|
|
14
14
|
"httpx>=0.27.0",
|
|
15
|
-
# "litellm>=1.80.0", # Removed: PyPI supply chain attack (issue #195)
|
|
16
15
|
"mcp>=1.26.0",
|
|
17
16
|
"prompt-toolkit>=3.0.0",
|
|
18
17
|
"pydantic>=2.0.0",
|
|
@@ -28,8 +27,8 @@ dependencies = [
|
|
|
28
27
|
|
|
29
28
|
[project.optional-dependencies]
|
|
30
29
|
claude = ["claude-agent-sdk>=0.1.0", "anthropic>=0.52.0"]
|
|
31
|
-
|
|
32
|
-
all = ["ouroboros-ai[claude,dashboard]"]
|
|
30
|
+
litellm = ["litellm>=1.80.0,<=1.82.6"]
|
|
31
|
+
all = ["ouroboros-ai[claude,litellm,dashboard]"]
|
|
33
32
|
dashboard = [
|
|
34
33
|
"streamlit>=1.40.0",
|
|
35
34
|
"plotly>=5.24.0",
|
|
@@ -66,7 +65,7 @@ packages = ["src/ouroboros"]
|
|
|
66
65
|
|
|
67
66
|
[dependency-groups]
|
|
68
67
|
dev = [
|
|
69
|
-
"ouroboros-ai[claude]",
|
|
68
|
+
"ouroboros-ai[claude,litellm]",
|
|
70
69
|
"mypy>=1.19.1",
|
|
71
70
|
"pre-commit>=4.5.1",
|
|
72
71
|
"pytest>=9.0.2",
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
#!/bin/bash
|
|
2
2
|
# Ouroboros installer — auto-detects runtime and installs accordingly.
|
|
3
|
-
# Usage: curl -fsSL https://raw.githubusercontent.com/Q00/ouroboros/
|
|
4
|
-
# TODO: Change URL back to main branch when 0.26.0 is officially released
|
|
3
|
+
# Usage: curl -fsSL https://raw.githubusercontent.com/Q00/ouroboros/main/scripts/install.sh | bash
|
|
5
4
|
set -euo pipefail
|
|
6
5
|
|
|
7
6
|
PACKAGE_NAME="ouroboros-ai"
|
|
@@ -211,10 +210,11 @@ with open(mcp_file, 'w') as f:
|
|
|
211
210
|
echo " MCP: skipped (no python3 found — add manually to $MCP_FILE)"
|
|
212
211
|
fi
|
|
213
212
|
|
|
214
|
-
# 5b. Install Ouroboros skills (claude plugin)
|
|
213
|
+
# 5b. Install/update Ouroboros skills (claude plugin)
|
|
215
214
|
echo " Installing Ouroboros skills..."
|
|
216
|
-
|
|
217
|
-
|
|
215
|
+
claude plugin marketplace add Q00/ouroboros 2>/dev/null || true
|
|
216
|
+
claude plugin marketplace update ouroboros 2>/dev/null || true
|
|
217
|
+
if claude plugin install ouroboros@ouroboros 2>/dev/null; then
|
|
218
218
|
echo " Skills: installed"
|
|
219
219
|
else
|
|
220
220
|
echo " Skills: skipped (install manually: claude plugin marketplace add Q00/ouroboros && claude plugin install ouroboros@ouroboros)"
|
|
@@ -217,7 +217,7 @@ A backup will be created: CLAUDE.md.bak
|
|
|
217
217
|
**If "Preview first", show:**
|
|
218
218
|
````markdown
|
|
219
219
|
<!-- ooo:START -->
|
|
220
|
-
<!-- ooo:VERSION:0.26.
|
|
220
|
+
<!-- ooo:VERSION:0.26.0 -->
|
|
221
221
|
# Ouroboros — Specification-First AI Development
|
|
222
222
|
|
|
223
223
|
> Before telling AI what to build, define what should be built.
|
|
@@ -116,7 +116,8 @@ When the user invokes this skill:
|
|
|
116
116
|
|
|
117
117
|
For Claude Code:
|
|
118
118
|
```bash
|
|
119
|
-
claude plugin update ouroboros
|
|
119
|
+
claude plugin marketplace update ouroboros 2>/dev/null || true
|
|
120
|
+
claude plugin install ouroboros@ouroboros
|
|
120
121
|
```
|
|
121
122
|
|
|
122
123
|
For Codex CLI (re-install skills/rules to ~/.codex/):
|
|
@@ -28,7 +28,7 @@ version_tuple: VERSION_TUPLE
|
|
|
28
28
|
commit_id: COMMIT_ID
|
|
29
29
|
__commit_id__: COMMIT_ID
|
|
30
30
|
|
|
31
|
-
__version__ = version = '0.26.
|
|
32
|
-
__version_tuple__ = version_tuple = (0, 26,
|
|
31
|
+
__version__ = version = '0.26.1.dev2'
|
|
32
|
+
__version_tuple__ = version_tuple = (0, 26, 1, 'dev2')
|
|
33
33
|
|
|
34
34
|
__commit_id__ = commit_id = None
|
|
@@ -448,17 +448,14 @@ Additional context (intentional deferrals — do not penalise):
|
|
|
448
448
|
except json.JSONDecodeError as e:
|
|
449
449
|
raise ValueError(f"Invalid JSON response: {e}") from e
|
|
450
450
|
|
|
451
|
-
#
|
|
452
|
-
|
|
451
|
+
# Numeric score fields must be present. Missing justifications are recoverable.
|
|
452
|
+
required_score_fields = [
|
|
453
453
|
"goal_clarity_score",
|
|
454
|
-
"goal_clarity_justification",
|
|
455
454
|
"constraint_clarity_score",
|
|
456
|
-
"constraint_clarity_justification",
|
|
457
455
|
"success_criteria_clarity_score",
|
|
458
|
-
"success_criteria_clarity_justification",
|
|
459
456
|
]
|
|
460
457
|
|
|
461
|
-
for field_name in
|
|
458
|
+
for field_name in required_score_fields:
|
|
462
459
|
if field_name not in data:
|
|
463
460
|
raise ValueError(f"Missing required field: {field_name}")
|
|
464
461
|
|
|
@@ -467,6 +464,15 @@ Additional context (intentional deferrals — do not penalise):
|
|
|
467
464
|
score = float(value)
|
|
468
465
|
return max(0.0, min(1.0, score))
|
|
469
466
|
|
|
467
|
+
def justification_for(field_name: str, component_name: str) -> str:
|
|
468
|
+
value = data.get(field_name)
|
|
469
|
+
if value is None:
|
|
470
|
+
return f"{component_name} justification not provided by model."
|
|
471
|
+
text = str(value).strip()
|
|
472
|
+
if not text:
|
|
473
|
+
return f"{component_name} justification not provided by model."
|
|
474
|
+
return text
|
|
475
|
+
|
|
470
476
|
# Select weights based on project type
|
|
471
477
|
if is_brownfield:
|
|
472
478
|
goal_weight = BROWNFIELD_GOAL_CLARITY_WEIGHT
|
|
@@ -484,7 +490,10 @@ Additional context (intentional deferrals — do not penalise):
|
|
|
484
490
|
name="Context Clarity",
|
|
485
491
|
clarity_score=clamp_score(data["context_clarity_score"]),
|
|
486
492
|
weight=BROWNFIELD_CONTEXT_CLARITY_WEIGHT,
|
|
487
|
-
justification=
|
|
493
|
+
justification=justification_for(
|
|
494
|
+
"context_clarity_justification",
|
|
495
|
+
"Context Clarity",
|
|
496
|
+
),
|
|
488
497
|
)
|
|
489
498
|
|
|
490
499
|
return ScoreBreakdown(
|
|
@@ -492,19 +501,28 @@ Additional context (intentional deferrals — do not penalise):
|
|
|
492
501
|
name="Goal Clarity",
|
|
493
502
|
clarity_score=clamp_score(data["goal_clarity_score"]),
|
|
494
503
|
weight=goal_weight,
|
|
495
|
-
justification=
|
|
504
|
+
justification=justification_for(
|
|
505
|
+
"goal_clarity_justification",
|
|
506
|
+
"Goal Clarity",
|
|
507
|
+
),
|
|
496
508
|
),
|
|
497
509
|
constraint_clarity=ComponentScore(
|
|
498
510
|
name="Constraint Clarity",
|
|
499
511
|
clarity_score=clamp_score(data["constraint_clarity_score"]),
|
|
500
512
|
weight=constraint_weight,
|
|
501
|
-
justification=
|
|
513
|
+
justification=justification_for(
|
|
514
|
+
"constraint_clarity_justification",
|
|
515
|
+
"Constraint Clarity",
|
|
516
|
+
),
|
|
502
517
|
),
|
|
503
518
|
success_criteria_clarity=ComponentScore(
|
|
504
519
|
name="Success Criteria Clarity",
|
|
505
520
|
clarity_score=clamp_score(data["success_criteria_clarity_score"]),
|
|
506
521
|
weight=criteria_weight,
|
|
507
|
-
justification=
|
|
522
|
+
justification=justification_for(
|
|
523
|
+
"success_criteria_clarity_justification",
|
|
524
|
+
"Success Criteria Clarity",
|
|
525
|
+
),
|
|
508
526
|
),
|
|
509
527
|
context_clarity=context_clarity,
|
|
510
528
|
)
|
|
@@ -58,6 +58,14 @@ def _derive_quality_bar(seed: "Seed") -> str:
|
|
|
58
58
|
return "The execution must satisfy all acceptance criteria:\n" + "\n".join(ac_lines)
|
|
59
59
|
|
|
60
60
|
|
|
61
|
+
def _get_verification_artifact(summary: dict[str, Any], final_message: str) -> str:
|
|
62
|
+
"""Prefer the structured verification report when present."""
|
|
63
|
+
verification_report = summary.get("verification_report")
|
|
64
|
+
if isinstance(verification_report, str) and verification_report:
|
|
65
|
+
return verification_report
|
|
66
|
+
return final_message or ""
|
|
67
|
+
|
|
68
|
+
|
|
61
69
|
def _load_seed_from_yaml(seed_file: Path) -> dict[str, Any]:
|
|
62
70
|
"""Load seed configuration from YAML file.
|
|
63
71
|
|
|
@@ -249,7 +257,7 @@ async def _run_orchestrator(
|
|
|
249
257
|
|
|
250
258
|
qa_result = await qa_handler.handle(
|
|
251
259
|
{
|
|
252
|
-
"artifact": res.final_message
|
|
260
|
+
"artifact": _get_verification_artifact(res.summary, res.final_message),
|
|
253
261
|
"artifact_type": "test_output",
|
|
254
262
|
"quality_bar": quality_bar,
|
|
255
263
|
"seed_content": yaml.dump(seed_data, default_flow_style=False),
|
|
@@ -889,7 +889,15 @@ class EvolutionaryLoop:
|
|
|
889
889
|
exec_result = await self.executor(current_seed, parallel=parallel)
|
|
890
890
|
if hasattr(exec_result, "is_ok") and exec_result.is_ok:
|
|
891
891
|
orch_result = exec_result.value
|
|
892
|
-
|
|
892
|
+
summary = getattr(orch_result, "summary", {})
|
|
893
|
+
verification_report = (
|
|
894
|
+
summary.get("verification_report") if isinstance(summary, dict) else None
|
|
895
|
+
)
|
|
896
|
+
execution_output = (
|
|
897
|
+
verification_report
|
|
898
|
+
if isinstance(verification_report, str) and verification_report
|
|
899
|
+
else getattr(orch_result, "final_message", str(orch_result))
|
|
900
|
+
)
|
|
893
901
|
# Log structured metadata for observability
|
|
894
902
|
logger.info(
|
|
895
903
|
"evolution.generation.executed",
|
|
@@ -409,7 +409,10 @@ class ExecuteSeedHandler:
|
|
|
409
409
|
quality_bar = self._derive_quality_bar(_seed)
|
|
410
410
|
await qa_handler.handle(
|
|
411
411
|
{
|
|
412
|
-
"artifact":
|
|
412
|
+
"artifact": self._get_verification_artifact(
|
|
413
|
+
result.value.summary,
|
|
414
|
+
result.value.final_message,
|
|
415
|
+
),
|
|
413
416
|
"artifact_type": "test_output",
|
|
414
417
|
"quality_bar": quality_bar,
|
|
415
418
|
"seed_content": _seed_content,
|
|
@@ -500,6 +503,14 @@ class ExecuteSeedHandler:
|
|
|
500
503
|
ac_lines = [f"- {ac}" for ac in seed.acceptance_criteria]
|
|
501
504
|
return "The execution must satisfy all acceptance criteria:\n" + "\n".join(ac_lines)
|
|
502
505
|
|
|
506
|
+
@staticmethod
|
|
507
|
+
def _get_verification_artifact(summary: dict[str, Any], final_message: str) -> str:
|
|
508
|
+
"""Prefer the structured verification report when present."""
|
|
509
|
+
verification_report = summary.get("verification_report")
|
|
510
|
+
if isinstance(verification_report, str) and verification_report:
|
|
511
|
+
return verification_report
|
|
512
|
+
return final_message or ""
|
|
513
|
+
|
|
503
514
|
@staticmethod
|
|
504
515
|
def _format_execution_result(exec_result, seed: Seed) -> str:
|
|
505
516
|
"""Format execution result as human-readable text.
|
|
@@ -728,6 +728,25 @@ class CodexCliRuntime:
|
|
|
728
728
|
return None
|
|
729
729
|
return current_handle.native_session_id
|
|
730
730
|
|
|
731
|
+
def _build_child_env(self) -> dict[str, str]:
|
|
732
|
+
"""Build an isolated environment for child runtime processes.
|
|
733
|
+
|
|
734
|
+
Strips ``OUROBOROS_AGENT_RUNTIME`` and ``OUROBOROS_LLM_BACKEND`` so
|
|
735
|
+
that a child Codex process does not re-load the Ouroboros MCP server,
|
|
736
|
+
preventing the recursive startup loop described in #185.
|
|
737
|
+
"""
|
|
738
|
+
env = os.environ.copy()
|
|
739
|
+
# Prevent child from re-entering Ouroboros MCP
|
|
740
|
+
for key in ("OUROBOROS_AGENT_RUNTIME", "OUROBOROS_LLM_BACKEND"):
|
|
741
|
+
env.pop(key, None)
|
|
742
|
+
# Track recursion depth for diagnostics (defensive: ignore malformed values)
|
|
743
|
+
try:
|
|
744
|
+
depth = int(env.get("_OUROBOROS_DEPTH", "0")) + 1
|
|
745
|
+
except (ValueError, TypeError):
|
|
746
|
+
depth = 1
|
|
747
|
+
env["_OUROBOROS_DEPTH"] = str(depth)
|
|
748
|
+
return env
|
|
749
|
+
|
|
731
750
|
def _requires_process_stdin(self) -> bool:
|
|
732
751
|
"""Return True when the runtime needs a writable stdin pipe."""
|
|
733
752
|
return True
|
|
@@ -1441,6 +1460,7 @@ class CodexCliRuntime:
|
|
|
1441
1460
|
stdin=(asyncio.subprocess.PIPE if self._requires_process_stdin() else None),
|
|
1442
1461
|
stdout=asyncio.subprocess.PIPE,
|
|
1443
1462
|
stderr=asyncio.subprocess.PIPE,
|
|
1463
|
+
env=self._build_child_env(),
|
|
1444
1464
|
)
|
|
1445
1465
|
except FileNotFoundError as e:
|
|
1446
1466
|
yield AgentMessage(
|