ouroboros-ai 0.26.2.dev35__tar.gz → 0.26.2.dev37__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of ouroboros-ai might be problematic. Click here for more details.
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/PKG-INFO +10 -19
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/README.ko.md +10 -22
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/README.md +9 -18
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/scripts/keyword-detector.py +34 -1
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/skills/help/SKILL.md +20 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/_version.py +2 -2
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/cli/commands/run.py +29 -4
- ouroboros_ai-0.26.2.dev37/src/ouroboros/core/project_paths.py +59 -0
- ouroboros_ai-0.26.2.dev37/src/ouroboros/evaluation/verification_artifacts.py +464 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/mcp/tools/evolution_handlers.py +76 -1
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/mcp/tools/execution_handlers.py +46 -4
- ouroboros_ai-0.26.2.dev37/tests/unit/cli/test_run_qa.py +214 -0
- ouroboros_ai-0.26.2.dev37/tests/unit/evaluation/test_verification_artifacts.py +454 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/mcp/tools/test_qa_integration.py +305 -30
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/.claude/settings.json +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/.claude-plugin/.mcp.json +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/.claude-plugin/marketplace.json +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/.claude-plugin/plugin.json +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/.env.example +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/.github/ISSUE_TEMPLATE/question.yml +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/.github/workflows/dev-publish.yml +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/.github/workflows/lint.yml +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/.github/workflows/release.yml +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/.github/workflows/test.yml +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/.gitignore +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/.mcp.json +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/.ouroboros/mechanical.toml +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/.pre-commit-config.yaml +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/.python-version +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/CHANGELOG.md +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/CLAUDE.md +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/CODE_OF_CONDUCT.md +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/CONTRIBUTING.md +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/HANDOFF.md +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/LICENSE +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/SECURITY.md +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/commands/cancel.md +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/commands/evaluate.md +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/commands/evolve.md +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/commands/help.md +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/commands/interview.md +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/commands/ralph.md +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/commands/run.md +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/commands/seed.md +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/commands/setup.md +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/commands/status.md +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/commands/tutorial.md +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/commands/unstuck.md +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/commands/welcome.md +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/crates/ouroboros-tui/.gitignore +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/crates/ouroboros-tui/Cargo.lock +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/crates/ouroboros-tui/Cargo.toml +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/crates/ouroboros-tui/README.md +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/crates/ouroboros-tui/src/db.rs +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/crates/ouroboros-tui/src/main.rs +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/crates/ouroboros-tui/src/mock.rs +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/crates/ouroboros-tui/src/state.rs +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/crates/ouroboros-tui/src/views/dashboard.rs +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/crates/ouroboros-tui/src/views/execution.rs +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/crates/ouroboros-tui/src/views/lineage.rs +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/crates/ouroboros-tui/src/views/logs.rs +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/crates/ouroboros-tui/src/views/mod.rs +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/crates/ouroboros-tui/src/views/session_selector.rs +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/docs/README.md +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/docs/api/README.md +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/docs/api/core.md +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/docs/api/mcp.md +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/docs/architecture.md +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/docs/cli-reference.md +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/docs/config-reference.md +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/docs/contributing/architecture-overview.md +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/docs/contributing/findings-registry.md +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/docs/contributing/issue-quality-policy.md +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/docs/contributing/key-patterns.md +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/docs/contributing/testing-guide.md +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/docs/examples/mcp-config.yaml +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/docs/getting-started.md +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/docs/guides/evaluation-pipeline.md +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/docs/guides/evolution-loop.md +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/docs/guides/issue-176-subagent-mcp-inheritance.md +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/docs/guides/seed-authoring.md +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/docs/guides/tui-usage.md +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/docs/images/PLACEHOLDER_README.md +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/docs/images/ouroboros.png +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/docs/platform-support.md +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/docs/runtime-capability-matrix.md +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/docs/runtime-guides/claude-code.md +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/docs/runtime-guides/codex.md +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/examples/coordinator_test_seed.yaml +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/examples/dummy_seed.yaml +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/examples/parallel_subac_test_seed.yaml +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/examples/subac_test_seed.yaml +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/examples/task_manager/README.md +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/examples/task_manager/__init__.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/examples/task_manager/__main__.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/examples/task_manager/cli.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/examples/task_manager/models.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/examples/task_manager/storage.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/examples/test_display.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/hooks/hooks.json +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/llms-full.txt +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/llms.txt +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/project-context.md +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/pyproject.toml +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/scripts/drift-monitor.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/scripts/install.sh +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/scripts/mcp-serve.sh +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/scripts/ralph-rewind.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/scripts/ralph.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/scripts/ralph.sh +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/scripts/session-start.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/scripts/sync-plugin-version.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/scripts/version-check.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/skills/brownfield/SKILL.md +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/skills/cancel/SKILL.md +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/skills/evaluate/SKILL.md +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/skills/evolve/SKILL.md +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/skills/interview/SKILL.md +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/skills/pm/SKILL.md +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/skills/qa/SKILL.md +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/skills/ralph/SKILL.md +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/skills/run/SKILL.md +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/skills/seed/SKILL.md +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/skills/setup/SKILL.md +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/skills/status/SKILL.md +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/skills/tutorial/SKILL.md +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/skills/unstuck/SKILL.md +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/skills/update/SKILL.md +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/skills/welcome/SKILL.md +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/__init__.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/__main__.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/agents/__init__.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/agents/advocate.md +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/agents/analysis-agent.md +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/agents/architect.md +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/agents/breadth-keeper.md +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/agents/code-executor.md +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/agents/codebase-explorer.md +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/agents/consensus-reviewer.md +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/agents/contrarian.md +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/agents/evaluator.md +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/agents/hacker.md +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/agents/judge.md +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/agents/loader.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/agents/ontologist.md +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/agents/ontology-analyst.md +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/agents/qa-judge.md +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/agents/research-agent.md +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/agents/researcher.md +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/agents/seed-architect.md +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/agents/seed-closer.md +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/agents/semantic-evaluator.md +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/agents/simplifier.md +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/agents/socratic-interviewer.md +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/bigbang/__init__.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/bigbang/ambiguity.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/bigbang/brownfield.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/bigbang/explore.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/bigbang/interview.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/bigbang/pm_document.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/bigbang/pm_interview.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/bigbang/pm_seed.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/bigbang/question_classifier.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/bigbang/seed_generator.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/cli/__init__.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/cli/commands/__init__.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/cli/commands/cancel.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/cli/commands/config.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/cli/commands/init.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/cli/commands/mcp.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/cli/commands/pm.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/cli/commands/setup.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/cli/commands/status.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/cli/commands/tui.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/cli/formatters/__init__.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/cli/formatters/panels.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/cli/formatters/progress.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/cli/formatters/tables.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/cli/formatters/workflow_display.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/cli/main.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/codex/__init__.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/codex/artifacts.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/codex/ouroboros.md +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/codex_permissions.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/config/__init__.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/config/loader.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/config/models.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/core/__init__.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/core/ac_tree.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/core/context.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/core/errors.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/core/file_lock.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/core/git_workflow.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/core/lineage.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/core/ontology_aspect.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/core/ontology_questions.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/core/security.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/core/seed.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/core/text.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/core/types.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/core/worktree.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/evaluation/__init__.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/evaluation/artifact_collector.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/evaluation/consensus.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/evaluation/json_utils.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/evaluation/languages.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/evaluation/mechanical.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/evaluation/models.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/evaluation/pipeline.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/evaluation/semantic.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/evaluation/trigger.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/events/__init__.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/events/base.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/events/decomposition.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/events/evaluation.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/events/interview.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/events/lineage.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/events/ontology.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/evolution/__init__.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/evolution/convergence.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/evolution/loop.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/evolution/projector.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/evolution/reflect.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/evolution/regression.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/evolution/wonder.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/execution/__init__.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/execution/atomicity.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/execution/decomposition.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/execution/double_diamond.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/execution/subagent.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/mcp/__init__.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/mcp/client/__init__.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/mcp/client/adapter.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/mcp/client/manager.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/mcp/client/protocol.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/mcp/errors.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/mcp/job_manager.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/mcp/resources/__init__.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/mcp/resources/handlers.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/mcp/server/__init__.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/mcp/server/adapter.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/mcp/server/protocol.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/mcp/server/security.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/mcp/tools/__init__.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/mcp/tools/authoring_handlers.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/mcp/tools/brownfield_handler.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/mcp/tools/dashboard.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/mcp/tools/definitions.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/mcp/tools/evaluation_handlers.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/mcp/tools/job_handlers.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/mcp/tools/pm_handler.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/mcp/tools/qa.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/mcp/tools/query_handlers.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/mcp/tools/registry.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/mcp/types.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/observability/__init__.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/observability/drift.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/observability/logging.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/observability/retrospective.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/orchestrator/__init__.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/orchestrator/adapter.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/orchestrator/codex_cli_runtime.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/orchestrator/command_dispatcher.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/orchestrator/coordinator.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/orchestrator/dependency_analyzer.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/orchestrator/events.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/orchestrator/execution_runtime_scope.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/orchestrator/execution_strategy.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/orchestrator/heartbeat.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/orchestrator/level_context.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/orchestrator/mcp_config.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/orchestrator/mcp_tools.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/orchestrator/parallel_executor.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/orchestrator/parallel_executor_models.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/orchestrator/runner.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/orchestrator/runtime_factory.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/orchestrator/runtime_message_projection.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/orchestrator/session.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/orchestrator/workflow_state.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/persistence/__init__.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/persistence/brownfield.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/persistence/checkpoint.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/persistence/event_store.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/persistence/migrations/__init__.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/persistence/migrations/runner.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/persistence/migrations/scripts/001_initial.sql +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/persistence/migrations/scripts/002_brownfield.sql +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/persistence/schema.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/persistence/uow.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/plugin/__init__.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/plugin/agents/__init__.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/plugin/agents/pool.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/plugin/agents/registry.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/plugin/orchestration/__init__.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/plugin/orchestration/router.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/plugin/orchestration/scheduler.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/plugin/skills/__init__.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/plugin/skills/docs.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/plugin/skills/executor.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/plugin/skills/keywords.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/plugin/skills/registry.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/pm/__init__.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/pm/renderer.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/providers/__init__.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/providers/anthropic_adapter.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/providers/base.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/providers/claude_code_adapter.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/providers/codex_cli_adapter.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/providers/codex_cli_stream.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/providers/factory.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/providers/litellm_adapter.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/py.typed +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/resilience/__init__.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/resilience/lateral.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/resilience/stagnation.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/routing/__init__.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/routing/complexity.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/routing/downgrade.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/routing/escalation.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/routing/router.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/routing/tiers.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/secondary/__init__.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/secondary/scheduler.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/secondary/todo_registry.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/strategies/__init__.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/strategies/devil_advocate.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/tui/__init__.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/tui/app.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/tui/components/__init__.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/tui/components/agents_panel.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/tui/components/event_log.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/tui/components/progress.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/tui/components/token_tracker.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/tui/events.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/tui/screens/__init__.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/tui/screens/confirm_rewind.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/tui/screens/dashboard.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/tui/screens/dashboard_v2.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/tui/screens/dashboard_v3.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/tui/screens/debug.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/tui/screens/execution.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/tui/screens/hud_dashboard.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/tui/screens/lineage_detail.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/tui/screens/lineage_selector.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/tui/screens/logs.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/tui/screens/session_selector.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/tui/widgets/__init__.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/tui/widgets/ac_progress.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/tui/widgets/ac_tree.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/tui/widgets/agent_activity.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/tui/widgets/cost_tracker.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/tui/widgets/drift_meter.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/tui/widgets/lineage_tree.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/tui/widgets/parallel_graph.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/tui/widgets/phase_progress.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/verification/__init__.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/verification/extractor.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/verification/models.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/verification/verifier.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/__init__.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/conftest.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/e2e/__init__.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/e2e/conftest.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/e2e/test_cli_commands.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/e2e/test_full_workflow.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/e2e/test_session_persistence.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/fixtures/test_atomicity_seed.yml +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/integration/__init__.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/integration/conftest.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/integration/mcp/__init__.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/integration/mcp/conftest.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/integration/mcp/test_client_adapter.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/integration/mcp/test_client_manager.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/integration/mcp/test_server_adapter.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/integration/plugin/test_orchestration.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/integration/test_codex_cli_passthrough_smoke.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/integration/test_codex_skill_fallback.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/integration/test_codex_skill_smoke.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/integration/test_entry_point.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/__init__.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/agents/__init__.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/agents/test_loader.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/bigbang/__init__.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/bigbang/test_ambiguity.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/bigbang/test_brownfield.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/bigbang/test_classifier_context.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/bigbang/test_decide_later_items.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/bigbang/test_explore.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/bigbang/test_interview.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/bigbang/test_pm_document_generator.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/bigbang/test_pm_document_writer.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/bigbang/test_pm_interview.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/bigbang/test_pm_interview_brownfield_db.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/bigbang/test_pm_seed_ac12.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/bigbang/test_pm_seed_save.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/bigbang/test_question_classifier.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/bigbang/test_seed_generator.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/cli/__init__.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/cli/formatters/__init__.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/cli/formatters/test_console.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/cli/formatters/test_panels.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/cli/formatters/test_progress.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/cli/formatters/test_tables.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/cli/formatters/test_workflow_display.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/cli/test_cancel.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/cli/test_init_pm_seed_detection.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/cli/test_init_runtime.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/cli/test_main.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/cli/test_mcp_nested_guard.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/cli/test_mcp_startup_cleanup.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/cli/test_pm_brownfield.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/cli/test_pm_overwrite.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/cli/test_pm_select_repos.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/cli/test_setup.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/config/__init__.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/config/test_loader.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/config/test_models.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/core/__init__.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/core/test_ac_tree.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/core/test_context.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/core/test_errors.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/core/test_git_workflow.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/core/test_lineage.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/core/test_ontology_aspect.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/core/test_ontology_questions.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/core/test_security.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/core/test_seed.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/core/test_types.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/core/test_worktree.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/evaluation/__init__.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/evaluation/test_consensus.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/evaluation/test_json_utils.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/evaluation/test_languages.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/evaluation/test_mechanical.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/evaluation/test_models.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/evaluation/test_semantic.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/evaluation/test_trigger.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/events/__init__.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/events/test_base.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/events/test_decomposition_events.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/evolution/test_wonder_scope.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/execution/__init__.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/execution/test_atomicity.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/execution/test_decomposition.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/execution/test_double_diamond.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/execution/test_subagent_isolation.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/mcp/__init__.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/mcp/client/__init__.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/mcp/client/test_adapter.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/mcp/client/test_manager.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/mcp/conftest.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/mcp/server/__init__.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/mcp/server/test_adapter.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/mcp/server/test_security.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/mcp/test_errors.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/mcp/test_job_manager.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/mcp/test_types.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/mcp/tools/__init__.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/mcp/tools/conftest.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/mcp/tools/test_brownfield_handler.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/mcp/tools/test_definitions.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/mcp/tools/test_pm_handler.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/mcp/tools/test_pm_handler_generate.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/mcp/tools/test_pm_handler_pending_reframe.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/mcp/tools/test_registry.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/observability/__init__.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/observability/test_drift.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/observability/test_logging.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/observability/test_retrospective.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/orchestrator/__init__.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/orchestrator/test_adapter.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/orchestrator/test_codex_cli_runtime.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/orchestrator/test_codex_recursion_guard.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/orchestrator/test_command_dispatcher.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/orchestrator/test_coordinator.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/orchestrator/test_dependency_analyzer.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/orchestrator/test_events.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/orchestrator/test_execution_runtime_scope.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/orchestrator/test_execution_strategy.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/orchestrator/test_inflight_cancellation.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/orchestrator/test_level_context.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/orchestrator/test_mcp_config.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/orchestrator/test_mcp_tools.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/orchestrator/test_parallel_executor.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/orchestrator/test_parallel_executor_retry_resume.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/orchestrator/test_runner.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/orchestrator/test_runner_cancellation.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/orchestrator/test_runtime_factory.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/orchestrator/test_runtime_message_projection.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/orchestrator/test_session.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/orchestrator/test_workflow_state.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/persistence/__init__.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/persistence/test_brownfield_store.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/persistence/test_checkpoint.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/persistence/test_event_store.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/persistence/test_schema.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/persistence/test_uow.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/plugin/__init__.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/plugin/agents/__init__.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/plugin/agents/test_registry.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/plugin/orchestration/__init__.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/plugin/orchestration/test_model_router.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/plugin/skills/__init__.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/plugin/skills/test_keywords.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/plugin/skills/test_registry.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/pm/__init__.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/pm/test_renderer.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/providers/__init__.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/providers/test_base.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/providers/test_claude_code_adapter.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/providers/test_codex_cli_adapter.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/providers/test_factory.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/providers/test_litellm_adapter.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/resilience/__init__.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/resilience/test_lateral.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/resilience/test_stagnation.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/routing/__init__.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/routing/test_complexity.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/routing/test_downgrade.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/routing/test_escalation.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/routing/test_router.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/routing/test_tiers.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/scripts/test_keyword_detector.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/scripts/test_version_check.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/secondary/__init__.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/secondary/test_scheduler.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/secondary/test_todo_registry.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/test_artifact_collector.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/test_codex_artifacts.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/test_convergence.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/test_dashboard.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/test_dependencies_configured.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/test_evolve_rewind.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/test_evolve_step.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/test_graceful_shutdown.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/test_main_entry_point.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/test_module_structure.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/test_project_initialization.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/test_projector_rewind.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/test_ralph_parser.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/test_ralph_rewind.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/test_regression.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/test_tooling_configuration.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/test_verification.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/tui/__init__.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/tui/test_app.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/tui/test_cancelled_display.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/tui/test_events.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/tui/test_lineage_viewer.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/tui/test_screens.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/tui/test_session_selector_replay.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/tui/test_widgets.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tools/sync_github_project.py +0 -0
- {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/uv.lock +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: ouroboros-ai
|
|
3
|
-
Version: 0.26.2.
|
|
3
|
+
Version: 0.26.2.dev37
|
|
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
|
|
@@ -78,26 +78,12 @@ Description-Content-Type: text/markdown
|
|
|
78
78
|
|
|
79
79
|
---
|
|
80
80
|
|
|
81
|
-
> **
|
|
81
|
+
> **New: PM Mode** — `ooo pm` generates a PRD through a guided PM-focused interview.
|
|
82
|
+
> Ouroboros now supports product management workflows: stakeholder alignment, user story mapping, and structured PRD generation — all driven by the same Socratic engine.
|
|
82
83
|
>
|
|
83
|
-
> LiteLLM versions **1.82.7** and **1.82.8** on PyPI contained a malicious `.pth` file that auto-executes on every Python startup, exfiltrating environment variables, API keys, and credentials to an external server.
|
|
84
|
-
>
|
|
85
|
-
> **What we did:** Ouroboros now pins LiteLLM to **`<=1.82.6`** (safe versions only) as an optional dependency. LiteLLM is no longer a core dependency — it is only installed when you explicitly opt in via `pip install ouroboros-ai[litellm]`.
|
|
86
|
-
>
|
|
87
|
-
> **If you previously installed litellm 1.82.7 or 1.82.8**, the malicious `.pth` file may still be on your system even after upgrading. Clean up manually:
|
|
88
|
-
>
|
|
89
|
-
> ```bash
|
|
90
|
-
> # 1. Find and delete the malicious file
|
|
91
|
-
> find / -name "litellm_init.pth" 2>/dev/null
|
|
92
|
-
>
|
|
93
|
-
> # 2. Clean package manager caches
|
|
94
|
-
> uv cache clean litellm # if using uv
|
|
95
|
-
> pip cache purge # if using pip
|
|
96
|
-
>
|
|
97
|
-
> # 3. Rotate ALL credentials that were on your system during the exposure window
|
|
98
84
|
> ```
|
|
99
|
-
>
|
|
100
|
-
>
|
|
85
|
+
> > ooo pm "I want to build a notification system"
|
|
86
|
+
> ```
|
|
101
87
|
|
|
102
88
|
---
|
|
103
89
|
|
|
@@ -148,6 +134,7 @@ Then run `ooo setup` inside a Claude Code session.
|
|
|
148
134
|
```bash
|
|
149
135
|
pip install ouroboros-ai # base
|
|
150
136
|
pip install ouroboros-ai[claude] # + Claude Code deps
|
|
137
|
+
pip install ouroboros-ai[litellm] # + LiteLLM multi-provider
|
|
151
138
|
pip install ouroboros-ai[all] # everything
|
|
152
139
|
ouroboros setup # configure runtime
|
|
153
140
|
```
|
|
@@ -259,6 +246,10 @@ Inside AI coding agent sessions, use `ooo <cmd>` skills. From the terminal, use
|
|
|
259
246
|
| `ooo ralph` | *(via MCP)* | Persistent loop until verified |
|
|
260
247
|
| `ooo tutorial` | *(interactive)* | Interactive hands-on learning |
|
|
261
248
|
| `ooo help` | `ouroboros --help` | Full reference |
|
|
249
|
+
| `ooo pm` | *(via MCP)* | PM-focused interview + PRD generation |
|
|
250
|
+
| `ooo qa` | *(via skill)* | General-purpose QA verdict for any artifact |
|
|
251
|
+
| `ooo update` | `ouroboros update` | Check for updates + upgrade to latest |
|
|
252
|
+
| `ooo brownfield` | *(via skill)* | Scan and manage brownfield repo defaults |
|
|
262
253
|
|
|
263
254
|
> Not all skills have direct CLI equivalents. Some (`evaluate`, `evolve`, `unstuck`, `ralph`) are available through agent skills or MCP tools only.
|
|
264
255
|
|
|
@@ -37,30 +37,12 @@
|
|
|
37
37
|
|
|
38
38
|
---
|
|
39
39
|
|
|
40
|
-
>
|
|
40
|
+
> **New: PM 모드** — `ooo pm`으로 소크라테스식 PM 인터뷰를 통해 PRD를 자동 생성할 수 있습니다.
|
|
41
|
+
> 이해관계자 정렬, 유저 스토리 매핑, 구조화된 PRD 생성까지 — 같은 소크라테스 엔진이 제품 관리 워크플로우도 지원합니다.
|
|
41
42
|
>
|
|
42
|
-
> LiteLLM 1.82.7 / 1.82.8 버전에 악성 `.pth` 파일이 포함되어 배포되었습니다. 이 파일은 `import` 없이도 **Python 시작 시 자동 실행**되며, 환경변수, API 키, SSH 키, 클라우드 크레덴셜을 외부 서버로 전송합니다.
|
|
43
|
-
>
|
|
44
|
-
> **영향 범위:** 2026년 3월 23일 이후에 아래 중 하나라도 해당되면 감염 가능성이 있습니다:
|
|
45
|
-
> - Ouroboros를 신규 설치 (`pip install ouroboros-ai`, `uv tool install ouroboros-ai`)
|
|
46
|
-
> - 기존 설치를 업그레이드 (`pip install --upgrade ouroboros-ai`)
|
|
47
|
-
>
|
|
48
|
-
> 두 경우 모두 `litellm>=1.80.0` 의존성이 악성 버전 1.82.7/1.82.8로 resolve됩니다. 그 이전에 설치하고 재설치/업그레이드하지 않았다면 안전합니다.
|
|
49
|
-
>
|
|
50
|
-
> **Ouroboros는 litellm 의존성을 완전 제거했습니다** (v0.25.2 stable / v0.26.0b7 beta). 단, **Ouroboros를 업데이트하면 의존성 목록에서 litellm이 빠질 뿐, 이미 설치된 litellm 패키지와 악성 `.pth` 파일은 그대로 남아있습니다.** 수동 정리가 필요합니다:
|
|
51
|
-
>
|
|
52
|
-
> ```bash
|
|
53
|
-
> # 1. 악성 파일 찾기 — 결과가 나오면 즉시 삭제
|
|
54
|
-
> find / -name "litellm_init.pth" 2>/dev/null
|
|
55
|
-
>
|
|
56
|
-
> # 2. 패키지 매니저 캐시 정리
|
|
57
|
-
> uv cache clean litellm # uv 사용자
|
|
58
|
-
> pip cache purge # pip 사용자
|
|
59
|
-
>
|
|
60
|
-
> # 3. 노출 기간 동안 시스템에 있던 모든 크레덴셜 로테이션
|
|
61
43
|
> ```
|
|
62
|
-
>
|
|
63
|
-
>
|
|
44
|
+
> > ooo pm "알림 시스템을 만들고 싶어"
|
|
45
|
+
> ```
|
|
64
46
|
|
|
65
47
|
---
|
|
66
48
|
|
|
@@ -136,6 +118,7 @@ Claude Code 세션 안에서 `ooo setup` 실행.
|
|
|
136
118
|
```bash
|
|
137
119
|
pip install ouroboros-ai # 기본
|
|
138
120
|
pip install ouroboros-ai[claude] # + Claude Code 의존성
|
|
121
|
+
pip install ouroboros-ai[litellm] # + LiteLLM 멀티 프로바이더
|
|
139
122
|
pip install ouroboros-ai[all] # 전부
|
|
140
123
|
ouroboros setup # 런타임 설정
|
|
141
124
|
```
|
|
@@ -283,6 +266,11 @@ Gen 3: {Task, Priority, Status, DueDate} → similarity 1.00 → CONVERGED
|
|
|
283
266
|
| `ooo ralph` | 검증될 때까지 계속 도는 루프 |
|
|
284
267
|
| `ooo tutorial` | 대화형 실습 |
|
|
285
268
|
| `ooo help` | 전체 참조 |
|
|
269
|
+
| `ooo pm` | PM 인터뷰 + PRD 생성 |
|
|
270
|
+
| `ooo qa` | 범용 QA 판정 |
|
|
271
|
+
| `ooo cancel` | 멈춘 실행 취소 |
|
|
272
|
+
| `ooo update` | 최신 버전 확인 + 업그레이드 |
|
|
273
|
+
| `ooo brownfield` | 기존 저장소 스캔 + 기본값 관리 |
|
|
286
274
|
|
|
287
275
|
---
|
|
288
276
|
|
|
@@ -38,26 +38,12 @@
|
|
|
38
38
|
|
|
39
39
|
---
|
|
40
40
|
|
|
41
|
-
> **
|
|
41
|
+
> **New: PM Mode** — `ooo pm` generates a PRD through a guided PM-focused interview.
|
|
42
|
+
> Ouroboros now supports product management workflows: stakeholder alignment, user story mapping, and structured PRD generation — all driven by the same Socratic engine.
|
|
42
43
|
>
|
|
43
|
-
> LiteLLM versions **1.82.7** and **1.82.8** on PyPI contained a malicious `.pth` file that auto-executes on every Python startup, exfiltrating environment variables, API keys, and credentials to an external server.
|
|
44
|
-
>
|
|
45
|
-
> **What we did:** Ouroboros now pins LiteLLM to **`<=1.82.6`** (safe versions only) as an optional dependency. LiteLLM is no longer a core dependency — it is only installed when you explicitly opt in via `pip install ouroboros-ai[litellm]`.
|
|
46
|
-
>
|
|
47
|
-
> **If you previously installed litellm 1.82.7 or 1.82.8**, the malicious `.pth` file may still be on your system even after upgrading. Clean up manually:
|
|
48
|
-
>
|
|
49
|
-
> ```bash
|
|
50
|
-
> # 1. Find and delete the malicious file
|
|
51
|
-
> find / -name "litellm_init.pth" 2>/dev/null
|
|
52
|
-
>
|
|
53
|
-
> # 2. Clean package manager caches
|
|
54
|
-
> uv cache clean litellm # if using uv
|
|
55
|
-
> pip cache purge # if using pip
|
|
56
|
-
>
|
|
57
|
-
> # 3. Rotate ALL credentials that were on your system during the exposure window
|
|
58
44
|
> ```
|
|
59
|
-
>
|
|
60
|
-
>
|
|
45
|
+
> > ooo pm "I want to build a notification system"
|
|
46
|
+
> ```
|
|
61
47
|
|
|
62
48
|
---
|
|
63
49
|
|
|
@@ -108,6 +94,7 @@ Then run `ooo setup` inside a Claude Code session.
|
|
|
108
94
|
```bash
|
|
109
95
|
pip install ouroboros-ai # base
|
|
110
96
|
pip install ouroboros-ai[claude] # + Claude Code deps
|
|
97
|
+
pip install ouroboros-ai[litellm] # + LiteLLM multi-provider
|
|
111
98
|
pip install ouroboros-ai[all] # everything
|
|
112
99
|
ouroboros setup # configure runtime
|
|
113
100
|
```
|
|
@@ -219,6 +206,10 @@ Inside AI coding agent sessions, use `ooo <cmd>` skills. From the terminal, use
|
|
|
219
206
|
| `ooo ralph` | *(via MCP)* | Persistent loop until verified |
|
|
220
207
|
| `ooo tutorial` | *(interactive)* | Interactive hands-on learning |
|
|
221
208
|
| `ooo help` | `ouroboros --help` | Full reference |
|
|
209
|
+
| `ooo pm` | *(via MCP)* | PM-focused interview + PRD generation |
|
|
210
|
+
| `ooo qa` | *(via skill)* | General-purpose QA verdict for any artifact |
|
|
211
|
+
| `ooo update` | `ouroboros update` | Check for updates + upgrade to latest |
|
|
212
|
+
| `ooo brownfield` | *(via skill)* | Scan and manage brownfield repo defaults |
|
|
222
213
|
|
|
223
214
|
> Not all skills have direct CLI equivalents. Some (`evaluate`, `evolve`, `unstuck`, `ralph`) are available through agent skills or MCP tools only.
|
|
224
215
|
|
|
@@ -19,7 +19,11 @@ import sys
|
|
|
19
19
|
|
|
20
20
|
# Skills that work without MCP setup (bypass the setup gate)
|
|
21
21
|
# qa has a built-in fallback that adopts the qa-judge agent directly
|
|
22
|
-
SETUP_BYPASS_SKILLS = [
|
|
22
|
+
SETUP_BYPASS_SKILLS = [
|
|
23
|
+
"/ouroboros:setup",
|
|
24
|
+
"/ouroboros:help",
|
|
25
|
+
"/ouroboros:qa",
|
|
26
|
+
]
|
|
23
27
|
|
|
24
28
|
# Keyword → skill mapping
|
|
25
29
|
# "ooo <cmd>" prefix always works; natural language keywords also supported
|
|
@@ -37,9 +41,22 @@ KEYWORD_MAP = [
|
|
|
37
41
|
{"patterns": ["ooo welcome"], "skill": "/ouroboros:welcome"},
|
|
38
42
|
{"patterns": ["ooo setup"], "skill": "/ouroboros:setup"},
|
|
39
43
|
{"patterns": ["ooo help"], "skill": "/ouroboros:help"},
|
|
44
|
+
{"patterns": ["ooo pm", "ooo prd"], "skill": "/ouroboros:pm"},
|
|
40
45
|
{"patterns": ["ooo qa", "qa check", "quality check"], "skill": "/ouroboros:qa"},
|
|
46
|
+
{"patterns": ["ooo cancel", "ooo abort"], "skill": "/ouroboros:cancel"},
|
|
41
47
|
{"patterns": ["ooo update", "ooo upgrade"], "skill": "/ouroboros:update"},
|
|
48
|
+
{"patterns": ["ooo brownfield"], "skill": "/ouroboros:brownfield"},
|
|
42
49
|
# Natural language triggers
|
|
50
|
+
# PM triggers must precede generic interview to avoid "pm interview" being shadowed
|
|
51
|
+
{
|
|
52
|
+
"patterns": [
|
|
53
|
+
"write prd",
|
|
54
|
+
"pm interview",
|
|
55
|
+
"product requirements",
|
|
56
|
+
"create prd",
|
|
57
|
+
],
|
|
58
|
+
"skill": "/ouroboros:pm",
|
|
59
|
+
},
|
|
43
60
|
{
|
|
44
61
|
"patterns": [
|
|
45
62
|
"interview me",
|
|
@@ -97,6 +114,22 @@ KEYWORD_MAP = [
|
|
|
97
114
|
"patterns": ["update ouroboros", "upgrade ouroboros"],
|
|
98
115
|
"skill": "/ouroboros:update",
|
|
99
116
|
},
|
|
117
|
+
{
|
|
118
|
+
"patterns": [
|
|
119
|
+
"cancel execution",
|
|
120
|
+
"stop job",
|
|
121
|
+
"kill stuck",
|
|
122
|
+
"abort execution",
|
|
123
|
+
],
|
|
124
|
+
"skill": "/ouroboros:cancel",
|
|
125
|
+
},
|
|
126
|
+
{
|
|
127
|
+
"patterns": [
|
|
128
|
+
"brownfield defaults",
|
|
129
|
+
"brownfield scan",
|
|
130
|
+
],
|
|
131
|
+
"skill": "/ouroboros:brownfield",
|
|
132
|
+
},
|
|
100
133
|
]
|
|
101
134
|
|
|
102
135
|
|
|
@@ -41,6 +41,11 @@ Ouroboros is a **requirement crystallization engine** for AI workflows. It trans
|
|
|
41
41
|
| `ooo welcome` | First-touch welcome guide | Plugin |
|
|
42
42
|
| `ooo tutorial` | Interactive hands-on learning | Plugin |
|
|
43
43
|
| `ooo help` | This reference guide | Plugin |
|
|
44
|
+
| `ooo pm` | PM-focused interview + PRD generation | MCP |
|
|
45
|
+
| `ooo qa` | General-purpose QA verdict for any artifact | Plugin |
|
|
46
|
+
| `ooo cancel` | Cancel stuck or orphaned executions | CLI |
|
|
47
|
+
| `ooo update` | Check for updates + upgrade to latest | Plugin |
|
|
48
|
+
| `ooo brownfield` | Scan and manage brownfield repo defaults | MCP |
|
|
44
49
|
|
|
45
50
|
### Evolutionary Loop
|
|
46
51
|
|
|
@@ -63,6 +68,16 @@ Ouroboros is a **requirement crystallization engine** for AI workflows. It trans
|
|
|
63
68
|
| "think sideways", "i'm stuck", "break through", "lateral thinking" | `ooo unstuck` |
|
|
64
69
|
| "am I drifting?", "drift check", "session status" | `ooo status` |
|
|
65
70
|
|
|
71
|
+
### Utility Triggers
|
|
72
|
+
|
|
73
|
+
| Phrase | Triggers |
|
|
74
|
+
|--------|----------|
|
|
75
|
+
| "write prd", "pm interview", "product requirements", "create prd" | `ooo pm` |
|
|
76
|
+
| "qa check", "quality check" | `ooo qa` |
|
|
77
|
+
| "cancel execution", "stop job", "kill stuck", "abort execution" | `ooo cancel` |
|
|
78
|
+
| "update ouroboros", "upgrade ouroboros" | `ooo update` |
|
|
79
|
+
| "brownfield defaults", "brownfield scan" | `ooo brownfield` |
|
|
80
|
+
|
|
66
81
|
### Loop Triggers
|
|
67
82
|
|
|
68
83
|
| Phrase | Triggers |
|
|
@@ -86,6 +101,11 @@ Ouroboros is a **requirement crystallization engine** for AI workflows. It trans
|
|
|
86
101
|
| `/ouroboros:setup` | Installation wizard | Plugin |
|
|
87
102
|
| `/ouroboros:tutorial` | Interactive hands-on learning | Plugin |
|
|
88
103
|
| `/ouroboros:help` | This guide | Plugin |
|
|
104
|
+
| `/ouroboros:pm` | PM-focused interview + PRD generation | MCP |
|
|
105
|
+
| `/ouroboros:qa` | General-purpose QA verdict for any artifact | Plugin |
|
|
106
|
+
| `/ouroboros:cancel` | Cancel stuck or orphaned executions | CLI |
|
|
107
|
+
| `/ouroboros:update` | Check for updates + upgrade to latest | Plugin |
|
|
108
|
+
| `/ouroboros:brownfield` | Scan and manage brownfield repo defaults | MCP |
|
|
89
109
|
|
|
90
110
|
### Loop Skills
|
|
91
111
|
|
|
@@ -18,7 +18,7 @@ version_tuple: tuple[int | str, ...]
|
|
|
18
18
|
commit_id: str | None
|
|
19
19
|
__commit_id__: str | None
|
|
20
20
|
|
|
21
|
-
__version__ = version = '0.26.2.
|
|
22
|
-
__version_tuple__ = version_tuple = (0, 26, 2, '
|
|
21
|
+
__version__ = version = '0.26.2.dev37'
|
|
22
|
+
__version_tuple__ = version_tuple = (0, 26, 2, 'dev37')
|
|
23
23
|
|
|
24
24
|
__commit_id__ = commit_id = None
|
|
@@ -20,6 +20,7 @@ if TYPE_CHECKING:
|
|
|
20
20
|
|
|
21
21
|
from ouroboros.cli.formatters import console
|
|
22
22
|
from ouroboros.cli.formatters.panels import print_error, print_info, print_success, print_warning
|
|
23
|
+
from ouroboros.core.project_paths import resolve_seed_project_path
|
|
23
24
|
from ouroboros.core.security import InputValidator
|
|
24
25
|
from ouroboros.core.worktree import (
|
|
25
26
|
TaskWorkspace,
|
|
@@ -27,6 +28,7 @@ from ouroboros.core.worktree import (
|
|
|
27
28
|
maybe_prepare_task_workspace,
|
|
28
29
|
maybe_restore_task_workspace,
|
|
29
30
|
)
|
|
31
|
+
from ouroboros.evaluation.verification_artifacts import build_verification_artifacts
|
|
30
32
|
|
|
31
33
|
|
|
32
34
|
class _DefaultWorkflowGroup(typer.core.TyperGroup):
|
|
@@ -101,6 +103,12 @@ def _load_seed_from_yaml(seed_file: Path) -> dict[str, Any]:
|
|
|
101
103
|
raise typer.Exit(1) from e
|
|
102
104
|
|
|
103
105
|
|
|
106
|
+
def _resolve_cli_project_dir(seed: "Seed", seed_file: Path) -> Path:
|
|
107
|
+
"""Resolve the project directory for CLI execution and verification."""
|
|
108
|
+
stable_base = seed_file.parent.resolve()
|
|
109
|
+
return resolve_seed_project_path(seed, stable_base=stable_base) or stable_base
|
|
110
|
+
|
|
111
|
+
|
|
104
112
|
async def _initialize_mcp_manager(
|
|
105
113
|
config_path: Path,
|
|
106
114
|
tool_prefix: str, # noqa: ARG001
|
|
@@ -218,6 +226,7 @@ async def _run_orchestrator(
|
|
|
218
226
|
event_store = EventStore(f"sqlite+aiosqlite:///{db_path}")
|
|
219
227
|
await event_store.initialize()
|
|
220
228
|
|
|
229
|
+
project_dir = _resolve_cli_project_dir(seed, seed_file)
|
|
221
230
|
session_repo = SessionRepository(event_store)
|
|
222
231
|
workspace: TaskWorkspace | None = None
|
|
223
232
|
execution_id: str | None = None
|
|
@@ -235,14 +244,14 @@ async def _run_orchestrator(
|
|
|
235
244
|
workspace = maybe_restore_task_workspace(
|
|
236
245
|
resume_session,
|
|
237
246
|
persisted,
|
|
238
|
-
fallback_source_cwd=
|
|
247
|
+
fallback_source_cwd=project_dir,
|
|
239
248
|
)
|
|
240
249
|
session_id_for_run = resume_session
|
|
241
250
|
execution_id = reconstructed.value.execution_id
|
|
242
251
|
else:
|
|
243
252
|
session_id_for_run = f"orch_{uuid4().hex[:12]}"
|
|
244
253
|
execution_id = f"exec_{uuid4().hex[:12]}"
|
|
245
|
-
workspace = maybe_prepare_task_workspace(
|
|
254
|
+
workspace = maybe_prepare_task_workspace(project_dir, session_id_for_run)
|
|
246
255
|
except WorktreeError as e:
|
|
247
256
|
print_error(f"Task workspace error: {e.message}")
|
|
248
257
|
raise typer.Exit(1) from e
|
|
@@ -253,7 +262,7 @@ async def _run_orchestrator(
|
|
|
253
262
|
|
|
254
263
|
adapter = create_agent_runtime(
|
|
255
264
|
backend=runtime_backend,
|
|
256
|
-
cwd=Path(workspace.effective_cwd) if workspace else
|
|
265
|
+
cwd=Path(workspace.effective_cwd) if workspace else project_dir,
|
|
257
266
|
)
|
|
258
267
|
runner = OrchestratorRunner(
|
|
259
268
|
adapter,
|
|
@@ -301,12 +310,28 @@ async def _run_orchestrator(
|
|
|
301
310
|
print_info("Running post-execution QA...")
|
|
302
311
|
qa_handler = QAHandler()
|
|
303
312
|
quality_bar = _derive_quality_bar(seed)
|
|
313
|
+
execution_artifact = _get_verification_artifact(res.summary, res.final_message)
|
|
314
|
+
verification_working_dir = (
|
|
315
|
+
Path(workspace.effective_cwd) if workspace is not None else project_dir
|
|
316
|
+
)
|
|
317
|
+
try:
|
|
318
|
+
verification = await build_verification_artifacts(
|
|
319
|
+
res.execution_id,
|
|
320
|
+
execution_artifact,
|
|
321
|
+
verification_working_dir,
|
|
322
|
+
)
|
|
323
|
+
artifact = verification.artifact
|
|
324
|
+
reference = verification.reference
|
|
325
|
+
except Exception as e:
|
|
326
|
+
artifact = execution_artifact
|
|
327
|
+
reference = f"Verification artifact generation failed: {e}"
|
|
304
328
|
|
|
305
329
|
qa_result = await qa_handler.handle(
|
|
306
330
|
{
|
|
307
|
-
"artifact":
|
|
331
|
+
"artifact": artifact,
|
|
308
332
|
"artifact_type": "test_output",
|
|
309
333
|
"quality_bar": quality_bar,
|
|
334
|
+
"reference": reference,
|
|
310
335
|
"seed_content": yaml.dump(seed_data, default_flow_style=False),
|
|
311
336
|
"pass_threshold": 0.80,
|
|
312
337
|
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
"""Helpers for resolving project directories from seed and runtime context."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from pathlib import Path
|
|
6
|
+
from typing import Any
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
def resolve_path_against_base(raw_path: str | Path | None, *, stable_base: Path) -> Path | None:
|
|
10
|
+
"""Resolve a path against a stable base directory."""
|
|
11
|
+
if raw_path is None:
|
|
12
|
+
return None
|
|
13
|
+
|
|
14
|
+
candidate = Path(raw_path).expanduser()
|
|
15
|
+
if candidate.is_absolute():
|
|
16
|
+
return candidate.resolve()
|
|
17
|
+
return (stable_base / candidate).resolve()
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def project_path_candidates_from_seed(seed: Any) -> tuple[str, ...]:
|
|
21
|
+
"""Extract likely project directories from seed metadata and brownfield refs."""
|
|
22
|
+
if seed is None:
|
|
23
|
+
return ()
|
|
24
|
+
|
|
25
|
+
candidates: list[str] = []
|
|
26
|
+
seed_meta = getattr(seed, "metadata", None)
|
|
27
|
+
if seed_meta is not None:
|
|
28
|
+
project_dir = getattr(seed_meta, "project_dir", None) or getattr(
|
|
29
|
+
seed_meta,
|
|
30
|
+
"working_directory",
|
|
31
|
+
None,
|
|
32
|
+
)
|
|
33
|
+
if isinstance(project_dir, str) and project_dir:
|
|
34
|
+
candidates.append(project_dir)
|
|
35
|
+
|
|
36
|
+
brownfield_context = getattr(seed, "brownfield_context", None)
|
|
37
|
+
context_references = getattr(brownfield_context, "context_references", ()) or ()
|
|
38
|
+
|
|
39
|
+
for reference in context_references:
|
|
40
|
+
path = getattr(reference, "path", None)
|
|
41
|
+
role = getattr(reference, "role", None)
|
|
42
|
+
if isinstance(path, str) and path and role == "primary":
|
|
43
|
+
candidates.append(path)
|
|
44
|
+
|
|
45
|
+
for reference in context_references:
|
|
46
|
+
path = getattr(reference, "path", None)
|
|
47
|
+
if isinstance(path, str) and path and path not in candidates:
|
|
48
|
+
candidates.append(path)
|
|
49
|
+
|
|
50
|
+
return tuple(candidates)
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
def resolve_seed_project_path(seed: Any, *, stable_base: Path) -> Path | None:
|
|
54
|
+
"""Resolve the highest-priority project path encoded in a seed."""
|
|
55
|
+
for candidate in project_path_candidates_from_seed(seed):
|
|
56
|
+
resolved = resolve_path_against_base(candidate, stable_base=stable_base)
|
|
57
|
+
if resolved is not None:
|
|
58
|
+
return resolved
|
|
59
|
+
return None
|