ouroboros-ai 0.25.3.dev1__tar.gz → 0.25.3.dev3__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.dev1 → ouroboros_ai-0.25.3.dev3}/PKG-INFO +1 -1
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/docs/cli-reference.md +8 -8
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/docs/running-with-claude-code.md +1 -1
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/_version.py +2 -2
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/bigbang/ambiguity.py +31 -18
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/cli/commands/init.py +8 -13
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/cli/commands/run.py +9 -1
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/evolution/loop.py +9 -1
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/mcp/tools/definitions.py +12 -1
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/orchestrator/parallel_executor.py +164 -1
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/orchestrator/runner.py +25 -41
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/e2e/test_cli_commands.py +3 -3
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/bigbang/test_ambiguity.py +62 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/cli/test_main.py +1 -1
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/mcp/tools/test_qa_integration.py +6 -1
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/orchestrator/test_runner.py +116 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/test_artifact_collector.py +19 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/.claude/settings.json +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/.claude-plugin/.mcp.json +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/.claude-plugin/marketplace.json +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/.claude-plugin/plugin.json +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/.env.example +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/.github/workflows/dev-publish.yml +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/.github/workflows/lint.yml +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/.github/workflows/release.yml +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/.github/workflows/test.yml +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/.gitignore +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/.mcp.json +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/.pre-commit-config.yaml +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/.python-version +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/CHANGELOG.md +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/CLAUDE.md +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/CONTRIBUTING.md +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/HANDOFF.md +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/LICENSE +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/README.ko.md +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/README.md +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/agents/architect.md +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/agents/contrarian.md +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/agents/evaluator.md +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/agents/hacker.md +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/agents/ontologist.md +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/agents/qa-judge.md +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/agents/researcher.md +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/agents/seed-architect.md +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/agents/simplifier.md +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/agents/socratic-interviewer.md +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/commands/cancel.md +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/commands/evaluate.md +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/commands/evolve.md +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/commands/help.md +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/commands/interview.md +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/commands/ralph.md +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/commands/run.md +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/commands/seed.md +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/commands/setup.md +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/commands/status.md +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/commands/tutorial.md +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/commands/unstuck.md +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/commands/welcome.md +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/crates/ouroboros-tui/.gitignore +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/crates/ouroboros-tui/Cargo.lock +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/crates/ouroboros-tui/Cargo.toml +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/crates/ouroboros-tui/README.md +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/crates/ouroboros-tui/src/db.rs +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/crates/ouroboros-tui/src/main.rs +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/crates/ouroboros-tui/src/mock.rs +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/crates/ouroboros-tui/src/state.rs +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/crates/ouroboros-tui/src/views/dashboard.rs +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/crates/ouroboros-tui/src/views/execution.rs +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/crates/ouroboros-tui/src/views/lineage.rs +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/crates/ouroboros-tui/src/views/logs.rs +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/crates/ouroboros-tui/src/views/mod.rs +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/crates/ouroboros-tui/src/views/session_selector.rs +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/docs/README.md +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/docs/api/README.md +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/docs/api/coordinator-agent-design.md +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/docs/api/core.md +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/docs/api/mcp.md +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/docs/api/parallel-dx-design.md +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/docs/api/parallel-execution.md +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/docs/architecture.md +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/docs/contributing/architecture-overview.md +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/docs/contributing/key-patterns.md +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/docs/contributing/testing-guide.md +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/docs/examples/mcp-config.yaml +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/docs/getting-started.md +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/docs/guides/cli-usage.md +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/docs/guides/common-workflows.md +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/docs/guides/issue-176-subagent-mcp-inheritance.md +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/docs/guides/language-support.md +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/docs/guides/quick-start.md +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/docs/guides/seed-authoring.md +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/docs/guides/tui-usage.md +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/docs/images/ouroboros.png +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/docs/ontological-framework/HANDOFF.md +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/docs/ontological-framework/aop-design.md +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/docs/ontological-framework/architecture.md +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/docs/ontological-framework/requirements.md +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/examples/coordinator_test_seed.yaml +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/examples/dummy_seed.yaml +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/examples/parallel_subac_test_seed.yaml +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/examples/subac_test_seed.yaml +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/examples/task_manager/README.md +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/examples/task_manager/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/examples/task_manager/__main__.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/examples/task_manager/cli.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/examples/task_manager/models.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/examples/task_manager/storage.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/examples/test_display.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/hooks/hooks.json +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/playground/src/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/playground/src/config.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/playground/src/models.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/project-context.md +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/pyproject.toml +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/scripts/drift-monitor.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/scripts/keyword-detector.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/scripts/ralph-rewind.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/scripts/ralph.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/scripts/ralph.sh +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/scripts/session-start.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/scripts/version-check.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/skills/cancel/SKILL.md +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/skills/evaluate/SKILL.md +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/skills/evolve/SKILL.md +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/skills/help/SKILL.md +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/skills/interview/SKILL.md +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/skills/qa/SKILL.md +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/skills/ralph/SKILL.md +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/skills/run/SKILL.md +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/skills/seed/SKILL.md +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/skills/setup/SKILL.md +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/skills/status/SKILL.md +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/skills/tutorial/SKILL.md +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/skills/unstuck/SKILL.md +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/skills/update/SKILL.md +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/skills/welcome/SKILL.md +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/__main__.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/agents/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/agents/advocate.md +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/agents/analysis-agent.md +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/agents/architect.md +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/agents/code-executor.md +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/agents/codebase-explorer.md +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/agents/consensus-reviewer.md +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/agents/contrarian.md +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/agents/evaluator.md +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/agents/hacker.md +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/agents/judge.md +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/agents/loader.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/agents/ontologist.md +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/agents/ontology-analyst.md +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/agents/qa-judge.md +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/agents/research-agent.md +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/agents/researcher.md +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/agents/seed-architect.md +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/agents/semantic-evaluator.md +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/agents/simplifier.md +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/agents/socratic-interviewer.md +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/bigbang/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/bigbang/explore.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/bigbang/interview.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/bigbang/seed_generator.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/cli/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/cli/commands/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/cli/commands/cancel.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/cli/commands/config.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/cli/commands/mcp.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/cli/commands/status.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/cli/commands/tui.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/cli/formatters/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/cli/formatters/panels.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/cli/formatters/progress.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/cli/formatters/tables.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/cli/formatters/workflow_display.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/cli/main.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/config/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/config/loader.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/config/models.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/core/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/core/ac_tree.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/core/context.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/core/errors.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/core/file_lock.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/core/git_workflow.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/core/lineage.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/core/ontology_aspect.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/core/ontology_questions.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/core/security.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/core/seed.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/core/text.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/core/types.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/evaluation/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/evaluation/artifact_collector.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/evaluation/consensus.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/evaluation/json_utils.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/evaluation/languages.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/evaluation/mechanical.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/evaluation/models.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/evaluation/pipeline.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/evaluation/semantic.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/evaluation/trigger.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/events/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/events/base.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/events/decomposition.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/events/evaluation.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/events/interview.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/events/lineage.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/events/ontology.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/evolution/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/evolution/convergence.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/evolution/projector.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/evolution/reflect.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/evolution/regression.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/evolution/wonder.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/execution/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/execution/atomicity.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/execution/decomposition.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/execution/double_diamond.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/execution/subagent.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/mcp/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/mcp/client/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/mcp/client/adapter.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/mcp/client/manager.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/mcp/client/protocol.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/mcp/errors.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/mcp/job_manager.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/mcp/resources/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/mcp/resources/handlers.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/mcp/server/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/mcp/server/adapter.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/mcp/server/protocol.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/mcp/server/security.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/mcp/tools/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/mcp/tools/dashboard.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/mcp/tools/qa.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/mcp/tools/registry.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/mcp/types.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/observability/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/observability/drift.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/observability/logging.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/observability/retrospective.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/orchestrator/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/orchestrator/adapter.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/orchestrator/coordinator.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/orchestrator/dependency_analyzer.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/orchestrator/events.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/orchestrator/execution_strategy.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/orchestrator/level_context.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/orchestrator/mcp_config.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/orchestrator/mcp_tools.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/orchestrator/session.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/orchestrator/workflow_state.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/persistence/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/persistence/checkpoint.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/persistence/event_store.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/persistence/migrations/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/persistence/migrations/runner.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/persistence/migrations/scripts/001_initial.sql +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/persistence/schema.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/persistence/uow.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/plugin/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/plugin/agents/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/plugin/agents/pool.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/plugin/agents/registry.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/plugin/orchestration/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/plugin/orchestration/router.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/plugin/orchestration/scheduler.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/plugin/skills/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/plugin/skills/docs.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/plugin/skills/executor.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/plugin/skills/keywords.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/plugin/skills/registry.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/providers/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/providers/anthropic_adapter.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/providers/base.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/providers/claude_code_adapter.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/providers/litellm_adapter.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/py.typed +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/resilience/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/resilience/lateral.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/resilience/stagnation.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/routing/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/routing/complexity.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/routing/downgrade.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/routing/escalation.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/routing/router.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/routing/tiers.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/secondary/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/secondary/scheduler.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/secondary/todo_registry.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/strategies/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/strategies/devil_advocate.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/tui/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/tui/app.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/tui/components/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/tui/components/agents_panel.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/tui/components/event_log.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/tui/components/progress.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/tui/components/token_tracker.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/tui/events.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/tui/screens/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/tui/screens/confirm_rewind.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/tui/screens/dashboard.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/tui/screens/dashboard_v2.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/tui/screens/dashboard_v3.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/tui/screens/debug.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/tui/screens/execution.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/tui/screens/hud_dashboard.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/tui/screens/lineage_detail.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/tui/screens/lineage_selector.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/tui/screens/logs.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/tui/screens/session_selector.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/tui/widgets/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/tui/widgets/ac_progress.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/tui/widgets/ac_tree.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/tui/widgets/agent_activity.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/tui/widgets/cost_tracker.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/tui/widgets/drift_meter.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/tui/widgets/lineage_tree.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/tui/widgets/parallel_graph.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/tui/widgets/phase_progress.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/verification/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/verification/extractor.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/verification/models.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/verification/verifier.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/conftest.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/e2e/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/e2e/conftest.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/e2e/test_full_workflow.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/e2e/test_session_persistence.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/fixtures/test_atomicity_seed.yml +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/integration/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/integration/mcp/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/integration/mcp/conftest.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/integration/mcp/test_client_adapter.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/integration/mcp/test_client_manager.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/integration/mcp/test_server_adapter.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/integration/plugin/test_orchestration.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/integration/test_entry_point.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/agents/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/agents/test_loader.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/bigbang/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/bigbang/test_explore.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/bigbang/test_interview.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/bigbang/test_seed_generator.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/cli/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/cli/formatters/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/cli/formatters/test_console.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/cli/formatters/test_panels.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/cli/formatters/test_progress.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/cli/formatters/test_tables.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/cli/formatters/test_workflow_display.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/cli/test_cancel.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/cli/test_mcp_startup_cleanup.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/config/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/config/test_loader.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/config/test_models.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/core/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/core/test_ac_tree.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/core/test_context.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/core/test_errors.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/core/test_git_workflow.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/core/test_ontology_aspect.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/core/test_ontology_questions.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/core/test_security.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/core/test_seed.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/core/test_types.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/evaluation/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/evaluation/test_consensus.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/evaluation/test_languages.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/evaluation/test_mechanical.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/evaluation/test_models.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/evaluation/test_semantic.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/evaluation/test_trigger.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/events/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/events/test_base.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/events/test_decomposition_events.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/execution/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/execution/test_atomicity.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/execution/test_decomposition.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/execution/test_double_diamond.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/execution/test_subagent_isolation.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/mcp/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/mcp/client/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/mcp/client/test_adapter.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/mcp/client/test_manager.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/mcp/conftest.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/mcp/server/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/mcp/server/test_adapter.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/mcp/server/test_security.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/mcp/test_errors.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/mcp/test_job_manager.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/mcp/test_types.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/mcp/tools/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/mcp/tools/test_definitions.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/mcp/tools/test_registry.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/observability/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/observability/test_drift.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/observability/test_logging.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/observability/test_retrospective.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/orchestrator/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/orchestrator/test_adapter.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/orchestrator/test_coordinator.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/orchestrator/test_events.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/orchestrator/test_execution_strategy.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/orchestrator/test_inflight_cancellation.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/orchestrator/test_level_context.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/orchestrator/test_mcp_config.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/orchestrator/test_mcp_tools.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/orchestrator/test_runner_cancellation.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/orchestrator/test_session.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/orchestrator/test_workflow_state.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/persistence/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/persistence/test_checkpoint.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/persistence/test_event_store.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/persistence/test_schema.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/persistence/test_uow.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/plugin/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/plugin/agents/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/plugin/agents/test_registry.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/plugin/orchestration/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/plugin/orchestration/test_model_router.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/plugin/skills/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/plugin/skills/test_registry.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/providers/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/providers/test_base.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/providers/test_claude_code_adapter.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/providers/test_litellm_adapter.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/resilience/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/resilience/test_lateral.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/resilience/test_stagnation.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/routing/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/routing/test_complexity.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/routing/test_downgrade.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/routing/test_escalation.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/routing/test_router.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/routing/test_tiers.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/scripts/test_keyword_detector.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/scripts/test_version_check.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/secondary/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/secondary/test_scheduler.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/secondary/test_todo_registry.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/test_convergence.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/test_dashboard.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/test_dependencies_configured.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/test_evolve_rewind.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/test_evolve_step.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/test_main_entry_point.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/test_module_structure.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/test_project_initialization.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/test_projector_rewind.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/test_ralph_parser.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/test_ralph_rewind.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/test_regression.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/test_tooling_configuration.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/test_verification.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/tui/__init__.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/tui/test_app.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/tui/test_cancelled_display.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/tui/test_events.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/tui/test_lineage_viewer.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/tui/test_screens.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tests/unit/tui/test_widgets.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/tools/sync_github_project.py +0 -0
- {ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/uv.lock +0 -0
|
@@ -83,7 +83,7 @@ ouroboros init [start] [OPTIONS] [CONTEXT]
|
|
|
83
83
|
|--------|-------------|
|
|
84
84
|
| `-r, --resume TEXT` | Resume an existing interview by ID |
|
|
85
85
|
| `--state-dir DIRECTORY` | Custom directory for interview state files |
|
|
86
|
-
| `-o, --orchestrator` | Use Claude Code (Max Plan) instead of
|
|
86
|
+
| `-o, --orchestrator` | Use Claude Code (Max Plan) instead of Anthropic API. No API key required |
|
|
87
87
|
| `-d, --debug` | Show verbose logs including debug messages |
|
|
88
88
|
|
|
89
89
|
**Examples:**
|
|
@@ -493,21 +493,21 @@ ouroboros run seed.yaml
|
|
|
493
493
|
ouroboros monitor
|
|
494
494
|
```
|
|
495
495
|
|
|
496
|
-
### Using
|
|
496
|
+
### Using Anthropic API (Default Non-Orchestrator Path)
|
|
497
497
|
|
|
498
|
-
Requires
|
|
498
|
+
Requires `ANTHROPIC_API_KEY`.
|
|
499
499
|
|
|
500
500
|
```bash
|
|
501
501
|
# 1. Initialize configuration
|
|
502
502
|
ouroboros config init
|
|
503
503
|
|
|
504
|
-
# 2.
|
|
505
|
-
|
|
504
|
+
# 2. Export your API key
|
|
505
|
+
export ANTHROPIC_API_KEY=your-key-here
|
|
506
506
|
|
|
507
507
|
# 3. Start interview
|
|
508
508
|
ouroboros init "Build a REST API for task management"
|
|
509
509
|
|
|
510
|
-
# 4. Execute workflow (use --no-orchestrator for
|
|
510
|
+
# 4. Execute workflow (use --no-orchestrator for the standard path)
|
|
511
511
|
ouroboros run seed.yaml --no-orchestrator
|
|
512
512
|
```
|
|
513
513
|
|
|
@@ -517,8 +517,8 @@ ouroboros run seed.yaml --no-orchestrator
|
|
|
517
517
|
|
|
518
518
|
| Variable | Description |
|
|
519
519
|
|----------|-------------|
|
|
520
|
-
| `OPENROUTER_API_KEY` | OpenRouter API key for LiteLLM |
|
|
521
|
-
| `ANTHROPIC_API_KEY` | Anthropic API key for
|
|
520
|
+
| `OPENROUTER_API_KEY` | OpenRouter API key for optional LiteLLM-based integrations |
|
|
521
|
+
| `ANTHROPIC_API_KEY` | Anthropic API key for direct Anthropic-backed interview mode |
|
|
522
522
|
| `OPENAI_API_KEY` | OpenAI API key for LiteLLM |
|
|
523
523
|
|
|
524
524
|
---
|
|
@@ -136,7 +136,7 @@ The orchestrator uses `claude-agent-sdk` which connects directly to your authent
|
|
|
136
136
|
# Start interactive interview (Claude Code)
|
|
137
137
|
uv run ouroboros init start --orchestrator "Your idea here"
|
|
138
138
|
|
|
139
|
-
# Start interactive interview (
|
|
139
|
+
# Start interactive interview (Anthropic API - needs ANTHROPIC_API_KEY)
|
|
140
140
|
uv run ouroboros init start "Your idea here"
|
|
141
141
|
|
|
142
142
|
# Resume an interrupted interview
|
|
@@ -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.dev3'
|
|
32
|
+
__version_tuple__ = version_tuple = (0, 25, 3, 'dev3')
|
|
33
33
|
|
|
34
34
|
__commit_id__ = commit_id = None
|
|
@@ -20,12 +20,7 @@ import structlog
|
|
|
20
20
|
from ouroboros.bigbang.interview import InterviewState
|
|
21
21
|
from ouroboros.core.errors import ProviderError
|
|
22
22
|
from ouroboros.core.types import Result
|
|
23
|
-
from ouroboros.providers.base import CompletionConfig, Message, MessageRole
|
|
24
|
-
|
|
25
|
-
try:
|
|
26
|
-
from ouroboros.providers.litellm_adapter import LiteLLMAdapter
|
|
27
|
-
except ImportError:
|
|
28
|
-
LiteLLMAdapter = None # type: ignore[assignment,misc]
|
|
23
|
+
from ouroboros.providers.base import CompletionConfig, LLMAdapter, Message, MessageRole
|
|
29
24
|
|
|
30
25
|
log = structlog.get_logger()
|
|
31
26
|
|
|
@@ -138,7 +133,7 @@ class AmbiguityScorer:
|
|
|
138
133
|
max_retries: Maximum retry attempts, or None for unlimited (default).
|
|
139
134
|
|
|
140
135
|
Example:
|
|
141
|
-
scorer = AmbiguityScorer(llm_adapter=
|
|
136
|
+
scorer = AmbiguityScorer(llm_adapter=some_adapter)
|
|
142
137
|
|
|
143
138
|
result = await scorer.score(interview_state)
|
|
144
139
|
if result.is_ok:
|
|
@@ -151,7 +146,7 @@ class AmbiguityScorer:
|
|
|
151
146
|
questions = scorer.generate_clarification_questions(ambiguity.breakdown)
|
|
152
147
|
"""
|
|
153
148
|
|
|
154
|
-
llm_adapter:
|
|
149
|
+
llm_adapter: LLMAdapter
|
|
155
150
|
model: str = DEFAULT_MODEL
|
|
156
151
|
temperature: float = SCORING_TEMPERATURE
|
|
157
152
|
initial_max_tokens: int = 2048
|
|
@@ -414,17 +409,14 @@ Analyze each component and provide scores with justifications."""
|
|
|
414
409
|
except json.JSONDecodeError as e:
|
|
415
410
|
raise ValueError(f"Invalid JSON response: {e}") from e
|
|
416
411
|
|
|
417
|
-
#
|
|
418
|
-
|
|
412
|
+
# Numeric score fields must be present. Missing justifications are recoverable.
|
|
413
|
+
required_score_fields = [
|
|
419
414
|
"goal_clarity_score",
|
|
420
|
-
"goal_clarity_justification",
|
|
421
415
|
"constraint_clarity_score",
|
|
422
|
-
"constraint_clarity_justification",
|
|
423
416
|
"success_criteria_clarity_score",
|
|
424
|
-
"success_criteria_clarity_justification",
|
|
425
417
|
]
|
|
426
418
|
|
|
427
|
-
for field_name in
|
|
419
|
+
for field_name in required_score_fields:
|
|
428
420
|
if field_name not in data:
|
|
429
421
|
raise ValueError(f"Missing required field: {field_name}")
|
|
430
422
|
|
|
@@ -433,6 +425,15 @@ Analyze each component and provide scores with justifications."""
|
|
|
433
425
|
score = float(value)
|
|
434
426
|
return max(0.0, min(1.0, score))
|
|
435
427
|
|
|
428
|
+
def justification_for(field_name: str, component_name: str) -> str:
|
|
429
|
+
value = data.get(field_name)
|
|
430
|
+
if value is None:
|
|
431
|
+
return f"{component_name} justification not provided by model."
|
|
432
|
+
text = str(value).strip()
|
|
433
|
+
if not text:
|
|
434
|
+
return f"{component_name} justification not provided by model."
|
|
435
|
+
return text
|
|
436
|
+
|
|
436
437
|
# Select weights based on project type
|
|
437
438
|
if is_brownfield:
|
|
438
439
|
goal_weight = BROWNFIELD_GOAL_CLARITY_WEIGHT
|
|
@@ -450,7 +451,10 @@ Analyze each component and provide scores with justifications."""
|
|
|
450
451
|
name="Context Clarity",
|
|
451
452
|
clarity_score=clamp_score(data["context_clarity_score"]),
|
|
452
453
|
weight=BROWNFIELD_CONTEXT_CLARITY_WEIGHT,
|
|
453
|
-
justification=
|
|
454
|
+
justification=justification_for(
|
|
455
|
+
"context_clarity_justification",
|
|
456
|
+
"Context Clarity",
|
|
457
|
+
),
|
|
454
458
|
)
|
|
455
459
|
|
|
456
460
|
return ScoreBreakdown(
|
|
@@ -458,19 +462,28 @@ Analyze each component and provide scores with justifications."""
|
|
|
458
462
|
name="Goal Clarity",
|
|
459
463
|
clarity_score=clamp_score(data["goal_clarity_score"]),
|
|
460
464
|
weight=goal_weight,
|
|
461
|
-
justification=
|
|
465
|
+
justification=justification_for(
|
|
466
|
+
"goal_clarity_justification",
|
|
467
|
+
"Goal Clarity",
|
|
468
|
+
),
|
|
462
469
|
),
|
|
463
470
|
constraint_clarity=ComponentScore(
|
|
464
471
|
name="Constraint Clarity",
|
|
465
472
|
clarity_score=clamp_score(data["constraint_clarity_score"]),
|
|
466
473
|
weight=constraint_weight,
|
|
467
|
-
justification=
|
|
474
|
+
justification=justification_for(
|
|
475
|
+
"constraint_clarity_justification",
|
|
476
|
+
"Constraint Clarity",
|
|
477
|
+
),
|
|
468
478
|
),
|
|
469
479
|
success_criteria_clarity=ComponentScore(
|
|
470
480
|
name="Success Criteria Clarity",
|
|
471
481
|
clarity_score=clamp_score(data["success_criteria_clarity_score"]),
|
|
472
482
|
weight=criteria_weight,
|
|
473
|
-
justification=
|
|
483
|
+
justification=justification_for(
|
|
484
|
+
"success_criteria_clarity_justification",
|
|
485
|
+
"Success Criteria Clarity",
|
|
486
|
+
),
|
|
474
487
|
),
|
|
475
488
|
context_clarity=context_clarity,
|
|
476
489
|
)
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"""Init command for starting interactive interview.
|
|
2
2
|
|
|
3
3
|
This command initiates the Big Bang phase interview process.
|
|
4
|
-
Supports both
|
|
4
|
+
Supports both direct Anthropic API and Claude Code (Max Plan) modes.
|
|
5
5
|
"""
|
|
6
6
|
|
|
7
7
|
import asyncio
|
|
@@ -27,13 +27,9 @@ 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
29
|
from ouroboros.observability import LoggingConfig, configure_logging
|
|
30
|
+
from ouroboros.providers.anthropic_adapter import AnthropicAdapter
|
|
30
31
|
from ouroboros.providers.base import LLMAdapter
|
|
31
32
|
|
|
32
|
-
try:
|
|
33
|
-
from ouroboros.providers.litellm_adapter import LiteLLMAdapter
|
|
34
|
-
except ImportError:
|
|
35
|
-
LiteLLMAdapter = None # type: ignore[assignment,misc]
|
|
36
|
-
|
|
37
33
|
|
|
38
34
|
class SeedGenerationResult(Enum):
|
|
39
35
|
"""Result of seed generation attempt."""
|
|
@@ -140,7 +136,7 @@ def _get_adapter(
|
|
|
140
136
|
"""Get the appropriate LLM adapter.
|
|
141
137
|
|
|
142
138
|
Args:
|
|
143
|
-
use_orchestrator: If True, use Claude Code (Max Plan). Otherwise
|
|
139
|
+
use_orchestrator: If True, use Claude Code (Max Plan). Otherwise Anthropic API.
|
|
144
140
|
for_interview: If True, enable Read/Glob/Grep tools for codebase exploration.
|
|
145
141
|
debug: If True, show streaming messages (thinking, tool use).
|
|
146
142
|
|
|
@@ -160,8 +156,7 @@ def _get_adapter(
|
|
|
160
156
|
on_message=_make_message_callback(debug),
|
|
161
157
|
)
|
|
162
158
|
return ClaudeCodeAdapter()
|
|
163
|
-
|
|
164
|
-
return LiteLLMAdapter()
|
|
159
|
+
return AnthropicAdapter()
|
|
165
160
|
|
|
166
161
|
|
|
167
162
|
async def _run_interview_loop(
|
|
@@ -262,7 +257,7 @@ async def _run_interview(
|
|
|
262
257
|
initial_context: Initial context or idea for the interview.
|
|
263
258
|
resume_id: Optional interview ID to resume.
|
|
264
259
|
state_dir: Optional custom state directory.
|
|
265
|
-
use_orchestrator: If True, use Claude Code (Max Plan) instead of
|
|
260
|
+
use_orchestrator: If True, use Claude Code (Max Plan) instead of Anthropic API.
|
|
266
261
|
"""
|
|
267
262
|
# Initialize components
|
|
268
263
|
llm_adapter = _get_adapter(use_orchestrator, for_interview=True, debug=debug)
|
|
@@ -500,7 +495,7 @@ def start(
|
|
|
500
495
|
typer.Option(
|
|
501
496
|
"--orchestrator",
|
|
502
497
|
"-o",
|
|
503
|
-
help="Use Claude Code (Max Plan) instead of
|
|
498
|
+
help="Use Claude Code (Max Plan) instead of Anthropic API. No API key required.",
|
|
504
499
|
),
|
|
505
500
|
] = False,
|
|
506
501
|
debug: Annotated[
|
|
@@ -553,7 +548,7 @@ def start(
|
|
|
553
548
|
if orchestrator:
|
|
554
549
|
print_info("Using Claude Code (Max Plan) - no API key required")
|
|
555
550
|
else:
|
|
556
|
-
print_info("Using
|
|
551
|
+
print_info("Using Anthropic API - ANTHROPIC_API_KEY required")
|
|
557
552
|
|
|
558
553
|
# Run interview
|
|
559
554
|
try:
|
|
@@ -581,7 +576,7 @@ def list_interviews(
|
|
|
581
576
|
] = None,
|
|
582
577
|
) -> None:
|
|
583
578
|
"""List all interview sessions."""
|
|
584
|
-
llm_adapter =
|
|
579
|
+
llm_adapter = AnthropicAdapter()
|
|
585
580
|
engine = InterviewEngine(
|
|
586
581
|
llm_adapter=llm_adapter,
|
|
587
582
|
state_dir=state_dir or Path.home() / ".ouroboros" / "data",
|
|
@@ -52,6 +52,14 @@ def _derive_quality_bar(seed: Seed) -> str:
|
|
|
52
52
|
return "The execution must satisfy all acceptance criteria:\n" + "\n".join(ac_lines)
|
|
53
53
|
|
|
54
54
|
|
|
55
|
+
def _get_verification_artifact(summary: dict[str, Any], final_message: str) -> str:
|
|
56
|
+
"""Prefer the structured verification report when present."""
|
|
57
|
+
verification_report = summary.get("verification_report")
|
|
58
|
+
if isinstance(verification_report, str) and verification_report:
|
|
59
|
+
return verification_report
|
|
60
|
+
return final_message or ""
|
|
61
|
+
|
|
62
|
+
|
|
55
63
|
def _load_seed_from_yaml(seed_file: Path) -> dict[str, Any]:
|
|
56
64
|
"""Load seed configuration from YAML file.
|
|
57
65
|
|
|
@@ -238,7 +246,7 @@ async def _run_orchestrator(
|
|
|
238
246
|
|
|
239
247
|
qa_result = await qa_handler.handle(
|
|
240
248
|
{
|
|
241
|
-
"artifact": res.final_message
|
|
249
|
+
"artifact": _get_verification_artifact(res.summary, res.final_message),
|
|
242
250
|
"artifact_type": "test_output",
|
|
243
251
|
"quality_bar": quality_bar,
|
|
244
252
|
"seed_content": yaml.dump(seed_data, default_flow_style=False),
|
|
@@ -888,7 +888,15 @@ class EvolutionaryLoop:
|
|
|
888
888
|
exec_result = await self.executor(current_seed, parallel=parallel)
|
|
889
889
|
if hasattr(exec_result, "is_ok") and exec_result.is_ok:
|
|
890
890
|
orch_result = exec_result.value
|
|
891
|
-
|
|
891
|
+
summary = getattr(orch_result, "summary", {})
|
|
892
|
+
verification_report = (
|
|
893
|
+
summary.get("verification_report") if isinstance(summary, dict) else None
|
|
894
|
+
)
|
|
895
|
+
execution_output = (
|
|
896
|
+
verification_report
|
|
897
|
+
if isinstance(verification_report, str) and verification_report
|
|
898
|
+
else getattr(orch_result, "final_message", str(orch_result))
|
|
899
|
+
)
|
|
892
900
|
# Log structured metadata for observability
|
|
893
901
|
logger.info(
|
|
894
902
|
"evolution.generation.executed",
|
{ouroboros_ai-0.25.3.dev1 → ouroboros_ai-0.25.3.dev3}/src/ouroboros/mcp/tools/definitions.py
RENAMED
|
@@ -290,7 +290,10 @@ class ExecuteSeedHandler:
|
|
|
290
290
|
quality_bar = self._derive_quality_bar(seed)
|
|
291
291
|
qa_result = await qa_handler.handle(
|
|
292
292
|
{
|
|
293
|
-
"artifact":
|
|
293
|
+
"artifact": self._get_verification_artifact(
|
|
294
|
+
exec_result.summary,
|
|
295
|
+
exec_result.final_message,
|
|
296
|
+
),
|
|
294
297
|
"artifact_type": "test_output",
|
|
295
298
|
"quality_bar": quality_bar,
|
|
296
299
|
"seed_content": seed_content,
|
|
@@ -335,6 +338,14 @@ class ExecuteSeedHandler:
|
|
|
335
338
|
ac_lines = [f"- {ac}" for ac in seed.acceptance_criteria]
|
|
336
339
|
return "The execution must satisfy all acceptance criteria:\n" + "\n".join(ac_lines)
|
|
337
340
|
|
|
341
|
+
@staticmethod
|
|
342
|
+
def _get_verification_artifact(summary: dict[str, Any], final_message: str) -> str:
|
|
343
|
+
"""Prefer the structured verification report when present."""
|
|
344
|
+
verification_report = summary.get("verification_report")
|
|
345
|
+
if isinstance(verification_report, str) and verification_report:
|
|
346
|
+
return verification_report
|
|
347
|
+
return final_message or ""
|
|
348
|
+
|
|
338
349
|
@staticmethod
|
|
339
350
|
def _format_execution_result(exec_result, seed: Seed) -> str:
|
|
340
351
|
"""Format execution result as human-readable text.
|
|
@@ -78,6 +78,7 @@ _STALL_SENTINEL = "__STALL_DETECTED__" # Sentinel error for stall results
|
|
|
78
78
|
_MIN_FREE_MEMORY_GB = 2.0
|
|
79
79
|
_MEMORY_CHECK_INTERVAL_SECONDS = 5.0
|
|
80
80
|
_MEMORY_WAIT_MAX_SECONDS = 120.0
|
|
81
|
+
_MAX_LEAF_RESULT_CHARS = 1200
|
|
81
82
|
|
|
82
83
|
|
|
83
84
|
def _get_available_memory_gb() -> float | None:
|
|
@@ -189,6 +190,152 @@ class ParallelExecutionResult:
|
|
|
189
190
|
return self.success_count > 0
|
|
190
191
|
|
|
191
192
|
|
|
193
|
+
def _normalize_command(command: str) -> str:
|
|
194
|
+
"""Normalize Bash commands for stable audit output."""
|
|
195
|
+
return " ".join(command.split())
|
|
196
|
+
|
|
197
|
+
|
|
198
|
+
def _truncate_text(text: str, limit: int = _MAX_LEAF_RESULT_CHARS) -> str:
|
|
199
|
+
"""Truncate long evidence blocks while preserving their beginning."""
|
|
200
|
+
stripped = text.strip()
|
|
201
|
+
if len(stripped) <= limit:
|
|
202
|
+
return stripped
|
|
203
|
+
return stripped[:limit].rstrip() + "\n[TRUNCATED]"
|
|
204
|
+
|
|
205
|
+
|
|
206
|
+
def _extract_leaf_evidence_lines(result: ACExecutionResult) -> list[str]:
|
|
207
|
+
"""Extract normalized command, file, and result evidence for a leaf AC."""
|
|
208
|
+
lines: list[str] = []
|
|
209
|
+
seen_commands: set[str] = set()
|
|
210
|
+
seen_file_ops: set[tuple[str, str]] = set()
|
|
211
|
+
|
|
212
|
+
for message in result.messages:
|
|
213
|
+
if not message.tool_name:
|
|
214
|
+
continue
|
|
215
|
+
tool_input = message.data.get("tool_input", {})
|
|
216
|
+
if not isinstance(tool_input, dict):
|
|
217
|
+
tool_input = {}
|
|
218
|
+
|
|
219
|
+
if message.tool_name == "Bash":
|
|
220
|
+
command = tool_input.get("command")
|
|
221
|
+
if isinstance(command, str):
|
|
222
|
+
normalized = _normalize_command(command)
|
|
223
|
+
if normalized and normalized not in seen_commands:
|
|
224
|
+
if not lines:
|
|
225
|
+
lines.append("Commands Run:")
|
|
226
|
+
lines.append(f"- Bash: {normalized}")
|
|
227
|
+
seen_commands.add(normalized)
|
|
228
|
+
continue
|
|
229
|
+
|
|
230
|
+
if message.tool_name in ("Write", "Edit", "NotebookEdit"):
|
|
231
|
+
path_key = "notebook_path" if message.tool_name == "NotebookEdit" else "file_path"
|
|
232
|
+
file_path = tool_input.get(path_key)
|
|
233
|
+
if isinstance(file_path, str) and file_path:
|
|
234
|
+
file_op = (message.tool_name, file_path)
|
|
235
|
+
if file_op not in seen_file_ops:
|
|
236
|
+
if "File Changes:" not in lines:
|
|
237
|
+
lines.append("File Changes:")
|
|
238
|
+
lines.append(f"- {message.tool_name}: {file_path}")
|
|
239
|
+
seen_file_ops.add(file_op)
|
|
240
|
+
|
|
241
|
+
result_text = result.final_message or (f"Error: {result.error}" if result.error else "")
|
|
242
|
+
if result_text:
|
|
243
|
+
lines.append("Result:")
|
|
244
|
+
lines.append(_truncate_text(result_text))
|
|
245
|
+
return lines
|
|
246
|
+
|
|
247
|
+
|
|
248
|
+
def _render_ac_section(
|
|
249
|
+
result: ACExecutionResult,
|
|
250
|
+
*,
|
|
251
|
+
index_path: tuple[int, ...],
|
|
252
|
+
heading_level: int,
|
|
253
|
+
include_header: bool = True,
|
|
254
|
+
) -> list[str]:
|
|
255
|
+
"""Render a single AC or Sub-AC section for verification/audit output."""
|
|
256
|
+
lines: list[str] = []
|
|
257
|
+
if include_header:
|
|
258
|
+
status = "PASS" if result.success else "FAIL"
|
|
259
|
+
label = "AC" if len(index_path) == 1 else "Sub-AC"
|
|
260
|
+
lines.append(
|
|
261
|
+
f"{'#' * heading_level} {label} {'.'.join(str(i) for i in index_path)}: "
|
|
262
|
+
f"[{status}] {result.ac_content}"
|
|
263
|
+
)
|
|
264
|
+
|
|
265
|
+
if result.is_decomposed and result.sub_results:
|
|
266
|
+
lines.append(f"Decomposed into {len(result.sub_results)} Sub-ACs")
|
|
267
|
+
for idx, sub_result in enumerate(result.sub_results, start=1):
|
|
268
|
+
if lines:
|
|
269
|
+
lines.append("")
|
|
270
|
+
lines.extend(
|
|
271
|
+
_render_ac_section(
|
|
272
|
+
sub_result,
|
|
273
|
+
index_path=index_path + (idx,),
|
|
274
|
+
heading_level=min(heading_level + 1, 6),
|
|
275
|
+
)
|
|
276
|
+
)
|
|
277
|
+
return lines
|
|
278
|
+
|
|
279
|
+
evidence_lines = _extract_leaf_evidence_lines(result)
|
|
280
|
+
if evidence_lines:
|
|
281
|
+
lines.extend(evidence_lines)
|
|
282
|
+
else:
|
|
283
|
+
lines.append("Result:")
|
|
284
|
+
lines.append("No final result message captured.")
|
|
285
|
+
return lines
|
|
286
|
+
|
|
287
|
+
|
|
288
|
+
def render_parallel_verification_report(
|
|
289
|
+
parallel_result: ParallelExecutionResult,
|
|
290
|
+
total_acceptance_criteria: int,
|
|
291
|
+
) -> str:
|
|
292
|
+
"""Build the canonical QA artifact for parallel execution results."""
|
|
293
|
+
lines = [
|
|
294
|
+
"Parallel Execution Verification Report",
|
|
295
|
+
f"Success: {parallel_result.success_count}/{total_acceptance_criteria}",
|
|
296
|
+
]
|
|
297
|
+
if parallel_result.failure_count > 0:
|
|
298
|
+
lines.append(f"Failed: {parallel_result.failure_count}")
|
|
299
|
+
if parallel_result.skipped_count > 0:
|
|
300
|
+
lines.append(f"Skipped: {parallel_result.skipped_count}")
|
|
301
|
+
|
|
302
|
+
lines.append("")
|
|
303
|
+
lines.append("## AC Results")
|
|
304
|
+
for result in parallel_result.results:
|
|
305
|
+
lines.append("")
|
|
306
|
+
lines.extend(
|
|
307
|
+
_render_ac_section(
|
|
308
|
+
result,
|
|
309
|
+
index_path=(result.ac_index + 1,),
|
|
310
|
+
heading_level=3,
|
|
311
|
+
)
|
|
312
|
+
)
|
|
313
|
+
return "\n".join(lines)
|
|
314
|
+
|
|
315
|
+
|
|
316
|
+
def render_parallel_completion_message(
|
|
317
|
+
parallel_result: ParallelExecutionResult,
|
|
318
|
+
total_acceptance_criteria: int,
|
|
319
|
+
) -> str:
|
|
320
|
+
"""Build a concise operator-facing completion summary."""
|
|
321
|
+
lines = [
|
|
322
|
+
"Parallel Execution Complete",
|
|
323
|
+
f"Success: {parallel_result.success_count}/{total_acceptance_criteria}",
|
|
324
|
+
]
|
|
325
|
+
if parallel_result.failure_count > 0:
|
|
326
|
+
lines.append(f"Failed: {parallel_result.failure_count}")
|
|
327
|
+
if parallel_result.skipped_count > 0:
|
|
328
|
+
lines.append(f"Skipped: {parallel_result.skipped_count}")
|
|
329
|
+
|
|
330
|
+
lines.append("")
|
|
331
|
+
lines.append("AC Status:")
|
|
332
|
+
for result in parallel_result.results:
|
|
333
|
+
status = "PASS" if result.success else "FAIL"
|
|
334
|
+
suffix = f" ({len(result.sub_results)} sub-ACs)" if result.is_decomposed else ""
|
|
335
|
+
lines.append(f"- AC {result.ac_index + 1}: [{status}] {result.ac_content}{suffix}")
|
|
336
|
+
return "\n".join(lines)
|
|
337
|
+
|
|
338
|
+
|
|
192
339
|
# =============================================================================
|
|
193
340
|
# Parallel Executor
|
|
194
341
|
# =============================================================================
|
|
@@ -988,7 +1135,23 @@ class ParallelACExecutor:
|
|
|
988
1135
|
ac_content=ac_content,
|
|
989
1136
|
success=all_success,
|
|
990
1137
|
messages=(),
|
|
991
|
-
final_message=
|
|
1138
|
+
final_message="\n".join(
|
|
1139
|
+
_render_ac_section(
|
|
1140
|
+
ACExecutionResult(
|
|
1141
|
+
ac_index=ac_index,
|
|
1142
|
+
ac_content=ac_content,
|
|
1143
|
+
success=all_success,
|
|
1144
|
+
messages=(),
|
|
1145
|
+
duration_seconds=duration,
|
|
1146
|
+
is_decomposed=True,
|
|
1147
|
+
sub_results=tuple(sub_results),
|
|
1148
|
+
depth=depth,
|
|
1149
|
+
),
|
|
1150
|
+
index_path=(ac_index + 1,),
|
|
1151
|
+
heading_level=3,
|
|
1152
|
+
include_header=False,
|
|
1153
|
+
)
|
|
1154
|
+
),
|
|
992
1155
|
duration_seconds=duration,
|
|
993
1156
|
is_decomposed=True,
|
|
994
1157
|
sub_results=tuple(sub_results),
|
|
@@ -1144,7 +1144,11 @@ class OrchestratorRunner:
|
|
|
1144
1144
|
Result containing OrchestratorResult on success.
|
|
1145
1145
|
"""
|
|
1146
1146
|
from ouroboros.orchestrator.dependency_analyzer import DependencyAnalyzer
|
|
1147
|
-
from ouroboros.orchestrator.parallel_executor import
|
|
1147
|
+
from ouroboros.orchestrator.parallel_executor import (
|
|
1148
|
+
ParallelACExecutor,
|
|
1149
|
+
render_parallel_completion_message,
|
|
1150
|
+
render_parallel_verification_report,
|
|
1151
|
+
)
|
|
1148
1152
|
|
|
1149
1153
|
log.info(
|
|
1150
1154
|
"orchestrator.runner.parallel_mode_enabled",
|
|
@@ -1234,43 +1238,30 @@ class OrchestratorRunner:
|
|
|
1234
1238
|
# Determine overall success
|
|
1235
1239
|
success = parallel_result.all_succeeded
|
|
1236
1240
|
|
|
1237
|
-
|
|
1238
|
-
|
|
1239
|
-
|
|
1240
|
-
|
|
1241
|
-
|
|
1242
|
-
|
|
1243
|
-
|
|
1244
|
-
|
|
1245
|
-
|
|
1246
|
-
|
|
1247
|
-
|
|
1248
|
-
|
|
1249
|
-
|
|
1250
|
-
|
|
1251
|
-
|
|
1252
|
-
|
|
1253
|
-
|
|
1254
|
-
|
|
1255
|
-
# Include last 500 chars of agent output as evidence
|
|
1256
|
-
evidence = r.final_message[-500:] if len(r.final_message) > 500 else r.final_message
|
|
1257
|
-
summary_parts.append(evidence)
|
|
1258
|
-
elif r.error:
|
|
1259
|
-
summary_parts.append(f"Error: {r.error}")
|
|
1260
|
-
|
|
1261
|
-
final_message = "\n".join(summary_parts)
|
|
1241
|
+
final_message = render_parallel_completion_message(
|
|
1242
|
+
parallel_result,
|
|
1243
|
+
len(seed.acceptance_criteria),
|
|
1244
|
+
)
|
|
1245
|
+
verification_report = render_parallel_verification_report(
|
|
1246
|
+
parallel_result,
|
|
1247
|
+
len(seed.acceptance_criteria),
|
|
1248
|
+
)
|
|
1249
|
+
execution_summary = {
|
|
1250
|
+
"goal": seed.goal,
|
|
1251
|
+
"acceptance_criteria_count": len(seed.acceptance_criteria),
|
|
1252
|
+
"parallel_execution": True,
|
|
1253
|
+
"success_count": parallel_result.success_count,
|
|
1254
|
+
"failure_count": parallel_result.failure_count,
|
|
1255
|
+
"skipped_count": parallel_result.skipped_count,
|
|
1256
|
+
"total_levels": dependency_graph.total_levels,
|
|
1257
|
+
"verification_report": verification_report,
|
|
1258
|
+
}
|
|
1262
1259
|
|
|
1263
1260
|
# Emit completion event
|
|
1264
1261
|
if success:
|
|
1265
1262
|
completed_event = create_session_completed_event(
|
|
1266
1263
|
session_id=tracker.session_id,
|
|
1267
|
-
summary=
|
|
1268
|
-
"parallel_execution": True,
|
|
1269
|
-
"success_count": parallel_result.success_count,
|
|
1270
|
-
"failure_count": parallel_result.failure_count,
|
|
1271
|
-
"skipped_count": parallel_result.skipped_count,
|
|
1272
|
-
"total_levels": dependency_graph.total_levels,
|
|
1273
|
-
},
|
|
1264
|
+
summary=execution_summary,
|
|
1274
1265
|
messages_processed=parallel_result.total_messages,
|
|
1275
1266
|
)
|
|
1276
1267
|
await self._event_store.append(completed_event)
|
|
@@ -1327,14 +1318,7 @@ class OrchestratorRunner:
|
|
|
1327
1318
|
success=success,
|
|
1328
1319
|
session_id=tracker.session_id,
|
|
1329
1320
|
execution_id=exec_id,
|
|
1330
|
-
summary=
|
|
1331
|
-
"goal": seed.goal,
|
|
1332
|
-
"acceptance_criteria_count": len(seed.acceptance_criteria),
|
|
1333
|
-
"parallel_execution": True,
|
|
1334
|
-
"success_count": parallel_result.success_count,
|
|
1335
|
-
"failure_count": parallel_result.failure_count,
|
|
1336
|
-
"skipped_count": parallel_result.skipped_count,
|
|
1337
|
-
},
|
|
1321
|
+
summary=execution_summary,
|
|
1338
1322
|
messages_processed=parallel_result.total_messages,
|
|
1339
1323
|
final_message=final_message,
|
|
1340
1324
|
duration_seconds=duration,
|
|
@@ -74,7 +74,7 @@ class TestInitCommand:
|
|
|
74
74
|
) -> None:
|
|
75
75
|
"""Test init start with context argument."""
|
|
76
76
|
# Mock the LLM adapter and asyncio.run
|
|
77
|
-
with patch("ouroboros.cli.commands.init.
|
|
77
|
+
with patch("ouroboros.cli.commands.init.AnthropicAdapter") as mock_adapter_class:
|
|
78
78
|
mock_adapter = MagicMock()
|
|
79
79
|
mock_adapter.complete = mock_interview_llm_provider.complete
|
|
80
80
|
mock_adapter_class.return_value = mock_adapter
|
|
@@ -107,7 +107,7 @@ class TestInitCommand:
|
|
|
107
107
|
|
|
108
108
|
def test_init_list_no_interviews(self, temp_state_dir: Path) -> None:
|
|
109
109
|
"""Test init list when no interviews exist."""
|
|
110
|
-
with patch("ouroboros.cli.commands.init.
|
|
110
|
+
with patch("ouroboros.cli.commands.init.AnthropicAdapter"):
|
|
111
111
|
with patch("ouroboros.cli.commands.init.asyncio.run") as mock_run:
|
|
112
112
|
mock_run.return_value = []
|
|
113
113
|
|
|
@@ -121,7 +121,7 @@ class TestInitCommand:
|
|
|
121
121
|
|
|
122
122
|
def test_init_resume_missing_interview(self, temp_state_dir: Path) -> None:
|
|
123
123
|
"""Test init resume with non-existent interview ID."""
|
|
124
|
-
with patch("ouroboros.cli.commands.init.
|
|
124
|
+
with patch("ouroboros.cli.commands.init.AnthropicAdapter") as mock_adapter_class:
|
|
125
125
|
mock_adapter = MagicMock()
|
|
126
126
|
mock_adapter_class.return_value = mock_adapter
|
|
127
127
|
|