ouroboros-ai 0.25.3.dev89__tar.gz → 0.25.3.dev91__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.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/CONTRIBUTING.md +2 -2
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/PKG-INFO +1 -24
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/README.md +0 -23
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/docs/cli-reference.md +5 -9
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/docs/guides/seed-authoring.md +11 -15
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/docs/runtime-guides/claude-code.md +9 -9
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/_version.py +2 -2
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/cli/commands/init.py +35 -51
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/orchestrator/__init__.py +4 -5
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/persistence/event_store.py +7 -7
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/tui/screens/session_selector.py +9 -1
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/cli/test_init_runtime.py +3 -6
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/cli/test_main.py +1 -1
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/persistence/test_event_store.py +64 -0
- ouroboros_ai-0.25.3.dev91/tests/unit/tui/test_session_selector_replay.py +177 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/.claude/settings.json +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/.claude-plugin/.mcp.json +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/.claude-plugin/marketplace.json +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/.claude-plugin/plugin.json +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/.env.example +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/.github/workflows/dev-publish.yml +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/.github/workflows/lint.yml +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/.github/workflows/release.yml +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/.github/workflows/test.yml +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/.gitignore +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/.mcp.json +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/.ouroboros/mechanical.toml +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/.pre-commit-config.yaml +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/.python-version +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/CHANGELOG.md +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/CLAUDE.md +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/HANDOFF.md +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/LICENSE +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/README.ko.md +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/SECURITY.md +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/commands/cancel.md +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/commands/evaluate.md +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/commands/evolve.md +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/commands/help.md +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/commands/interview.md +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/commands/ralph.md +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/commands/run.md +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/commands/seed.md +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/commands/setup.md +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/commands/status.md +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/commands/tutorial.md +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/commands/unstuck.md +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/commands/welcome.md +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/crates/ouroboros-tui/.gitignore +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/crates/ouroboros-tui/Cargo.lock +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/crates/ouroboros-tui/Cargo.toml +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/crates/ouroboros-tui/README.md +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/crates/ouroboros-tui/src/db.rs +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/crates/ouroboros-tui/src/main.rs +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/crates/ouroboros-tui/src/mock.rs +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/crates/ouroboros-tui/src/state.rs +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/crates/ouroboros-tui/src/views/dashboard.rs +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/crates/ouroboros-tui/src/views/execution.rs +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/crates/ouroboros-tui/src/views/lineage.rs +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/crates/ouroboros-tui/src/views/logs.rs +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/crates/ouroboros-tui/src/views/mod.rs +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/crates/ouroboros-tui/src/views/session_selector.rs +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/docs/README.md +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/docs/api/README.md +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/docs/api/core.md +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/docs/api/mcp.md +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/docs/architecture.md +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/docs/config-reference.md +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/docs/contributing/architecture-overview.md +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/docs/contributing/findings-registry.md +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/docs/contributing/key-patterns.md +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/docs/contributing/testing-guide.md +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/docs/examples/mcp-config.yaml +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/docs/getting-started.md +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/docs/guides/evaluation-pipeline.md +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/docs/guides/evolution-loop.md +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/docs/guides/issue-176-subagent-mcp-inheritance.md +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/docs/guides/tui-usage.md +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/docs/images/PLACEHOLDER_README.md +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/docs/images/demo-evaluation.png +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/docs/images/demo-interview.png +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/docs/images/demo-seed.png +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/docs/images/demo-tui-dashboard.png +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/docs/images/ouroboros.png +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/docs/platform-support.md +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/docs/runtime-capability-matrix.md +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/docs/runtime-guides/codex.md +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/examples/coordinator_test_seed.yaml +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/examples/dummy_seed.yaml +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/examples/parallel_subac_test_seed.yaml +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/examples/subac_test_seed.yaml +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/examples/task_manager/README.md +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/examples/task_manager/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/examples/task_manager/__main__.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/examples/task_manager/cli.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/examples/task_manager/models.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/examples/task_manager/storage.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/examples/test_display.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/hooks/hooks.json +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/llms-full.txt +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/llms.txt +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/project-context.md +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/pyproject.toml +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/scripts/drift-monitor.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/scripts/install.sh +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/scripts/keyword-detector.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/scripts/mcp-serve.sh +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/scripts/ralph-rewind.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/scripts/ralph.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/scripts/ralph.sh +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/scripts/session-start.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/scripts/sync-plugin-version.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/scripts/version-check.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/skills/brownfield/SKILL.md +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/skills/cancel/SKILL.md +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/skills/evaluate/SKILL.md +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/skills/evolve/SKILL.md +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/skills/help/SKILL.md +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/skills/interview/SKILL.md +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/skills/pm/SKILL.md +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/skills/qa/SKILL.md +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/skills/ralph/SKILL.md +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/skills/run/SKILL.md +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/skills/seed/SKILL.md +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/skills/setup/SKILL.md +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/skills/status/SKILL.md +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/skills/tutorial/SKILL.md +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/skills/unstuck/SKILL.md +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/skills/update/SKILL.md +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/skills/welcome/SKILL.md +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/__main__.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/agents/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/agents/advocate.md +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/agents/analysis-agent.md +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/agents/architect.md +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/agents/breadth-keeper.md +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/agents/code-executor.md +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/agents/codebase-explorer.md +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/agents/consensus-reviewer.md +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/agents/contrarian.md +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/agents/evaluator.md +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/agents/hacker.md +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/agents/judge.md +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/agents/loader.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/agents/ontologist.md +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/agents/ontology-analyst.md +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/agents/qa-judge.md +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/agents/research-agent.md +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/agents/researcher.md +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/agents/seed-architect.md +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/agents/seed-closer.md +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/agents/semantic-evaluator.md +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/agents/simplifier.md +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/agents/socratic-interviewer.md +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/bigbang/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/bigbang/ambiguity.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/bigbang/brownfield.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/bigbang/explore.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/bigbang/interview.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/bigbang/pm_document.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/bigbang/pm_interview.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/bigbang/pm_seed.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/bigbang/question_classifier.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/bigbang/seed_generator.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/cli/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/cli/commands/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/cli/commands/cancel.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/cli/commands/config.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/cli/commands/mcp.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/cli/commands/pm.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/cli/commands/run.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/cli/commands/setup.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/cli/commands/status.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/cli/commands/tui.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/cli/formatters/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/cli/formatters/panels.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/cli/formatters/progress.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/cli/formatters/tables.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/cli/formatters/workflow_display.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/cli/main.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/codex/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/codex/artifacts.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/codex/ouroboros.md +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/codex_permissions.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/config/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/config/loader.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/config/models.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/core/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/core/ac_tree.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/core/context.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/core/errors.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/core/file_lock.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/core/git_workflow.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/core/lineage.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/core/ontology_aspect.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/core/ontology_questions.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/core/security.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/core/seed.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/core/text.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/core/types.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/evaluation/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/evaluation/artifact_collector.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/evaluation/consensus.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/evaluation/json_utils.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/evaluation/languages.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/evaluation/mechanical.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/evaluation/models.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/evaluation/pipeline.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/evaluation/semantic.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/evaluation/trigger.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/events/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/events/base.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/events/decomposition.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/events/evaluation.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/events/interview.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/events/lineage.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/events/ontology.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/evolution/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/evolution/convergence.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/evolution/loop.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/evolution/projector.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/evolution/reflect.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/evolution/regression.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/evolution/wonder.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/execution/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/execution/atomicity.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/execution/decomposition.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/execution/double_diamond.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/execution/subagent.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/mcp/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/mcp/client/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/mcp/client/adapter.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/mcp/client/manager.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/mcp/client/protocol.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/mcp/errors.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/mcp/job_manager.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/mcp/resources/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/mcp/resources/handlers.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/mcp/server/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/mcp/server/adapter.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/mcp/server/protocol.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/mcp/server/security.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/mcp/tools/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/mcp/tools/authoring_handlers.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/mcp/tools/brownfield_handler.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/mcp/tools/dashboard.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/mcp/tools/definitions.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/mcp/tools/evaluation_handlers.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/mcp/tools/evolution_handlers.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/mcp/tools/execution_handlers.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/mcp/tools/job_handlers.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/mcp/tools/pm_handler.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/mcp/tools/qa.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/mcp/tools/query_handlers.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/mcp/tools/registry.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/mcp/types.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/observability/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/observability/drift.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/observability/logging.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/observability/retrospective.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/orchestrator/adapter.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/orchestrator/codex_cli_runtime.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/orchestrator/command_dispatcher.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/orchestrator/coordinator.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/orchestrator/dependency_analyzer.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/orchestrator/events.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/orchestrator/execution_runtime_scope.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/orchestrator/execution_strategy.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/orchestrator/heartbeat.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/orchestrator/level_context.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/orchestrator/mcp_config.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/orchestrator/mcp_tools.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/orchestrator/parallel_executor.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/orchestrator/parallel_executor_models.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/orchestrator/runner.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/orchestrator/runtime_factory.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/orchestrator/runtime_message_projection.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/orchestrator/session.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/orchestrator/workflow_state.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/persistence/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/persistence/brownfield.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/persistence/checkpoint.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/persistence/migrations/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/persistence/migrations/runner.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/persistence/migrations/scripts/001_initial.sql +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/persistence/migrations/scripts/002_brownfield.sql +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/persistence/schema.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/persistence/uow.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/plugin/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/plugin/agents/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/plugin/agents/pool.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/plugin/agents/registry.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/plugin/orchestration/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/plugin/orchestration/router.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/plugin/orchestration/scheduler.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/plugin/skills/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/plugin/skills/docs.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/plugin/skills/executor.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/plugin/skills/keywords.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/plugin/skills/registry.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/pm/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/pm/renderer.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/providers/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/providers/anthropic_adapter.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/providers/base.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/providers/claude_code_adapter.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/providers/codex_cli_adapter.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/providers/codex_cli_stream.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/providers/factory.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/providers/litellm_adapter.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/py.typed +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/resilience/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/resilience/lateral.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/resilience/stagnation.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/routing/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/routing/complexity.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/routing/downgrade.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/routing/escalation.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/routing/router.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/routing/tiers.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/secondary/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/secondary/scheduler.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/secondary/todo_registry.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/strategies/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/strategies/devil_advocate.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/tui/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/tui/app.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/tui/components/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/tui/components/agents_panel.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/tui/components/event_log.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/tui/components/progress.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/tui/components/token_tracker.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/tui/events.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/tui/screens/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/tui/screens/confirm_rewind.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/tui/screens/dashboard.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/tui/screens/dashboard_v2.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/tui/screens/dashboard_v3.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/tui/screens/debug.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/tui/screens/execution.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/tui/screens/hud_dashboard.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/tui/screens/lineage_detail.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/tui/screens/lineage_selector.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/tui/screens/logs.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/tui/widgets/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/tui/widgets/ac_progress.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/tui/widgets/ac_tree.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/tui/widgets/agent_activity.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/tui/widgets/cost_tracker.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/tui/widgets/drift_meter.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/tui/widgets/lineage_tree.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/tui/widgets/parallel_graph.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/tui/widgets/phase_progress.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/verification/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/verification/extractor.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/verification/models.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/verification/verifier.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/conftest.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/e2e/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/e2e/conftest.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/e2e/test_cli_commands.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/e2e/test_full_workflow.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/e2e/test_session_persistence.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/fixtures/test_atomicity_seed.yml +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/integration/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/integration/conftest.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/integration/mcp/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/integration/mcp/conftest.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/integration/mcp/test_client_adapter.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/integration/mcp/test_client_manager.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/integration/mcp/test_server_adapter.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/integration/plugin/test_orchestration.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/integration/test_codex_cli_passthrough_smoke.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/integration/test_codex_skill_fallback.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/integration/test_codex_skill_smoke.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/integration/test_entry_point.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/agents/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/agents/test_loader.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/bigbang/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/bigbang/test_ambiguity.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/bigbang/test_brownfield.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/bigbang/test_classifier_context.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/bigbang/test_decide_later_items.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/bigbang/test_explore.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/bigbang/test_interview.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/bigbang/test_pm_document_generator.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/bigbang/test_pm_document_writer.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/bigbang/test_pm_interview.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/bigbang/test_pm_interview_brownfield_db.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/bigbang/test_pm_seed_ac12.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/bigbang/test_pm_seed_save.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/bigbang/test_question_classifier.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/bigbang/test_seed_generator.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/cli/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/cli/formatters/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/cli/formatters/test_console.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/cli/formatters/test_panels.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/cli/formatters/test_progress.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/cli/formatters/test_tables.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/cli/formatters/test_workflow_display.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/cli/test_cancel.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/cli/test_init_pm_seed_detection.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/cli/test_mcp_nested_guard.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/cli/test_mcp_startup_cleanup.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/cli/test_pm_brownfield.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/cli/test_pm_overwrite.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/cli/test_pm_select_repos.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/cli/test_setup.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/config/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/config/test_loader.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/config/test_models.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/core/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/core/test_ac_tree.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/core/test_context.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/core/test_errors.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/core/test_git_workflow.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/core/test_lineage.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/core/test_ontology_aspect.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/core/test_ontology_questions.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/core/test_security.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/core/test_seed.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/core/test_types.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/evaluation/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/evaluation/test_consensus.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/evaluation/test_json_utils.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/evaluation/test_languages.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/evaluation/test_mechanical.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/evaluation/test_models.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/evaluation/test_semantic.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/evaluation/test_trigger.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/events/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/events/test_base.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/events/test_decomposition_events.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/evolution/test_wonder_scope.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/execution/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/execution/test_atomicity.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/execution/test_decomposition.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/execution/test_double_diamond.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/execution/test_subagent_isolation.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/mcp/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/mcp/client/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/mcp/client/test_adapter.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/mcp/client/test_manager.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/mcp/conftest.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/mcp/server/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/mcp/server/test_adapter.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/mcp/server/test_security.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/mcp/test_errors.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/mcp/test_job_manager.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/mcp/test_types.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/mcp/tools/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/mcp/tools/conftest.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/mcp/tools/test_brownfield_handler.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/mcp/tools/test_definitions.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/mcp/tools/test_pm_handler.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/mcp/tools/test_pm_handler_generate.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/mcp/tools/test_pm_handler_pending_reframe.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/mcp/tools/test_qa_integration.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/mcp/tools/test_registry.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/observability/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/observability/test_drift.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/observability/test_logging.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/observability/test_retrospective.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/orchestrator/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/orchestrator/test_adapter.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/orchestrator/test_codex_cli_runtime.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/orchestrator/test_codex_recursion_guard.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/orchestrator/test_command_dispatcher.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/orchestrator/test_coordinator.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/orchestrator/test_dependency_analyzer.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/orchestrator/test_events.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/orchestrator/test_execution_runtime_scope.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/orchestrator/test_execution_strategy.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/orchestrator/test_inflight_cancellation.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/orchestrator/test_level_context.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/orchestrator/test_mcp_config.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/orchestrator/test_mcp_tools.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/orchestrator/test_parallel_executor.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/orchestrator/test_parallel_executor_retry_resume.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/orchestrator/test_runner.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/orchestrator/test_runner_cancellation.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/orchestrator/test_runtime_factory.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/orchestrator/test_runtime_message_projection.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/orchestrator/test_session.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/orchestrator/test_workflow_state.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/persistence/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/persistence/test_brownfield_store.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/persistence/test_checkpoint.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/persistence/test_schema.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/persistence/test_uow.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/plugin/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/plugin/agents/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/plugin/agents/test_registry.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/plugin/orchestration/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/plugin/orchestration/test_model_router.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/plugin/skills/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/plugin/skills/test_keywords.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/plugin/skills/test_registry.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/pm/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/pm/test_renderer.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/providers/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/providers/test_base.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/providers/test_claude_code_adapter.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/providers/test_codex_cli_adapter.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/providers/test_factory.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/providers/test_litellm_adapter.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/resilience/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/resilience/test_lateral.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/resilience/test_stagnation.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/routing/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/routing/test_complexity.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/routing/test_downgrade.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/routing/test_escalation.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/routing/test_router.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/routing/test_tiers.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/scripts/test_keyword_detector.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/scripts/test_version_check.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/secondary/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/secondary/test_scheduler.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/secondary/test_todo_registry.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/test_artifact_collector.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/test_codex_artifacts.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/test_convergence.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/test_dashboard.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/test_dependencies_configured.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/test_evolve_rewind.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/test_evolve_step.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/test_main_entry_point.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/test_module_structure.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/test_project_initialization.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/test_projector_rewind.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/test_ralph_parser.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/test_ralph_rewind.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/test_regression.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/test_tooling_configuration.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/test_verification.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/tui/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/tui/test_app.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/tui/test_cancelled_display.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/tui/test_events.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/tui/test_lineage_viewer.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/tui/test_screens.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tests/unit/tui/test_widgets.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/tools/sync_github_project.py +0 -0
- {ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/uv.lock +0 -0
|
@@ -452,7 +452,7 @@ Any change to a file under `src/ouroboros/cli/commands/` requires reviewing and
|
|
|
452
452
|
|
|
453
453
|
#### `init.py` — `ouroboros init` / `ouroboros init start`
|
|
454
454
|
|
|
455
|
-
Flags covered: `--resume`, `--state-dir`, `--
|
|
455
|
+
Flags covered: `--resume`, `--state-dir`, `--runtime`, `--llm-backend`, `--debug` (`--orchestrator` is deprecated/hidden)
|
|
456
456
|
|
|
457
457
|
**Must update:**
|
|
458
458
|
- `docs/cli-reference.md` — `init` command section (flags, examples)
|
|
@@ -461,7 +461,7 @@ Flags covered: `--resume`, `--state-dir`, `--orchestrator`, `--runtime`, `--llm-
|
|
|
461
461
|
- `docs/getting-started.md` — onboarding flow
|
|
462
462
|
|
|
463
463
|
**Also check:**
|
|
464
|
-
- `docs/runtime-guides/claude-code.md` and `docs/runtime-guides/codex.md` — if `--
|
|
464
|
+
- `docs/runtime-guides/claude-code.md` and `docs/runtime-guides/codex.md` — if `--runtime` or `--llm-backend` behavior changes
|
|
465
465
|
|
|
466
466
|
#### `run.py` — `ouroboros run workflow`
|
|
467
467
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: ouroboros-ai
|
|
3
|
-
Version: 0.25.3.
|
|
3
|
+
Version: 0.25.3.dev91
|
|
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
|
|
@@ -105,11 +105,6 @@ Description-Content-Type: text/markdown
|
|
|
105
105
|
|
|
106
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.
|
|
107
107
|
|
|
108
|
-
<!-- TODO: Replace with demo GIF or asciicast -->
|
|
109
|
-
<p align="center">
|
|
110
|
-
<em>[Demo: 2-minute walkthrough from vague idea to verified code -- coming soon]</em>
|
|
111
|
-
</p>
|
|
112
|
-
|
|
113
108
|
---
|
|
114
109
|
|
|
115
110
|
## Why Ouroboros?
|
|
@@ -175,24 +170,6 @@ After one loop of the Ouroboros cycle, a vague idea becomes a verified codebase:
|
|
|
175
170
|
| **Seed** | No spec | Immutable specification with acceptance criteria, ontology, constraints |
|
|
176
171
|
| **Evaluate** | Manual review | 3-stage gate: Mechanical (free) -> Semantic -> Multi-Model Consensus |
|
|
177
172
|
|
|
178
|
-
<!-- Screenshots: replace placeholder paths with actual images after recording -->
|
|
179
|
-
<p align="center">
|
|
180
|
-
<strong>Interview Transcript</strong><br/>
|
|
181
|
-
<img src="./docs/images/demo-interview.png" width="720" alt="Ouroboros Socratic interview exposing hidden assumptions from a vague prompt"/><br/>
|
|
182
|
-
<sub>The Socratic Interviewer turns "build me a task CLI" into 12 clarified decisions.</sub>
|
|
183
|
-
</p>
|
|
184
|
-
|
|
185
|
-
<p align="center">
|
|
186
|
-
<strong>Seed Artifact</strong><br/>
|
|
187
|
-
<img src="./docs/images/demo-seed.png" width="720" alt="Ouroboros seed specification with acceptance criteria, ontology, and constraints"/><br/>
|
|
188
|
-
<sub>Immutable seed spec locks intent -- acceptance criteria, ontology, and constraints -- before a line of code is written.</sub>
|
|
189
|
-
</p>
|
|
190
|
-
|
|
191
|
-
<p align="center">
|
|
192
|
-
<strong>Evaluation Verdict</strong><br/>
|
|
193
|
-
<img src="./docs/images/demo-evaluation.png" width="720" alt="Ouroboros 3-stage evaluation gate showing mechanical, semantic, and consensus results"/><br/>
|
|
194
|
-
<sub>3-stage verification gate: Mechanical (free) -> Semantic -> Multi-Model Consensus.</sub>
|
|
195
|
-
</p>
|
|
196
173
|
|
|
197
174
|
<details>
|
|
198
175
|
<summary><strong>What just happened?</strong></summary>
|
|
@@ -65,11 +65,6 @@
|
|
|
65
65
|
|
|
66
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.
|
|
67
67
|
|
|
68
|
-
<!-- TODO: Replace with demo GIF or asciicast -->
|
|
69
|
-
<p align="center">
|
|
70
|
-
<em>[Demo: 2-minute walkthrough from vague idea to verified code -- coming soon]</em>
|
|
71
|
-
</p>
|
|
72
|
-
|
|
73
68
|
---
|
|
74
69
|
|
|
75
70
|
## Why Ouroboros?
|
|
@@ -135,24 +130,6 @@ After one loop of the Ouroboros cycle, a vague idea becomes a verified codebase:
|
|
|
135
130
|
| **Seed** | No spec | Immutable specification with acceptance criteria, ontology, constraints |
|
|
136
131
|
| **Evaluate** | Manual review | 3-stage gate: Mechanical (free) -> Semantic -> Multi-Model Consensus |
|
|
137
132
|
|
|
138
|
-
<!-- Screenshots: replace placeholder paths with actual images after recording -->
|
|
139
|
-
<p align="center">
|
|
140
|
-
<strong>Interview Transcript</strong><br/>
|
|
141
|
-
<img src="./docs/images/demo-interview.png" width="720" alt="Ouroboros Socratic interview exposing hidden assumptions from a vague prompt"/><br/>
|
|
142
|
-
<sub>The Socratic Interviewer turns "build me a task CLI" into 12 clarified decisions.</sub>
|
|
143
|
-
</p>
|
|
144
|
-
|
|
145
|
-
<p align="center">
|
|
146
|
-
<strong>Seed Artifact</strong><br/>
|
|
147
|
-
<img src="./docs/images/demo-seed.png" width="720" alt="Ouroboros seed specification with acceptance criteria, ontology, and constraints"/><br/>
|
|
148
|
-
<sub>Immutable seed spec locks intent -- acceptance criteria, ontology, and constraints -- before a line of code is written.</sub>
|
|
149
|
-
</p>
|
|
150
|
-
|
|
151
|
-
<p align="center">
|
|
152
|
-
<strong>Evaluation Verdict</strong><br/>
|
|
153
|
-
<img src="./docs/images/demo-evaluation.png" width="720" alt="Ouroboros 3-stage evaluation gate showing mechanical, semantic, and consensus results"/><br/>
|
|
154
|
-
<sub>3-stage verification gate: Mechanical (free) -> Semantic -> Multi-Model Consensus.</sub>
|
|
155
|
-
</p>
|
|
156
133
|
|
|
157
134
|
<details>
|
|
158
135
|
<summary><strong>What just happened?</strong></summary>
|
|
@@ -130,9 +130,8 @@ ouroboros init [start] [OPTIONS] [CONTEXT]
|
|
|
130
130
|
|--------|-------------|
|
|
131
131
|
| `-r, --resume TEXT` | Resume an existing interview by ID |
|
|
132
132
|
| `--state-dir DIRECTORY` | Custom directory for interview state files |
|
|
133
|
-
|
|
|
134
|
-
| `--
|
|
135
|
-
| `--llm-backend TEXT` | LLM backend for interview, ambiguity scoring, and seed generation (`claude_code`, `litellm`, `codex`). `opencode` appears in the CLI enum but is out of scope |
|
|
133
|
+
| `--runtime TEXT` | Agent runtime backend for the workflow execution step after seed generation (`claude`, `codex`). |
|
|
134
|
+
| `--llm-backend TEXT` | LLM backend override for interview, ambiguity scoring, and seed generation (`claude_code`, `litellm`, `codex`). Resolved from config (`llm.backend`) by default. |
|
|
136
135
|
| `-d, --debug` | Show verbose logs including debug messages |
|
|
137
136
|
|
|
138
137
|
**Examples:**
|
|
@@ -144,13 +143,10 @@ ouroboros init "I want to build a task management CLI tool"
|
|
|
144
143
|
# Explicit subcommand (equivalent)
|
|
145
144
|
ouroboros init start "I want to build a task management CLI tool"
|
|
146
145
|
|
|
147
|
-
# Start with Claude Code (no API key needed)
|
|
148
|
-
ouroboros init --orchestrator "Build a REST API"
|
|
149
|
-
|
|
150
146
|
# Specify runtime backend for the workflow step
|
|
151
|
-
ouroboros init --
|
|
147
|
+
ouroboros init --runtime codex "Build a REST API"
|
|
152
148
|
|
|
153
|
-
#
|
|
149
|
+
# Override LLM backend for interview and seed generation
|
|
154
150
|
ouroboros init --llm-backend codex "Build a REST API"
|
|
155
151
|
|
|
156
152
|
# Resume an interrupted interview
|
|
@@ -203,7 +199,7 @@ ouroboros run [workflow] [OPTIONS] SEED_FILE
|
|
|
203
199
|
|
|
204
200
|
| Option | Description |
|
|
205
201
|
|--------|-------------|
|
|
206
|
-
| `-o/-O, --orchestrator/--no-orchestrator` |
|
|
202
|
+
| `-o/-O, --orchestrator/--no-orchestrator` | Orchestrator mode (default: enabled). `--no-orchestrator` falls back to legacy placeholder mode. |
|
|
207
203
|
| `--runtime TEXT` | Agent runtime backend override (`claude`, `codex`). Uses configured default if omitted. (`opencode` is in the CLI enum but out of scope) |
|
|
208
204
|
| `-r, --resume TEXT` | Resume a previous orchestrator session by ID |
|
|
209
205
|
| `--mcp-config PATH` | Path to MCP client configuration YAML file |
|
|
@@ -335,7 +335,7 @@ acceptance_criteria:
|
|
|
335
335
|
|
|
336
336
|
## Validation
|
|
337
337
|
|
|
338
|
-
> **Note — `--dry-run` is not functional in the current implementation.** In the default orchestrator mode
|
|
338
|
+
> **Note — `--dry-run` is not functional in the current implementation.** In the default orchestrator mode, the `--dry-run` flag is silently ignored and execution proceeds normally. In legacy non-orchestrator mode (`--no-orchestrator`), `--dry-run` prints a placeholder message without performing any YAML or schema checks. This limitation is tracked for a future release.
|
|
339
339
|
|
|
340
340
|
**Current approach to pre-run validation:** Run the workflow normally. Schema validation errors surface *before* any agent sessions start, so an invalid seed will print an error and exit without executing:
|
|
341
341
|
|
|
@@ -394,10 +394,10 @@ export ANTHROPIC_API_KEY="sk-ant-..."
|
|
|
394
394
|
# or
|
|
395
395
|
export OPENAI_API_KEY="sk-..."
|
|
396
396
|
|
|
397
|
-
# To avoid needing an API key, use Claude Code (
|
|
397
|
+
# To avoid needing an API key, use Claude Code or Codex CLI (configured in llm.backend):
|
|
398
398
|
ooo interview "Build a REST API"
|
|
399
399
|
# or standalone:
|
|
400
|
-
ouroboros init start
|
|
400
|
+
ouroboros init start "Build a REST API"
|
|
401
401
|
```
|
|
402
402
|
|
|
403
403
|
#### LLM rate-limit or transient API error during questioning
|
|
@@ -708,22 +708,18 @@ ouroboros run minimal_seed.yaml
|
|
|
708
708
|
|
|
709
709
|
---
|
|
710
710
|
|
|
711
|
-
### CLI Flag
|
|
711
|
+
### CLI Flag Notes
|
|
712
712
|
|
|
713
|
-
#### `--
|
|
713
|
+
#### `--orchestrator` (init command)
|
|
714
714
|
|
|
715
|
-
**
|
|
716
|
-
```
|
|
717
|
-
Warning: --runtime only affects the workflow execution step when --orchestrator is enabled.
|
|
718
|
-
```
|
|
715
|
+
The `--orchestrator` flag on `ouroboros init` is **deprecated** and no longer needed. The LLM backend is resolved from config (`llm.backend`) automatically. The flag is accepted for backward compatibility but has no effect.
|
|
719
716
|
|
|
720
|
-
**Cause:** `--runtime` (e.g., `--runtime codex`) was passed to `ouroboros init` without `--orchestrator`. The `--runtime` flag only controls which agent runtime backend is used when the generated seed is immediately handed off to workflow execution. Without `--orchestrator`, the workflow handoff step uses a placeholder.
|
|
721
|
-
|
|
722
|
-
**Behavior:** This is a **warning only** — the interview and seed generation proceed normally. The runtime flag has no effect.
|
|
723
|
-
|
|
724
|
-
**Fix:** Add `--orchestrator` if you want to use the specified runtime backend for the post-generation workflow step:
|
|
725
717
|
```bash
|
|
726
|
-
|
|
718
|
+
# Just use:
|
|
719
|
+
ouroboros init start "Build a REST API"
|
|
720
|
+
|
|
721
|
+
# Override backend explicitly if needed:
|
|
722
|
+
ouroboros init start --llm-backend codex "Build a REST API"
|
|
727
723
|
```
|
|
728
724
|
|
|
729
725
|
---
|
|
@@ -32,7 +32,7 @@ orchestrator:
|
|
|
32
32
|
runtime_backend: claude
|
|
33
33
|
```
|
|
34
34
|
|
|
35
|
-
When
|
|
35
|
+
When `orchestrator.runtime_backend` is set to `claude`, Claude Code is used as the runtime backend.
|
|
36
36
|
|
|
37
37
|
## How It Works
|
|
38
38
|
|
|
@@ -72,8 +72,8 @@ All commands in this section run in your **regular terminal** (shell), not insid
|
|
|
72
72
|
|
|
73
73
|
**Terminal:**
|
|
74
74
|
```bash
|
|
75
|
-
# Start interactive interview
|
|
76
|
-
uv run ouroboros init start
|
|
75
|
+
# Start interactive interview
|
|
76
|
+
uv run ouroboros init start "Your idea here"
|
|
77
77
|
|
|
78
78
|
# Resume an interrupted interview
|
|
79
79
|
uv run ouroboros init start --resume interview_20260127_120000
|
|
@@ -86,24 +86,24 @@ uv run ouroboros init list
|
|
|
86
86
|
|
|
87
87
|
**Terminal:**
|
|
88
88
|
```bash
|
|
89
|
-
# Execute workflow
|
|
90
|
-
uv run ouroboros run workflow
|
|
89
|
+
# Execute workflow
|
|
90
|
+
uv run ouroboros run workflow seed.yaml
|
|
91
91
|
|
|
92
92
|
# Dry run (validate seed without executing)
|
|
93
93
|
uv run ouroboros run workflow --dry-run seed.yaml
|
|
94
94
|
|
|
95
95
|
# Debug output (show logs and agent thinking)
|
|
96
|
-
uv run ouroboros run workflow --
|
|
96
|
+
uv run ouroboros run workflow --debug seed.yaml
|
|
97
97
|
|
|
98
98
|
# Resume a previous session
|
|
99
|
-
uv run ouroboros run workflow --
|
|
99
|
+
uv run ouroboros run workflow --resume <session_id> seed.yaml
|
|
100
100
|
```
|
|
101
101
|
|
|
102
102
|
## Troubleshooting
|
|
103
103
|
|
|
104
104
|
### "Providers: warning" in health check
|
|
105
105
|
|
|
106
|
-
This is normal when not using LiteLLM providers. The orchestrator mode uses
|
|
106
|
+
This is normal when not using LiteLLM providers. The orchestrator mode uses the configured runtime backend directly.
|
|
107
107
|
|
|
108
108
|
### Session fails with empty error
|
|
109
109
|
|
|
@@ -112,7 +112,7 @@ Ensure you're running from the project directory:
|
|
|
112
112
|
**Terminal:**
|
|
113
113
|
```bash
|
|
114
114
|
cd /path/to/ouroboros
|
|
115
|
-
uv run ouroboros run workflow
|
|
115
|
+
uv run ouroboros run workflow seed.yaml
|
|
116
116
|
```
|
|
117
117
|
|
|
118
118
|
### "EventStore not initialized"
|
|
@@ -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.25.3.
|
|
32
|
-
__version_tuple__ = version_tuple = (0, 25, 3, '
|
|
31
|
+
__version__ = version = '0.25.3.dev91'
|
|
32
|
+
__version_tuple__ = version_tuple = (0, 25, 3, 'dev91')
|
|
33
33
|
|
|
34
34
|
__commit_id__ = commit_id = None
|
|
@@ -26,7 +26,7 @@ from ouroboros.bigbang.interview import (
|
|
|
26
26
|
from ouroboros.bigbang.seed_generator import SeedGenerator
|
|
27
27
|
from ouroboros.cli.formatters import console
|
|
28
28
|
from ouroboros.cli.formatters.panels import print_error, print_info, print_success, print_warning
|
|
29
|
-
from ouroboros.config import get_clarification_model
|
|
29
|
+
from ouroboros.config import get_clarification_model, get_llm_backend
|
|
30
30
|
from ouroboros.observability import LoggingConfig, configure_logging
|
|
31
31
|
from ouroboros.providers import create_llm_adapter
|
|
32
32
|
from ouroboros.providers.base import LLMAdapter
|
|
@@ -145,15 +145,15 @@ async def _multiline_prompt_async(prompt_text: str) -> str:
|
|
|
145
145
|
|
|
146
146
|
|
|
147
147
|
def _get_adapter(
|
|
148
|
-
use_orchestrator: bool,
|
|
149
148
|
backend: str | None = None,
|
|
150
149
|
for_interview: bool = False,
|
|
151
150
|
debug: bool = False,
|
|
152
151
|
) -> LLMAdapter:
|
|
153
152
|
"""Get the appropriate LLM adapter.
|
|
154
153
|
|
|
154
|
+
Resolution order: explicit backend arg > config llm.backend > "claude_code".
|
|
155
|
+
|
|
155
156
|
Args:
|
|
156
|
-
use_orchestrator: If True, default to Claude Code for compatibility.
|
|
157
157
|
backend: Optional explicit LLM backend override.
|
|
158
158
|
for_interview: If True, enable Read/Glob/Grep tools for codebase exploration.
|
|
159
159
|
debug: If True, show streaming messages (thinking, tool use).
|
|
@@ -161,7 +161,7 @@ def _get_adapter(
|
|
|
161
161
|
Returns:
|
|
162
162
|
LLM adapter instance.
|
|
163
163
|
"""
|
|
164
|
-
resolved_backend = backend or (
|
|
164
|
+
resolved_backend = backend or get_llm_backend()
|
|
165
165
|
|
|
166
166
|
if for_interview:
|
|
167
167
|
# Interview mode: request the interview-specific permission policy and
|
|
@@ -260,7 +260,6 @@ async def _run_interview(
|
|
|
260
260
|
initial_context: str,
|
|
261
261
|
resume_id: str | None = None,
|
|
262
262
|
state_dir: Path | None = None,
|
|
263
|
-
use_orchestrator: bool = False,
|
|
264
263
|
debug: bool = False,
|
|
265
264
|
workflow_runtime_backend: str | None = None,
|
|
266
265
|
llm_backend: str | None = None,
|
|
@@ -271,13 +270,11 @@ async def _run_interview(
|
|
|
271
270
|
initial_context: Initial context or idea for the interview.
|
|
272
271
|
resume_id: Optional interview ID to resume.
|
|
273
272
|
state_dir: Optional custom state directory.
|
|
274
|
-
use_orchestrator: If True, use Claude Code (Max Plan) instead of LiteLLM.
|
|
275
273
|
workflow_runtime_backend: Optional agent runtime backend for the workflow handoff.
|
|
276
274
|
llm_backend: Optional LLM backend override for interview and seed generation.
|
|
277
275
|
"""
|
|
278
276
|
# Initialize components
|
|
279
277
|
llm_adapter = _get_adapter(
|
|
280
|
-
use_orchestrator,
|
|
281
278
|
backend=llm_backend,
|
|
282
279
|
for_interview=True,
|
|
283
280
|
debug=debug,
|
|
@@ -370,7 +367,6 @@ async def _run_interview(
|
|
|
370
367
|
if should_start_workflow:
|
|
371
368
|
await _start_workflow(
|
|
372
369
|
seed_path,
|
|
373
|
-
use_orchestrator,
|
|
374
370
|
runtime_backend=workflow_runtime_backend,
|
|
375
371
|
)
|
|
376
372
|
|
|
@@ -472,40 +468,32 @@ async def _generate_seed_from_interview(
|
|
|
472
468
|
|
|
473
469
|
async def _start_workflow(
|
|
474
470
|
seed_path: Path,
|
|
475
|
-
use_orchestrator: bool = False,
|
|
476
471
|
parallel: bool = True,
|
|
477
472
|
runtime_backend: str | None = None,
|
|
478
473
|
) -> None:
|
|
479
|
-
"""Start workflow from generated seed.
|
|
474
|
+
"""Start workflow from generated seed (always orchestrator mode).
|
|
480
475
|
|
|
481
476
|
Args:
|
|
482
477
|
seed_path: Path to the seed YAML file.
|
|
483
|
-
use_orchestrator: Whether to use Claude Code orchestrator.
|
|
484
478
|
parallel: Execute independent ACs in parallel. Default: True.
|
|
485
479
|
runtime_backend: Optional runtime backend for orchestrator execution.
|
|
486
480
|
"""
|
|
487
481
|
console.print()
|
|
488
482
|
console.print("[bold cyan]Starting workflow...[/]")
|
|
489
483
|
|
|
490
|
-
|
|
491
|
-
# Direct function call instead of subprocess
|
|
492
|
-
from ouroboros.cli.commands.run import _run_orchestrator
|
|
484
|
+
from ouroboros.cli.commands.run import _run_orchestrator
|
|
493
485
|
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
else:
|
|
506
|
-
# Standard workflow (placeholder for now)
|
|
507
|
-
print_info(f"Would execute workflow from: {seed_path}")
|
|
508
|
-
print_info("Standard workflow execution not yet implemented.")
|
|
486
|
+
try:
|
|
487
|
+
await _run_orchestrator(
|
|
488
|
+
seed_path,
|
|
489
|
+
resume_session=None,
|
|
490
|
+
parallel=parallel,
|
|
491
|
+
runtime_backend=runtime_backend,
|
|
492
|
+
)
|
|
493
|
+
except typer.Exit:
|
|
494
|
+
pass # Normal exit
|
|
495
|
+
except KeyboardInterrupt:
|
|
496
|
+
print_info("Workflow interrupted.")
|
|
509
497
|
|
|
510
498
|
|
|
511
499
|
def _find_pm_seeds(seeds_dir: Path | None = None) -> list[Path]:
|
|
@@ -693,12 +681,13 @@ def start(
|
|
|
693
681
|
dir_okay=True,
|
|
694
682
|
),
|
|
695
683
|
] = None,
|
|
696
|
-
orchestrator: Annotated[
|
|
684
|
+
orchestrator: Annotated[ # noqa: ARG001 — kept for backward compat
|
|
697
685
|
bool,
|
|
698
686
|
typer.Option(
|
|
699
687
|
"--orchestrator",
|
|
700
688
|
"-o",
|
|
701
|
-
help="
|
|
689
|
+
help="Deprecated: no longer needed. Backend is resolved from config (llm.backend).",
|
|
690
|
+
hidden=True,
|
|
702
691
|
),
|
|
703
692
|
] = False,
|
|
704
693
|
runtime: Annotated[
|
|
@@ -737,12 +726,13 @@ def start(
|
|
|
737
726
|
This command initiates the Big Bang phase, which transforms vague ideas
|
|
738
727
|
into clear, executable requirements through iterative questioning.
|
|
739
728
|
|
|
729
|
+
The LLM backend is resolved from config (llm.backend) by default.
|
|
730
|
+
Override with --llm-backend if needed.
|
|
731
|
+
|
|
740
732
|
Example:
|
|
741
733
|
ouroboros init start "I want to build a task management CLI tool"
|
|
742
734
|
|
|
743
|
-
ouroboros init start --
|
|
744
|
-
|
|
745
|
-
ouroboros init start --orchestrator --runtime codex "Build a REST API"
|
|
735
|
+
ouroboros init start --runtime codex "Build a REST API"
|
|
746
736
|
|
|
747
737
|
ouroboros init start --llm-backend codex "Build a REST API"
|
|
748
738
|
|
|
@@ -802,21 +792,16 @@ def start(
|
|
|
802
792
|
configure_logging(LoggingConfig(log_level="DEBUG"))
|
|
803
793
|
print_info("Debug mode enabled - showing verbose logs")
|
|
804
794
|
|
|
805
|
-
|
|
806
|
-
|
|
807
|
-
|
|
808
|
-
|
|
809
|
-
|
|
810
|
-
|
|
811
|
-
|
|
812
|
-
|
|
813
|
-
|
|
814
|
-
|
|
815
|
-
else:
|
|
816
|
-
print_info("Using LiteLLM - API key required")
|
|
817
|
-
|
|
818
|
-
if llm_backend:
|
|
819
|
-
print_info(f"Interview LLM backend: {llm_backend.value}")
|
|
795
|
+
# Show mode info — resolve actual backend used
|
|
796
|
+
resolved_display = llm_backend.value if llm_backend else get_llm_backend()
|
|
797
|
+
backend_labels = {
|
|
798
|
+
"claude_code": "Claude Code - no API key required",
|
|
799
|
+
"codex": "Codex CLI - no API key required",
|
|
800
|
+
"litellm": "LiteLLM - API key required",
|
|
801
|
+
}
|
|
802
|
+
print_info(f"Using {backend_labels.get(resolved_display, resolved_display)}")
|
|
803
|
+
if runtime:
|
|
804
|
+
print_info(f"Workflow runtime backend: {runtime.value}")
|
|
820
805
|
|
|
821
806
|
# Run interview
|
|
822
807
|
try:
|
|
@@ -825,7 +810,6 @@ def start(
|
|
|
825
810
|
context or "",
|
|
826
811
|
resume,
|
|
827
812
|
state_dir,
|
|
828
|
-
orchestrator,
|
|
829
813
|
debug,
|
|
830
814
|
runtime.value if runtime else None,
|
|
831
815
|
llm_backend.value if llm_backend else None,
|
|
@@ -854,7 +838,7 @@ def list_interviews(
|
|
|
854
838
|
] = None,
|
|
855
839
|
) -> None:
|
|
856
840
|
"""List all interview sessions."""
|
|
857
|
-
llm_adapter = create_llm_adapter(backend=
|
|
841
|
+
llm_adapter = create_llm_adapter(backend=get_llm_backend())
|
|
858
842
|
engine = InterviewEngine(
|
|
859
843
|
llm_adapter=llm_adapter,
|
|
860
844
|
state_dir=state_dir or Path.home() / ".ouroboros" / "data",
|
{ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/orchestrator/__init__.py
RENAMED
|
@@ -25,11 +25,10 @@ Usage:
|
|
|
25
25
|
runner = OrchestratorRunner(adapter, event_store, mcp_manager=mcp_manager)
|
|
26
26
|
|
|
27
27
|
CLI Usage:
|
|
28
|
-
ouroboros run
|
|
29
|
-
ouroboros run
|
|
30
|
-
ouroboros run
|
|
31
|
-
ouroboros run
|
|
32
|
-
ouroboros run --orchestrator seed.yaml --mcp-config mcp.yaml
|
|
28
|
+
ouroboros run seed.yaml
|
|
29
|
+
ouroboros run seed.yaml --runtime codex
|
|
30
|
+
ouroboros run seed.yaml --resume <session_id>
|
|
31
|
+
ouroboros run seed.yaml --mcp-config mcp.yaml
|
|
33
32
|
"""
|
|
34
33
|
|
|
35
34
|
from ouroboros.orchestrator.adapter import (
|
{ouroboros_ai-0.25.3.dev89 → ouroboros_ai-0.25.3.dev91}/src/ouroboros/persistence/event_store.py
RENAMED
|
@@ -403,13 +403,13 @@ class EventStore:
|
|
|
403
403
|
) from e
|
|
404
404
|
|
|
405
405
|
async def get_all_sessions(self) -> list[BaseEvent]:
|
|
406
|
-
"""Get all session
|
|
406
|
+
"""Get all session lifecycle events.
|
|
407
407
|
|
|
408
|
-
|
|
409
|
-
|
|
408
|
+
Returns all ``orchestrator.session.*`` events ordered by timestamp
|
|
409
|
+
ascending so callers can replay them to reconstruct current status.
|
|
410
410
|
|
|
411
411
|
Returns:
|
|
412
|
-
List of session
|
|
412
|
+
List of session events, ordered by timestamp ascending.
|
|
413
413
|
|
|
414
414
|
Raises:
|
|
415
415
|
PersistenceError: If the query fails.
|
|
@@ -424,8 +424,8 @@ class EventStore:
|
|
|
424
424
|
async with self._engine.begin() as conn:
|
|
425
425
|
query = (
|
|
426
426
|
select(events_table)
|
|
427
|
-
.where(events_table.c.event_type
|
|
428
|
-
.order_by(events_table.c.timestamp.
|
|
427
|
+
.where(events_table.c.event_type.like("orchestrator.session.%"))
|
|
428
|
+
.order_by(events_table.c.timestamp.asc())
|
|
429
429
|
)
|
|
430
430
|
|
|
431
431
|
result = await conn.execute(query)
|
|
@@ -436,7 +436,7 @@ class EventStore:
|
|
|
436
436
|
f"Failed to get all sessions: {e}",
|
|
437
437
|
operation="select",
|
|
438
438
|
table="events",
|
|
439
|
-
details={"event_type": "orchestrator.session
|
|
439
|
+
details={"event_type": "orchestrator.session.%"},
|
|
440
440
|
) from e
|
|
441
441
|
|
|
442
442
|
async def query_events(
|
|
@@ -83,7 +83,8 @@ class SessionSelectorScreen(Screen[None]):
|
|
|
83
83
|
table.add_row("[dim]No sessions found in the database.[/dim]")
|
|
84
84
|
return
|
|
85
85
|
|
|
86
|
-
#
|
|
86
|
+
# Replay events chronologically to reconstruct session state.
|
|
87
|
+
# Events arrive ASC so later events naturally overwrite status.
|
|
87
88
|
self._session_info = {}
|
|
88
89
|
for event in sessions:
|
|
89
90
|
agg_id = event.aggregate_id
|
|
@@ -95,6 +96,13 @@ class SessionSelectorScreen(Screen[None]):
|
|
|
95
96
|
"timestamp": event.timestamp,
|
|
96
97
|
"status": "started",
|
|
97
98
|
}
|
|
99
|
+
# Always update seed_goal/execution_id when present
|
|
100
|
+
if event.data.get("seed_goal"):
|
|
101
|
+
self._session_info[agg_id]["seed_goal"] = event.data["seed_goal"]
|
|
102
|
+
if event.data.get("execution_id"):
|
|
103
|
+
self._session_info[agg_id]["execution_id"] = event.data["execution_id"]
|
|
104
|
+
# Track latest activity time for sorting
|
|
105
|
+
self._session_info[agg_id]["timestamp"] = event.timestamp
|
|
98
106
|
# Update status based on event type
|
|
99
107
|
if "completed" in event.type:
|
|
100
108
|
self._session_info[agg_id]["status"] = "completed"
|
|
@@ -26,7 +26,6 @@ class TestInitWorkflowRuntimeHandoff:
|
|
|
26
26
|
):
|
|
27
27
|
await _start_workflow(
|
|
28
28
|
Path("/tmp/generated-seed.yaml"),
|
|
29
|
-
use_orchestrator=True,
|
|
30
29
|
runtime_backend="codex",
|
|
31
30
|
)
|
|
32
31
|
|
|
@@ -49,7 +48,6 @@ class TestInitWorkflowRuntimeHandoff:
|
|
|
49
48
|
"init",
|
|
50
49
|
"start",
|
|
51
50
|
"Build a REST API",
|
|
52
|
-
"--orchestrator",
|
|
53
51
|
"--runtime",
|
|
54
52
|
"codex",
|
|
55
53
|
"--llm-backend",
|
|
@@ -58,8 +56,9 @@ class TestInitWorkflowRuntimeHandoff:
|
|
|
58
56
|
)
|
|
59
57
|
|
|
60
58
|
assert result.exit_code == 0
|
|
61
|
-
|
|
62
|
-
assert mock_run_interview.call_args.args[5] == "codex"
|
|
59
|
+
# _run_interview(context, resume, state_dir, debug, runtime, llm_backend)
|
|
60
|
+
assert mock_run_interview.call_args.args[5] == "codex" # llm_backend
|
|
61
|
+
assert mock_run_interview.call_args.args[4] == "codex" # runtime
|
|
63
62
|
|
|
64
63
|
def test_get_adapter_uses_interview_use_case_for_codex(self) -> None:
|
|
65
64
|
"""Interview adapter creation stays backend-neutral for Codex."""
|
|
@@ -70,7 +69,6 @@ class TestInitWorkflowRuntimeHandoff:
|
|
|
70
69
|
return_value=mock_adapter,
|
|
71
70
|
) as mock_create_adapter:
|
|
72
71
|
adapter = _get_adapter(
|
|
73
|
-
use_orchestrator=True,
|
|
74
72
|
backend="codex",
|
|
75
73
|
for_interview=True,
|
|
76
74
|
debug=True,
|
|
@@ -90,7 +88,6 @@ class TestInitWorkflowRuntimeHandoff:
|
|
|
90
88
|
return_value=mock_adapter,
|
|
91
89
|
) as mock_create_adapter:
|
|
92
90
|
adapter = _get_adapter(
|
|
93
|
-
use_orchestrator=True,
|
|
94
91
|
backend="opencode",
|
|
95
92
|
for_interview=True,
|
|
96
93
|
debug=False,
|
|
@@ -255,7 +255,7 @@ class TestShorthandCommands:
|
|
|
255
255
|
|
|
256
256
|
def test_init_list_subcommand_still_works(self) -> None:
|
|
257
257
|
"""Test backward compat: 'ouroboros init list' still routes to list."""
|
|
258
|
-
with patch("ouroboros.cli.commands.init.
|
|
258
|
+
with patch("ouroboros.cli.commands.init.create_llm_adapter"):
|
|
259
259
|
with patch("ouroboros.cli.commands.init.asyncio.run") as mock_run:
|
|
260
260
|
mock_run.return_value = []
|
|
261
261
|
result = runner.invoke(app, ["init", "list"])
|