ouroboros-ai 0.29.3.dev5__tar.gz → 0.29.3.dev6__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.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/CLAUDE.md +1 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/PKG-INFO +1 -1
- ouroboros_ai-0.29.3.dev6/skills/resume/SKILL.md +116 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/_version.py +2 -2
- ouroboros_ai-0.29.3.dev6/src/ouroboros/cli/commands/resume.py +333 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/cli/main.py +2 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/persistence/event_store.py +90 -16
- ouroboros_ai-0.29.3.dev6/tests/unit/cli/test_doc_commands.py +187 -0
- ouroboros_ai-0.29.3.dev6/tests/unit/cli/test_resume.py +660 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/.claude/settings.json +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/.claude-plugin/.mcp.json +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/.claude-plugin/marketplace.json +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/.claude-plugin/plugin.json +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/.env.example +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/.github/ISSUE_TEMPLATE/question.yml +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/.github/workflows/dev-publish.yml +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/.github/workflows/lint.yml +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/.github/workflows/release.yml +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/.github/workflows/test.yml +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/.gitignore +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/.mcp.json +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/.ouroboros/mechanical.toml +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/.ouroboros/seeds/seed_73827177a2a3.yaml +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/.ouroboros/seeds/seed_78c8e6e41813.yaml +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/.pre-commit-config.yaml +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/.python-version +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/CHANGELOG.md +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/CODE_OF_CONDUCT.md +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/CONTRIBUTING.md +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/Code-Review-Claude.md +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/Code-Review-Codex.md +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/HANDOFF.md +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/LICENSE +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/README.ko.md +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/README.md +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/SECURITY.md +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/UNINSTALL.md +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/commands/cancel.md +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/commands/evaluate.md +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/commands/evolve.md +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/commands/help.md +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/commands/interview.md +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/commands/ralph.md +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/commands/run.md +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/commands/seed.md +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/commands/setup.md +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/commands/status.md +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/commands/tutorial.md +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/commands/unstuck.md +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/commands/welcome.md +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/crates/ouroboros-tui/.gitignore +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/crates/ouroboros-tui/Cargo.lock +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/crates/ouroboros-tui/Cargo.toml +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/crates/ouroboros-tui/README.md +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/crates/ouroboros-tui/src/db.rs +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/crates/ouroboros-tui/src/main.rs +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/crates/ouroboros-tui/src/mock.rs +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/crates/ouroboros-tui/src/state.rs +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/crates/ouroboros-tui/src/views/dashboard.rs +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/crates/ouroboros-tui/src/views/execution.rs +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/crates/ouroboros-tui/src/views/lineage.rs +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/crates/ouroboros-tui/src/views/logs.rs +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/crates/ouroboros-tui/src/views/mod.rs +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/crates/ouroboros-tui/src/views/session_selector.rs +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/docs/README.md +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/docs/api/README.md +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/docs/api/core.md +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/docs/api/mcp.md +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/docs/architecture.md +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/docs/cli-reference.md +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/docs/config-reference.md +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/docs/contributing/architecture-overview.md +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/docs/contributing/findings-registry.md +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/docs/contributing/issue-quality-policy.md +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/docs/contributing/key-patterns.md +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/docs/contributing/testing-guide.md +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/docs/events.md +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/docs/examples/mcp-config.yaml +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/docs/getting-started.md +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/docs/guides/evaluation-pipeline.md +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/docs/guides/evolution-loop.md +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/docs/guides/issue-176-subagent-mcp-inheritance.md +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/docs/guides/mcp-bridge.md +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/docs/guides/ooo-skill-dispatch-router.md +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/docs/guides/opencode-subagent-bridge.md +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/docs/guides/seed-authoring.md +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/docs/guides/tui-usage.md +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/docs/images/PLACEHOLDER_README.md +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/docs/images/ouroboros.png +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/docs/platform-support.md +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/docs/runtime-capability-matrix.md +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/docs/runtime-guides/claude-code.md +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/docs/runtime-guides/codex.md +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/docs/runtime-guides/hermes.md +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/docs/runtime-guides/opencode.md +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/examples/coordinator_test_seed.yaml +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/examples/dummy_seed.yaml +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/examples/parallel_subac_test_seed.yaml +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/examples/subac_test_seed.yaml +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/examples/task_manager/README.md +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/examples/task_manager/__init__.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/examples/task_manager/__main__.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/examples/task_manager/cli.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/examples/task_manager/models.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/examples/task_manager/storage.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/examples/test_display.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/hooks/hooks.json +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/llms-full.txt +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/llms.txt +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/project-context.md +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/pyproject.toml +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/scripts/drift-monitor.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/scripts/install.sh +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/scripts/keyword-detector.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/scripts/mcp-serve.sh +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/scripts/ralph-rewind.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/scripts/ralph.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/scripts/ralph.sh +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/scripts/session-start.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/scripts/sync-plugin-version.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/scripts/version-check.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/skills/brownfield/SKILL.md +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/skills/cancel/SKILL.md +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/skills/evaluate/SKILL.md +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/skills/evolve/SKILL.md +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/skills/help/SKILL.md +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/skills/interview/SKILL.md +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/skills/pm/SKILL.md +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/skills/publish/SKILL.md +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/skills/qa/SKILL.md +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/skills/ralph/SKILL.md +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/skills/run/SKILL.md +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/skills/seed/SKILL.md +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/skills/setup/SKILL.md +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/skills/status/SKILL.md +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/skills/tutorial/SKILL.md +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/skills/unstuck/SKILL.md +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/skills/update/SKILL.md +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/skills/welcome/SKILL.md +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/__init__.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/__main__.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/agents/__init__.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/agents/advocate.md +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/agents/analysis-agent.md +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/agents/architect.md +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/agents/breadth-keeper.md +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/agents/code-executor.md +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/agents/codebase-explorer.md +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/agents/consensus-reviewer.md +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/agents/contrarian.md +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/agents/evaluator.md +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/agents/hacker.md +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/agents/judge.md +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/agents/loader.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/agents/ontologist.md +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/agents/ontology-analyst.md +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/agents/qa-judge.md +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/agents/research-agent.md +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/agents/researcher.md +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/agents/seed-architect.md +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/agents/seed-closer.md +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/agents/semantic-evaluator.md +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/agents/simplifier.md +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/agents/socratic-interviewer.md +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/bigbang/__init__.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/bigbang/ambiguity.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/bigbang/brownfield.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/bigbang/explore.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/bigbang/interview.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/bigbang/pm_completion.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/bigbang/pm_document.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/bigbang/pm_interview.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/bigbang/pm_seed.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/bigbang/question_classifier.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/bigbang/seed_generator.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/claude_permissions.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/cli/__init__.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/cli/commands/__init__.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/cli/commands/cancel.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/cli/commands/config.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/cli/commands/detect.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/cli/commands/init.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/cli/commands/mcp.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/cli/commands/mcp_doctor.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/cli/commands/pm.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/cli/commands/run.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/cli/commands/setup.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/cli/commands/status.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/cli/commands/tui.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/cli/commands/uninstall.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/cli/formatters/__init__.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/cli/formatters/panels.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/cli/formatters/progress.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/cli/formatters/prompting.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/cli/formatters/tables.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/cli/formatters/workflow_display.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/cli/jsonc.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/cli/opencode_config.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/codex/__init__.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/codex/artifacts.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/codex/cli_policy.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/codex/ouroboros.md +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/codex_permissions.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/config/__init__.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/config/loader.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/config/models.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/core/__init__.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/core/ac_tree.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/core/context.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/core/errors.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/core/file_lock.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/core/git_workflow.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/core/initial_context.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/core/json_utils.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/core/lineage.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/core/ontology_aspect.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/core/ontology_questions.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/core/project_paths.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/core/retry.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/core/security.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/core/seed.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/core/text.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/core/ttl_cache.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/core/types.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/core/worktree.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/evaluation/__init__.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/evaluation/artifact_collector.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/evaluation/checklist.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/evaluation/consensus.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/evaluation/detector.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/evaluation/json_utils.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/evaluation/languages.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/evaluation/mechanical.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/evaluation/models.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/evaluation/pipeline.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/evaluation/semantic.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/evaluation/trigger.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/evaluation/verification_artifacts.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/events/__init__.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/events/base.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/events/decomposition.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/events/evaluation.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/events/interview.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/events/lineage.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/events/ontology.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/evolution/__init__.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/evolution/convergence.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/evolution/loop.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/evolution/projector.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/evolution/reflect.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/evolution/regression.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/evolution/wonder.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/execution/__init__.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/execution/atomicity.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/execution/decomposition.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/execution/double_diamond.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/execution/subagent.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/hermes/__init__.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/hermes/artifacts.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/mcp/__init__.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/mcp/bridge/__init__.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/mcp/bridge/bridge.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/mcp/bridge/config.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/mcp/bridge/factory.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/mcp/client/__init__.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/mcp/client/adapter.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/mcp/client/manager.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/mcp/client/protocol.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/mcp/errors.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/mcp/job_manager.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/mcp/resources/__init__.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/mcp/resources/handlers.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/mcp/server/__init__.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/mcp/server/adapter.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/mcp/server/protocol.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/mcp/server/security.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/mcp/tools/__init__.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/mcp/tools/ac_tree_hud_handler.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/mcp/tools/ac_tree_hud_render.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/mcp/tools/authoring_handlers.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/mcp/tools/bridge_mixin.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/mcp/tools/brownfield_handler.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/mcp/tools/dashboard.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/mcp/tools/definitions.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/mcp/tools/evaluation_handlers.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/mcp/tools/evolution_handlers.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/mcp/tools/execution_handlers.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/mcp/tools/job_handlers.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/mcp/tools/pm_handler.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/mcp/tools/qa.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/mcp/tools/query_handlers.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/mcp/tools/registry.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/mcp/tools/subagent.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/mcp/types.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/observability/__init__.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/observability/drift.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/observability/logging.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/observability/retrospective.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/opencode/__init__.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/opencode/plugin/__init__.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/opencode/plugin/opencode-plugin.d.ts +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/opencode/plugin/ouroboros-bridge.test.ts +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/opencode/plugin/ouroboros-bridge.ts +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/opencode/plugin/package.json +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/opencode/plugin/tsconfig.json +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/orchestrator/__init__.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/orchestrator/adapter.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/orchestrator/capabilities.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/orchestrator/codex_cli_runtime.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/orchestrator/command_dispatcher.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/orchestrator/control_plane.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/orchestrator/coordinator.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/orchestrator/dependency_analyzer.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/orchestrator/events.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/orchestrator/execution_runtime_scope.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/orchestrator/execution_strategy.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/orchestrator/heartbeat.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/orchestrator/hermes_runtime.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/orchestrator/level_context.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/orchestrator/mcp_config.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/orchestrator/mcp_tools.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/orchestrator/opencode_event_normalizer.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/orchestrator/opencode_runtime.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/orchestrator/parallel_executor.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/orchestrator/parallel_executor_models.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/orchestrator/policy.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/orchestrator/rate_limit.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/orchestrator/runner.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/orchestrator/runtime_factory.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/orchestrator/runtime_message_projection.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/orchestrator/session.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/orchestrator/workflow_state.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/persistence/__init__.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/persistence/brownfield.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/persistence/checkpoint.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/persistence/migrations/__init__.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/persistence/migrations/runner.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/persistence/migrations/scripts/001_initial.sql +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/persistence/migrations/scripts/002_brownfield.sql +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/persistence/schema.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/persistence/uow.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/plugin/__init__.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/plugin/agents/__init__.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/plugin/agents/pool.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/plugin/agents/registry.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/plugin/orchestration/__init__.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/plugin/orchestration/router.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/plugin/orchestration/scheduler.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/plugin/skills/__init__.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/plugin/skills/docs.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/plugin/skills/executor.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/plugin/skills/keywords.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/plugin/skills/registry.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/pm/__init__.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/pm/handoff.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/pm/renderer.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/providers/__init__.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/providers/anthropic_adapter.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/providers/base.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/providers/claude_code_adapter.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/providers/codex_cli_adapter.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/providers/codex_cli_stream.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/providers/factory.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/providers/gemini_cli_adapter.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/providers/litellm_adapter.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/providers/opencode_adapter.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/py.typed +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/resilience/__init__.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/resilience/lateral.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/resilience/recovery.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/resilience/stagnation.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/router/__init__.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/router/command_parser.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/router/dispatch.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/router/registry.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/router/types.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/routing/__init__.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/routing/complexity.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/routing/downgrade.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/routing/escalation.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/routing/router.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/routing/tiers.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/sandbox.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/secondary/__init__.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/secondary/scheduler.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/secondary/todo_registry.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/skills/__init__.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/skills/artifacts.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/strategies/__init__.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/strategies/devil_advocate.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/tui/__init__.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/tui/app.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/tui/components/__init__.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/tui/components/agents_panel.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/tui/components/event_log.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/tui/components/progress.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/tui/components/token_tracker.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/tui/events.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/tui/screens/__init__.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/tui/screens/confirm_rewind.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/tui/screens/dashboard.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/tui/screens/dashboard_v2.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/tui/screens/dashboard_v3.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/tui/screens/debug.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/tui/screens/execution.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/tui/screens/hud_dashboard.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/tui/screens/lineage_detail.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/tui/screens/lineage_selector.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/tui/screens/logs.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/tui/screens/session_selector.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/tui/widgets/__init__.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/tui/widgets/ac_progress.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/tui/widgets/ac_tree.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/tui/widgets/agent_activity.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/tui/widgets/cost_tracker.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/tui/widgets/drift_meter.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/tui/widgets/lineage_tree.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/tui/widgets/parallel_graph.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/tui/widgets/phase_progress.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/verification/__init__.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/verification/extractor.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/verification/models.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/verification/verifier.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/__init__.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/conftest.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/e2e/__init__.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/e2e/conftest.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/e2e/mcp_bridge_test_config.yaml +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/e2e/test_cli_commands.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/e2e/test_full_workflow.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/e2e/test_session_persistence.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/fixtures/router/skills/frontmatter-body/run/SKILL.md +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/fixtures/test_atomicity_seed.yml +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/integration/__init__.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/integration/conftest.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/integration/mcp/__init__.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/integration/mcp/bridge/__init__.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/integration/mcp/bridge/test_bridge_server_to_server.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/integration/mcp/conftest.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/integration/mcp/test_client_adapter.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/integration/mcp/test_client_manager.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/integration/mcp/test_server_adapter.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/integration/plugin/test_orchestration.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/integration/test_codex_cli_passthrough_smoke.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/integration/test_codex_skill_fallback.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/integration/test_codex_skill_smoke.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/integration/test_entry_point.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/test-execution-plan.md +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/__init__.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/agents/__init__.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/agents/test_loader.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/bigbang/__init__.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/bigbang/test_ambiguity.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/bigbang/test_brownfield.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/bigbang/test_classifier_context.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/bigbang/test_decide_later_items.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/bigbang/test_explore.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/bigbang/test_interview.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/bigbang/test_interview_async_io.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/bigbang/test_interview_no_web_search_hint.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/bigbang/test_interview_research_prefix.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/bigbang/test_pm_completion.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/bigbang/test_pm_document_generator.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/bigbang/test_pm_document_writer.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/bigbang/test_pm_interview.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/bigbang/test_pm_interview_brownfield_db.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/bigbang/test_pm_seed_ac12.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/bigbang/test_pm_seed_save.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/bigbang/test_question_classifier.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/bigbang/test_seed_generator.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/cli/__init__.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/cli/commands/test_tui_command.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/cli/conftest.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/cli/formatters/__init__.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/cli/formatters/test_console.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/cli/formatters/test_panels.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/cli/formatters/test_progress.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/cli/formatters/test_prompting.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/cli/formatters/test_tables.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/cli/formatters/test_workflow_display.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/cli/test_bridge_plugin_hardening.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/cli/test_bridge_plugin_lifecycle.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/cli/test_cancel.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/cli/test_config.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/cli/test_init_pm_seed_detection.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/cli/test_init_runtime.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/cli/test_jsonc.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/cli/test_main.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/cli/test_mcp_doctor.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/cli/test_mcp_nested_guard.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/cli/test_mcp_shell_env.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/cli/test_mcp_startup_cleanup.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/cli/test_mcp_validate_transport_stderr.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/cli/test_opencode_config.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/cli/test_pm.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/cli/test_pm_brownfield.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/cli/test_pm_completion.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/cli/test_pm_interactive_logging.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/cli/test_pm_missing_litellm.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/cli/test_pm_overwrite.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/cli/test_pm_runtime_adapter.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/cli/test_pm_select_repos.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/cli/test_run_qa.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/cli/test_setup.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/cli/test_uninstall.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/codex/test_cli_policy.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/config/__init__.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/config/test_loader.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/config/test_loader_env.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/config/test_models.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/core/__init__.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/core/test_ac_tree.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/core/test_context.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/core/test_errors.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/core/test_file_lock.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/core/test_git_workflow.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/core/test_initial_context.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/core/test_lineage.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/core/test_ontology_aspect.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/core/test_ontology_questions.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/core/test_retry.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/core/test_security.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/core/test_seed.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/core/test_ttl_cache.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/core/test_types.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/core/test_worktree.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/evaluation/__init__.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/evaluation/test_artifact_collector_file_prefix.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/evaluation/test_checklist.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/evaluation/test_consensus.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/evaluation/test_detector.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/evaluation/test_json_utils.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/evaluation/test_languages.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/evaluation/test_mechanical.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/evaluation/test_models.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/evaluation/test_pipeline_stage1_reuse.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/evaluation/test_pipeline_trigger_consensus.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/evaluation/test_review_fixes.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/evaluation/test_semantic.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/evaluation/test_trigger.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/evaluation/test_trigger_consensus.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/evaluation/test_verification_artifacts.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/events/__init__.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/events/test_base.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/events/test_decomposition_events.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/evolution/test_wonder_scope.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/execution/__init__.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/execution/test_atomicity.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/execution/test_decomposition.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/execution/test_double_diamond.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/execution/test_subagent_isolation.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/hermes/test_artifacts.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/mcp/__init__.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/mcp/bridge/__init__.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/mcp/bridge/test_bridge.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/mcp/bridge/test_config.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/mcp/bridge/test_factory.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/mcp/bridge/test_handler_wiring.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/mcp/bridge/test_stability.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/mcp/client/__init__.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/mcp/client/test_adapter.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/mcp/client/test_adapter_transport_lifecycle.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/mcp/client/test_manager.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/mcp/conftest.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/mcp/server/__init__.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/mcp/server/test_adapter.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/mcp/server/test_security.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/mcp/test_errors.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/mcp/test_job_manager.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/mcp/test_types.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/mcp/tools/__init__.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/mcp/tools/conftest.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/mcp/tools/test_ac_tree_hud_footer.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/mcp/tools/test_ac_tree_hud_handler.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/mcp/tools/test_ac_tree_hud_handler_completed.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/mcp/tools/test_ac_tree_hud_handler_cursor_changed.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/mcp/tools/test_ac_tree_hud_handler_invalid_session.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/mcp/tools/test_ac_tree_hud_handler_no_execution.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/mcp/tools/test_ac_tree_hud_handler_waiting.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/mcp/tools/test_ac_tree_hud_max_nodes.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/mcp/tools/test_ac_tree_hud_render_depth2.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/mcp/tools/test_ac_tree_hud_render_depth3.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/mcp/tools/test_ac_tree_hud_status_icons.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/mcp/tools/test_ac_tree_hud_truncation.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/mcp/tools/test_brownfield_handler.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/mcp/tools/test_checklist_verify.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/mcp/tools/test_definitions.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/mcp/tools/test_evaluate_multi_ac.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/mcp/tools/test_handler_subagent_wiring.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/mcp/tools/test_lateral_think_handler.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/mcp/tools/test_mcp_manager_wiring.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/mcp/tools/test_pm_handler.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/mcp/tools/test_pm_handler_pending_reframe.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/mcp/tools/test_qa_parser.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/mcp/tools/test_registry.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/mcp/tools/test_round5_fixes.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/mcp/tools/test_subagent.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/observability/__init__.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/observability/test_drift.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/observability/test_logging.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/observability/test_retrospective.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/orchestrator/__init__.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/orchestrator/test_adapter.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/orchestrator/test_capabilities.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/orchestrator/test_codex_cli_runtime.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/orchestrator/test_codex_recursion_guard.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/orchestrator/test_command_dispatcher.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/orchestrator/test_control_plane.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/orchestrator/test_coordinator.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/orchestrator/test_dependency_analyzer.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/orchestrator/test_events.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/orchestrator/test_execution_runtime_scope.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/orchestrator/test_execution_strategy.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/orchestrator/test_hermes_runtime.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/orchestrator/test_inflight_cancellation.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/orchestrator/test_level_context.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/orchestrator/test_mcp_config.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/orchestrator/test_mcp_tools.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/orchestrator/test_opencode_runtime.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/orchestrator/test_parallel_executor.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/orchestrator/test_parallel_executor_atomic_judgment.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/orchestrator/test_parallel_executor_recursive_depth.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/orchestrator/test_parallel_executor_retry_resume.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/orchestrator/test_policy.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/orchestrator/test_rate_limit.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/orchestrator/test_runner.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/orchestrator/test_runner_cancellation.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/orchestrator/test_runtime_factory.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/orchestrator/test_runtime_message_projection.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/orchestrator/test_sandbox_class.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/orchestrator/test_session.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/orchestrator/test_workflow_state.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/persistence/__init__.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/persistence/test_brownfield_store.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/persistence/test_checkpoint.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/persistence/test_event_store.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/persistence/test_schema.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/persistence/test_uow.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/plugin/__init__.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/plugin/agents/__init__.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/plugin/agents/test_registry.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/plugin/orchestration/__init__.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/plugin/orchestration/test_model_router.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/plugin/skills/__init__.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/plugin/skills/test_keywords.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/plugin/skills/test_registry.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/pm/__init__.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/pm/test_renderer.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/providers/__init__.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/providers/test_base.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/providers/test_claude_code_adapter.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/providers/test_codex_cli_adapter.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/providers/test_factory.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/providers/test_gemini_cli_adapter.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/providers/test_litellm_adapter.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/providers/test_opencode_adapter.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/resilience/__init__.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/resilience/test_lateral.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/resilience/test_recovery.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/resilience/test_stagnation.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/router/__init__.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/router/test_command_parser.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/router/test_dispatch.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/router/test_dispatch_result_shapes.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/router/test_extract_first_argument.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/router/test_invalid_dispatch_input_types.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/router/test_malformed_unknown_dispatch_errors.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/router/test_not_handled_resolution.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/router/test_registry.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/router/test_repository_dispatch_guard.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/router/test_router_resolution_pipeline.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/router/test_typed_frontmatter_fields.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/router/test_valid_dispatch_normalization.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/routing/__init__.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/routing/test_complexity.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/routing/test_downgrade.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/routing/test_escalation.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/routing/test_router.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/routing/test_tiers.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/scripts/test_keyword_detector.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/scripts/test_session_start.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/scripts/test_version_check.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/secondary/__init__.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/secondary/test_scheduler.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/secondary/test_todo_registry.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/skills/test_skill_artifacts.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/test_artifact_collector.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/test_codex_artifacts.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/test_convergence.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/test_dashboard.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/test_dependencies_configured.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/test_evolve_rewind.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/test_evolve_step.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/test_graceful_shutdown.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/test_main_entry_point.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/test_module_structure.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/test_project_initialization.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/test_projector_rewind.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/test_ralph_parser.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/test_ralph_rewind.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/test_regression.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/test_tooling_configuration.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/test_verification.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/tui/__init__.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/tui/test_app.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/tui/test_cancelled_display.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/tui/test_events.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/tui/test_lineage_viewer.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/tui/test_screens.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/tui/test_session_selector_replay.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/tui/test_widgets.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tools/sync_github_project.py +0 -0
- {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/uv.lock +0 -0
|
@@ -32,6 +32,7 @@ When the user types any of these commands, read the corresponding SKILL.md file
|
|
|
32
32
|
| `ooo pm` or `ooo pm ...` | Read `skills/pm/SKILL.md` and follow it |
|
|
33
33
|
| `ooo brownfield` or `ooo brownfield ...` | Read `skills/brownfield/SKILL.md` and follow it |
|
|
34
34
|
| `ooo publish` or `ooo publish ...` | Read `skills/publish/SKILL.md` and follow it |
|
|
35
|
+
| `ooo resume` | Read `skills/resume/SKILL.md` and follow it |
|
|
35
36
|
|
|
36
37
|
**Important**: Do NOT use the Skill tool. Read the file with the Read tool and execute its instructions directly.
|
|
37
38
|
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: resume
|
|
3
|
+
description: "List in-flight sessions and show the commands needed to re-attach after MCP disconnect"
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# /ouroboros:resume
|
|
7
|
+
|
|
8
|
+
Recover in-flight sessions after an unexpected MCP server disconnect.
|
|
9
|
+
|
|
10
|
+
## Usage
|
|
11
|
+
|
|
12
|
+
```
|
|
13
|
+
ooo resume
|
|
14
|
+
ooo resume --all
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
**Trigger keywords:** "resume session", "re-attach", "mcp disconnected", "lost session", "in-flight"
|
|
18
|
+
|
|
19
|
+
## How It Works
|
|
20
|
+
|
|
21
|
+
`ooo resume` reads the EventStore directly (no MCP server required) and lists
|
|
22
|
+
every session that is still in a `running` or `paused` state. The command is
|
|
23
|
+
strictly read-only — it never creates the data directory, never writes
|
|
24
|
+
schema, and never appends events. Its job is to surface the identifiers you
|
|
25
|
+
need to re-attach.
|
|
26
|
+
|
|
27
|
+
- `ooo resume` shows the 20 most recent active sessions.
|
|
28
|
+
- `ooo resume --all` shows every active session.
|
|
29
|
+
|
|
30
|
+
## Instructions
|
|
31
|
+
|
|
32
|
+
When the user invokes this skill:
|
|
33
|
+
|
|
34
|
+
1. Run the CLI command:
|
|
35
|
+
|
|
36
|
+
```
|
|
37
|
+
ouroboros resume
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
This reads `~/.ouroboros/ouroboros.db` directly — the MCP server does **not**
|
|
41
|
+
need to be running.
|
|
42
|
+
|
|
43
|
+
2. If sessions are listed, enter the number of the session you want to work
|
|
44
|
+
with. The command prints both the `session_id` and the `exec_id`, along
|
|
45
|
+
with the two re-attach paths.
|
|
46
|
+
|
|
47
|
+
3. Pick the right re-attach path:
|
|
48
|
+
|
|
49
|
+
- **Inspect only** (read-only interactive monitor):
|
|
50
|
+
|
|
51
|
+
```
|
|
52
|
+
ouroboros tui monitor
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
Launches the TUI and lets you pick the session to inspect. The
|
|
56
|
+
`ouroboros status execution <exec_id>` command is *registered* but its
|
|
57
|
+
handler is still a placeholder in `src/ouroboros/cli/commands/status.py`
|
|
58
|
+
(it only prints "Would show details for execution: …"), so it is
|
|
59
|
+
intentionally not surfaced here. Follow-up tracked as a separate issue.
|
|
60
|
+
|
|
61
|
+
- **Resume execution** (requires the original seed file):
|
|
62
|
+
|
|
63
|
+
```
|
|
64
|
+
ouroboros run workflow --orchestrator --resume <session_id> <seed.yaml>
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
## Exit codes
|
|
68
|
+
|
|
69
|
+
| Code | Meaning |
|
|
70
|
+
|------|---------|
|
|
71
|
+
| `0` | Success — sessions listed, or no sessions found |
|
|
72
|
+
| `1` | Invalid user selection (non-numeric or out-of-range) |
|
|
73
|
+
| `2` | EventStore exists but could not be opened or read |
|
|
74
|
+
|
|
75
|
+
## Fallback (No sessions found)
|
|
76
|
+
|
|
77
|
+
If the command reports "No in-flight sessions found", the execution either
|
|
78
|
+
completed, failed, was cancelled, or the EventStore has never been created.
|
|
79
|
+
To browse historical sessions interactively, use the TUI monitor:
|
|
80
|
+
|
|
81
|
+
```
|
|
82
|
+
ouroboros tui monitor
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
## Example
|
|
86
|
+
|
|
87
|
+
```
|
|
88
|
+
User: ooo resume
|
|
89
|
+
|
|
90
|
+
┌─────────────────────── In-Flight Sessions ───────────────────────┐
|
|
91
|
+
│ # Session ID Execution ID Status Started │
|
|
92
|
+
│ 1 sess-abc123 exec-xyz789 running 2026-04-15 │
|
|
93
|
+
└───────────────────────────────────────────────────────────────────┘
|
|
94
|
+
|
|
95
|
+
Enter number to re-attach (1-1), or 'q' to quit: 1
|
|
96
|
+
|
|
97
|
+
╭─ Re-attach ────────────────────────────────────────────────────────────────╮
|
|
98
|
+
│ Session ID: sess-abc123 │
|
|
99
|
+
│ Execution ID: exec-xyz789 │
|
|
100
|
+
│ │
|
|
101
|
+
│ Inspect (read-only interactive monitor): │
|
|
102
|
+
│ ouroboros tui monitor │
|
|
103
|
+
│ │
|
|
104
|
+
│ Resume execution (requires the original seed file): │
|
|
105
|
+
│ ouroboros run workflow --orchestrator --resume sess-abc123 seed-001 │
|
|
106
|
+
╰────────────────────────────────────────────────────────────────────────────╯
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
## Next Steps
|
|
110
|
+
|
|
111
|
+
After you have the identifiers:
|
|
112
|
+
|
|
113
|
+
- `ouroboros tui monitor` — launch the TUI and pick the session to inspect
|
|
114
|
+
- `ouroboros run workflow --orchestrator --resume <session_id> <seed.yaml>` — resume execution
|
|
115
|
+
- `ooo evaluate` — evaluate results once the execution completes
|
|
116
|
+
- `ooo cancel execution <exec_id>` — cancel if the session is stuck
|
|
@@ -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.29.3.
|
|
22
|
-
__version_tuple__ = version_tuple = (0, 29, 3, '
|
|
21
|
+
__version__ = version = '0.29.3.dev6'
|
|
22
|
+
__version_tuple__ = version_tuple = (0, 29, 3, 'dev6')
|
|
23
23
|
|
|
24
24
|
__commit_id__ = commit_id = None
|
|
@@ -0,0 +1,333 @@
|
|
|
1
|
+
"""Resume command for Ouroboros.
|
|
2
|
+
|
|
3
|
+
List in-flight sessions directly from the EventStore (no MCP dependency).
|
|
4
|
+
The command is intentionally read-only: it never creates the data directory,
|
|
5
|
+
never writes schema, and never appends events. Read-only is enforced at the
|
|
6
|
+
SQLite connection layer via ``EventStore(..., read_only=True)`` so even
|
|
7
|
+
unexpected write paths fail fast with ``attempt to write a readonly
|
|
8
|
+
database``. Its only job is to surface the identifiers a user needs to
|
|
9
|
+
re-attach (inspect with ``ouroboros tui monitor`` or resume execution with
|
|
10
|
+
``ouroboros run workflow --orchestrator --resume <session_id> <seed.yaml>``).
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
from __future__ import annotations
|
|
14
|
+
|
|
15
|
+
import asyncio
|
|
16
|
+
import os
|
|
17
|
+
from pathlib import Path
|
|
18
|
+
from typing import Annotated
|
|
19
|
+
|
|
20
|
+
import typer
|
|
21
|
+
|
|
22
|
+
from ouroboros.cli.formatters import console
|
|
23
|
+
from ouroboros.cli.formatters.panels import print_error, print_info, print_success
|
|
24
|
+
from ouroboros.cli.formatters.tables import create_table, print_table
|
|
25
|
+
|
|
26
|
+
app = typer.Typer(
|
|
27
|
+
name="resume",
|
|
28
|
+
help="List in-flight sessions and re-attach after MCP disconnect.",
|
|
29
|
+
invoke_without_command=True,
|
|
30
|
+
)
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
# Default cap on rows shown when many stale sessions accumulate. The user can
|
|
34
|
+
# opt into the full list with ``--all``.
|
|
35
|
+
DEFAULT_DISPLAY_LIMIT = 20
|
|
36
|
+
|
|
37
|
+
# Exit code surfaced when the EventStore exists but is unreadable. Pinned so
|
|
38
|
+
# users/scripts can branch on it (distinct from the happy "no sessions" path
|
|
39
|
+
# which exits 0).
|
|
40
|
+
EXIT_CORRUPTED_DB = 2
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
def _default_db_path() -> str:
|
|
44
|
+
"""Return the canonical SQLite path used by the running CLI."""
|
|
45
|
+
return os.path.expanduser("~/.ouroboros/ouroboros.db")
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
async def _get_event_store(db_path: str | None = None):
|
|
49
|
+
"""Open the EventStore read-only.
|
|
50
|
+
|
|
51
|
+
Returns ``None`` if the database file does not exist. Intentionally does
|
|
52
|
+
not create ``~/.ouroboros/`` or run ``metadata.create_all`` — this command
|
|
53
|
+
is a recovery tool and must not mutate user state. Read-only is enforced
|
|
54
|
+
at the SQLite connection layer via ``EventStore(..., read_only=True)``
|
|
55
|
+
so any accidental write path raises
|
|
56
|
+
``sqlite3.OperationalError: attempt to write a readonly database``.
|
|
57
|
+
"""
|
|
58
|
+
from ouroboros.persistence.event_store import EventStore
|
|
59
|
+
|
|
60
|
+
resolved = db_path or _default_db_path()
|
|
61
|
+
if not Path(resolved).exists():
|
|
62
|
+
return None
|
|
63
|
+
|
|
64
|
+
event_store = EventStore(
|
|
65
|
+
f"sqlite+aiosqlite:///{resolved}",
|
|
66
|
+
read_only=True,
|
|
67
|
+
)
|
|
68
|
+
try:
|
|
69
|
+
await event_store.initialize()
|
|
70
|
+
except Exception:
|
|
71
|
+
# Ensure the partially constructed engine is disposed before we bail
|
|
72
|
+
# out — otherwise the outer ``finally`` cannot close it (the variable
|
|
73
|
+
# was never bound in the caller).
|
|
74
|
+
try:
|
|
75
|
+
await event_store.close()
|
|
76
|
+
finally:
|
|
77
|
+
raise
|
|
78
|
+
return event_store
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
def _is_active_snapshot(snapshot) -> bool:
|
|
82
|
+
"""Return True when a snapshot is plausibly running or paused.
|
|
83
|
+
|
|
84
|
+
Terminal ``status_event_type`` values short-circuit the expensive replay.
|
|
85
|
+
Non-terminal or progress-only snapshots fall through to reconstruction.
|
|
86
|
+
"""
|
|
87
|
+
terminal = {
|
|
88
|
+
"orchestrator.session.completed",
|
|
89
|
+
"orchestrator.session.failed",
|
|
90
|
+
"orchestrator.session.cancelled",
|
|
91
|
+
}
|
|
92
|
+
return snapshot.status_event_type not in terminal
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
async def _get_in_flight_sessions(event_store, limit: int | None = DEFAULT_DISPLAY_LIMIT) -> list:
|
|
96
|
+
"""Return running or paused session trackers, most-recent-first.
|
|
97
|
+
|
|
98
|
+
Uses ``get_session_activity_snapshots`` to narrow candidates without
|
|
99
|
+
replaying every event for every session, then reconstructs only the
|
|
100
|
+
snapshots whose latest status is non-terminal.
|
|
101
|
+
"""
|
|
102
|
+
from ouroboros.orchestrator.session import SessionRepository, SessionStatus
|
|
103
|
+
|
|
104
|
+
repo = SessionRepository(event_store)
|
|
105
|
+
|
|
106
|
+
try:
|
|
107
|
+
snapshots = await event_store.get_session_activity_snapshots()
|
|
108
|
+
except AttributeError:
|
|
109
|
+
# Older EventStore builds may lack the snapshot helper. Fall back to
|
|
110
|
+
# the full replay path so the command still works.
|
|
111
|
+
return await _get_in_flight_sessions_fallback(event_store)
|
|
112
|
+
|
|
113
|
+
candidates = [s for s in snapshots if _is_active_snapshot(s)]
|
|
114
|
+
|
|
115
|
+
def _activity_key(snapshot) -> str:
|
|
116
|
+
return str(snapshot.last_activity or snapshot.start_time or "")
|
|
117
|
+
|
|
118
|
+
candidates.sort(key=_activity_key, reverse=True)
|
|
119
|
+
|
|
120
|
+
in_flight: list = []
|
|
121
|
+
for snapshot in candidates:
|
|
122
|
+
result = await repo.reconstruct_session(snapshot.session_id)
|
|
123
|
+
if result.is_err:
|
|
124
|
+
continue
|
|
125
|
+
tracker = result.value
|
|
126
|
+
if tracker.status in (SessionStatus.RUNNING, SessionStatus.PAUSED):
|
|
127
|
+
in_flight.append(tracker)
|
|
128
|
+
if limit is not None and len(in_flight) >= limit:
|
|
129
|
+
break
|
|
130
|
+
|
|
131
|
+
return in_flight
|
|
132
|
+
|
|
133
|
+
|
|
134
|
+
async def _get_in_flight_sessions_fallback(event_store) -> list:
|
|
135
|
+
"""Legacy path: replay every session. Retained only for API compatibility."""
|
|
136
|
+
from ouroboros.orchestrator.session import SessionRepository, SessionStatus
|
|
137
|
+
|
|
138
|
+
repo = SessionRepository(event_store)
|
|
139
|
+
session_events = await event_store.get_all_sessions()
|
|
140
|
+
if not session_events:
|
|
141
|
+
return []
|
|
142
|
+
|
|
143
|
+
seen: set[str] = set()
|
|
144
|
+
in_flight: list = []
|
|
145
|
+
for event in session_events:
|
|
146
|
+
session_id = event.aggregate_id
|
|
147
|
+
if session_id in seen:
|
|
148
|
+
continue
|
|
149
|
+
seen.add(session_id)
|
|
150
|
+
result = await repo.reconstruct_session(session_id)
|
|
151
|
+
if result.is_err:
|
|
152
|
+
continue
|
|
153
|
+
tracker = result.value
|
|
154
|
+
if tracker.status in (SessionStatus.RUNNING, SessionStatus.PAUSED):
|
|
155
|
+
in_flight.append(tracker)
|
|
156
|
+
return in_flight
|
|
157
|
+
|
|
158
|
+
|
|
159
|
+
def _display_sessions(sessions: list) -> None:
|
|
160
|
+
"""Render in-flight sessions in a numbered table."""
|
|
161
|
+
table = create_table("In-Flight Sessions")
|
|
162
|
+
table.add_column("#", style="bold", no_wrap=True, justify="right")
|
|
163
|
+
table.add_column("Session ID", style="cyan", no_wrap=True)
|
|
164
|
+
table.add_column("Execution ID", style="dim")
|
|
165
|
+
table.add_column("Seed ID", style="dim")
|
|
166
|
+
table.add_column("Status", justify="center")
|
|
167
|
+
table.add_column("Started", style="dim")
|
|
168
|
+
|
|
169
|
+
for idx, tracker in enumerate(sessions, 1):
|
|
170
|
+
status = tracker.status.value
|
|
171
|
+
status_style = "success" if status == "running" else "warning"
|
|
172
|
+
table.add_row(
|
|
173
|
+
str(idx),
|
|
174
|
+
tracker.session_id,
|
|
175
|
+
tracker.execution_id or "-",
|
|
176
|
+
tracker.seed_id or "-",
|
|
177
|
+
f"[{status_style}]{status}[/]",
|
|
178
|
+
tracker.start_time.isoformat(),
|
|
179
|
+
)
|
|
180
|
+
|
|
181
|
+
print_table(table)
|
|
182
|
+
|
|
183
|
+
|
|
184
|
+
def _format_reattach_guidance(tracker) -> str:
|
|
185
|
+
"""Build the post-selection guidance block.
|
|
186
|
+
|
|
187
|
+
Prints two commands, matching the real CLI contracts:
|
|
188
|
+
|
|
189
|
+
- Inspect: ``ouroboros tui monitor`` (functional TUI; select the session)
|
|
190
|
+
- Resume: ``ouroboros run workflow --orchestrator --resume <session_id> <seed.yaml>``
|
|
191
|
+
|
|
192
|
+
``run workflow --resume`` takes a *session_id* (not an execution_id) and
|
|
193
|
+
also requires the seed file, so both identifiers are surfaced explicitly.
|
|
194
|
+
|
|
195
|
+
Note: ``ouroboros status execution <exec_id>`` is *registered* but its
|
|
196
|
+
implementation is still a placeholder (see src/ouroboros/cli/commands/status.py),
|
|
197
|
+
so we deliberately do not surface it as an inspection path — it would
|
|
198
|
+
print misleading "Would show details" output.
|
|
199
|
+
"""
|
|
200
|
+
exec_id = tracker.execution_id or "<unknown>"
|
|
201
|
+
seed_hint = tracker.seed_id or "<seed.yaml>"
|
|
202
|
+
|
|
203
|
+
inspect_line = "ouroboros tui monitor"
|
|
204
|
+
resume_line = f"ouroboros run workflow --orchestrator --resume {tracker.session_id} {seed_hint}"
|
|
205
|
+
|
|
206
|
+
lines = [
|
|
207
|
+
f"Session ID: [bold cyan]{tracker.session_id}[/]",
|
|
208
|
+
f"Execution ID: [bold cyan]{exec_id}[/]",
|
|
209
|
+
"",
|
|
210
|
+
"[bold]Inspect[/] (read-only interactive monitor):",
|
|
211
|
+
f" {inspect_line}",
|
|
212
|
+
"",
|
|
213
|
+
"[bold]Resume execution[/] (requires the original seed file):",
|
|
214
|
+
f" {resume_line}",
|
|
215
|
+
]
|
|
216
|
+
if not tracker.seed_id:
|
|
217
|
+
lines.append(
|
|
218
|
+
"[dim]Seed ID was not recorded for this session — replace "
|
|
219
|
+
"<seed.yaml> with the original seed path.[/]"
|
|
220
|
+
)
|
|
221
|
+
return "\n".join(lines)
|
|
222
|
+
|
|
223
|
+
|
|
224
|
+
async def _interactive_resume(show_all: bool = False) -> int:
|
|
225
|
+
"""List in-flight sessions and prompt the user to pick one to re-attach.
|
|
226
|
+
|
|
227
|
+
Returns the integer exit code the CLI should emit so callers can pin
|
|
228
|
+
distinct codes for missing DB vs. corrupted DB vs. happy path.
|
|
229
|
+
"""
|
|
230
|
+
limit = None if show_all else DEFAULT_DISPLAY_LIMIT
|
|
231
|
+
|
|
232
|
+
try:
|
|
233
|
+
event_store = await _get_event_store()
|
|
234
|
+
except Exception as exc: # noqa: BLE001 — surface any open error verbatim
|
|
235
|
+
print_error(f"Failed to open EventStore: {exc}")
|
|
236
|
+
return EXIT_CORRUPTED_DB
|
|
237
|
+
|
|
238
|
+
if event_store is None:
|
|
239
|
+
print_info("No in-flight sessions found.", "Resume")
|
|
240
|
+
console.print(
|
|
241
|
+
"[dim]EventStore does not exist yet. "
|
|
242
|
+
"Sessions appear here after the MCP server has started at least one run.[/]"
|
|
243
|
+
)
|
|
244
|
+
return 0
|
|
245
|
+
|
|
246
|
+
try:
|
|
247
|
+
try:
|
|
248
|
+
sessions = await _get_in_flight_sessions(event_store, limit=limit)
|
|
249
|
+
except Exception as exc: # noqa: BLE001
|
|
250
|
+
print_error(f"Failed to read EventStore: {exc}")
|
|
251
|
+
return EXIT_CORRUPTED_DB
|
|
252
|
+
finally:
|
|
253
|
+
await event_store.close()
|
|
254
|
+
|
|
255
|
+
if not sessions:
|
|
256
|
+
print_info("No in-flight sessions found.", "Resume")
|
|
257
|
+
console.print(
|
|
258
|
+
"[dim]Sessions appear here when the MCP server was disconnected mid-execution.[/]"
|
|
259
|
+
)
|
|
260
|
+
return 0
|
|
261
|
+
|
|
262
|
+
_display_sessions(sessions)
|
|
263
|
+
console.print()
|
|
264
|
+
|
|
265
|
+
choice = typer.prompt(
|
|
266
|
+
f"Enter number to re-attach (1-{len(sessions)}), or 'q' to quit",
|
|
267
|
+
default="q",
|
|
268
|
+
)
|
|
269
|
+
|
|
270
|
+
if choice.strip().lower() == "q":
|
|
271
|
+
print_info("No session selected.", "Resume")
|
|
272
|
+
return 0
|
|
273
|
+
|
|
274
|
+
try:
|
|
275
|
+
index = int(choice) - 1
|
|
276
|
+
except ValueError:
|
|
277
|
+
print_error(f"Invalid selection: {choice!r}")
|
|
278
|
+
return 1
|
|
279
|
+
|
|
280
|
+
if index < 0 or index >= len(sessions):
|
|
281
|
+
print_error(f"Selection out of range: {choice}. Expected 1-{len(sessions)}.")
|
|
282
|
+
return 1
|
|
283
|
+
|
|
284
|
+
selected = sessions[index]
|
|
285
|
+
print_success(_format_reattach_guidance(selected), "Re-attach")
|
|
286
|
+
return 0
|
|
287
|
+
|
|
288
|
+
|
|
289
|
+
@app.callback(invoke_without_command=True)
|
|
290
|
+
def resume(
|
|
291
|
+
ctx: typer.Context,
|
|
292
|
+
show_all: Annotated[
|
|
293
|
+
bool,
|
|
294
|
+
typer.Option(
|
|
295
|
+
"--all",
|
|
296
|
+
"-a",
|
|
297
|
+
help=(
|
|
298
|
+
f"Show every in-flight session instead of the most recent {DEFAULT_DISPLAY_LIMIT}."
|
|
299
|
+
),
|
|
300
|
+
),
|
|
301
|
+
] = False,
|
|
302
|
+
) -> None:
|
|
303
|
+
"""List in-flight sessions and get re-attach instructions.
|
|
304
|
+
|
|
305
|
+
Reads the EventStore directly — no MCP server required. Use this command
|
|
306
|
+
after an unexpected MCP disconnect to recover the session/execution IDs
|
|
307
|
+
and re-attach.
|
|
308
|
+
|
|
309
|
+
Re-attach paths surfaced after selection:
|
|
310
|
+
|
|
311
|
+
# Inspect (interactive monitor — the `status execution` placeholder is
|
|
312
|
+
# not wired up yet)
|
|
313
|
+
ouroboros tui monitor
|
|
314
|
+
|
|
315
|
+
# Resume execution (requires the original seed file)
|
|
316
|
+
ouroboros run workflow --orchestrator --resume <session_id> <seed.yaml>
|
|
317
|
+
|
|
318
|
+
Examples:
|
|
319
|
+
|
|
320
|
+
# Interactive: list in-flight sessions and pick one
|
|
321
|
+
ouroboros resume
|
|
322
|
+
|
|
323
|
+
# Show every stale active session, not just the 20 most recent
|
|
324
|
+
ouroboros resume --all
|
|
325
|
+
"""
|
|
326
|
+
if ctx.invoked_subcommand is not None:
|
|
327
|
+
return
|
|
328
|
+
exit_code = asyncio.run(_interactive_resume(show_all=show_all))
|
|
329
|
+
if exit_code != 0:
|
|
330
|
+
raise typer.Exit(exit_code)
|
|
331
|
+
|
|
332
|
+
|
|
333
|
+
__all__ = ["app"]
|
|
@@ -21,6 +21,7 @@ from ouroboros.cli.commands import (
|
|
|
21
21
|
init,
|
|
22
22
|
mcp,
|
|
23
23
|
pm,
|
|
24
|
+
resume,
|
|
24
25
|
run,
|
|
25
26
|
setup,
|
|
26
27
|
status,
|
|
@@ -48,6 +49,7 @@ app.add_typer(setup.app, name="setup")
|
|
|
48
49
|
app.add_typer(detect.app, name="detect")
|
|
49
50
|
app.add_typer(tui.app, name="tui")
|
|
50
51
|
app.add_typer(pm.app, name="pm")
|
|
52
|
+
app.add_typer(resume.app, name="resume")
|
|
51
53
|
app.add_typer(uninstall.app, name="uninstall")
|
|
52
54
|
|
|
53
55
|
|
{ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/persistence/event_store.py
RENAMED
|
@@ -90,21 +90,64 @@ class EventStore:
|
|
|
90
90
|
await store.close()
|
|
91
91
|
"""
|
|
92
92
|
|
|
93
|
-
def __init__(
|
|
93
|
+
def __init__(
|
|
94
|
+
self,
|
|
95
|
+
database_url: str | None = None,
|
|
96
|
+
*,
|
|
97
|
+
read_only: bool = False,
|
|
98
|
+
) -> None:
|
|
94
99
|
"""Initialize EventStore with database URL.
|
|
95
100
|
|
|
96
101
|
Args:
|
|
97
102
|
database_url: SQLAlchemy database URL.
|
|
98
103
|
For async SQLite: "sqlite+aiosqlite:///path/to/db.sqlite"
|
|
99
104
|
If not provided, defaults to ~/.ouroboros/ouroboros.db
|
|
105
|
+
read_only: When True, open the underlying SQLite database in true
|
|
106
|
+
read-only mode by rewriting the URL into the ``file:<path>?mode=ro&uri=true``
|
|
107
|
+
form and passing ``connect_args={"uri": True}`` to aiosqlite.
|
|
108
|
+
This enforces the read-only contract at the connection layer
|
|
109
|
+
so *any* accidental write path (including library/future code
|
|
110
|
+
paths we don't control) fails fast with
|
|
111
|
+
``sqlite3.OperationalError: attempt to write a readonly database``.
|
|
112
|
+
Callers that opt in should also skip schema creation by calling
|
|
113
|
+
``initialize(create_schema=False)`` — this is the default when
|
|
114
|
+
``read_only=True``. ``read_only`` is a no-op for non-SQLite URLs.
|
|
100
115
|
"""
|
|
101
116
|
if database_url is None:
|
|
102
117
|
db_path = Path.home() / ".ouroboros" / "ouroboros.db"
|
|
103
|
-
|
|
118
|
+
if not read_only:
|
|
119
|
+
db_path.parent.mkdir(parents=True, exist_ok=True)
|
|
104
120
|
database_url = f"sqlite+aiosqlite:///{db_path}"
|
|
121
|
+
|
|
122
|
+
self._read_only = read_only
|
|
123
|
+
if read_only:
|
|
124
|
+
database_url = self._coerce_to_readonly_url(database_url)
|
|
105
125
|
self._database_url = database_url
|
|
106
126
|
self._engine: AsyncEngine | None = None
|
|
107
127
|
|
|
128
|
+
@staticmethod
|
|
129
|
+
def _coerce_to_readonly_url(database_url: str) -> str:
|
|
130
|
+
"""Rewrite a plain aiosqlite URL into a ``mode=ro`` URI form.
|
|
131
|
+
|
|
132
|
+
Leaves non-SQLite URLs untouched. Already-URI forms (starting with
|
|
133
|
+
``file:``) are returned as-is so explicit callers keep full control.
|
|
134
|
+
"""
|
|
135
|
+
prefix = "sqlite+aiosqlite:///"
|
|
136
|
+
if not database_url.startswith(prefix):
|
|
137
|
+
return database_url
|
|
138
|
+
|
|
139
|
+
path_part = database_url[len(prefix) :]
|
|
140
|
+
if path_part.startswith("file:"):
|
|
141
|
+
# Caller already provided a URI form — respect it verbatim.
|
|
142
|
+
return database_url
|
|
143
|
+
|
|
144
|
+
# ``:memory:`` has no filesystem and cannot be opened read-only
|
|
145
|
+
# meaningfully; leave it alone.
|
|
146
|
+
if path_part in (":memory:", ""):
|
|
147
|
+
return database_url
|
|
148
|
+
|
|
149
|
+
return f"{prefix}file:{path_part}?mode=ro&uri=true"
|
|
150
|
+
|
|
108
151
|
def _raise_invalid_append_input(
|
|
109
152
|
self,
|
|
110
153
|
event: object,
|
|
@@ -133,34 +176,65 @@ class EventStore:
|
|
|
133
176
|
details=details,
|
|
134
177
|
)
|
|
135
178
|
|
|
136
|
-
async def initialize(self) -> None:
|
|
179
|
+
async def initialize(self, *, create_schema: bool | None = None) -> None:
|
|
137
180
|
"""Initialize the database connection and create tables if needed.
|
|
138
181
|
|
|
139
182
|
This method is idempotent - calling it multiple times is safe.
|
|
140
183
|
|
|
184
|
+
Args:
|
|
185
|
+
create_schema: When True run ``metadata.create_all`` so missing
|
|
186
|
+
tables are created. Read-only consumers (for example diagnostic
|
|
187
|
+
CLI commands that must not mutate the store) can pass ``False``
|
|
188
|
+
to skip schema creation entirely. When ``None`` (default), the
|
|
189
|
+
value follows ``read_only``: stores constructed with
|
|
190
|
+
``read_only=True`` skip schema creation and all others create
|
|
191
|
+
it, preserving the prior default behaviour.
|
|
192
|
+
|
|
141
193
|
For aiosqlite, uses StaticPool (default) which maintains a single
|
|
142
194
|
connection. This avoids connection accumulation while supporting
|
|
143
195
|
:memory: databases in tests.
|
|
144
196
|
"""
|
|
197
|
+
if create_schema is None:
|
|
198
|
+
create_schema = not self._read_only
|
|
199
|
+
|
|
200
|
+
if self._read_only and create_schema:
|
|
201
|
+
raise PersistenceError(
|
|
202
|
+
"Cannot create schema on a read-only EventStore.",
|
|
203
|
+
operation="initialize",
|
|
204
|
+
details={"read_only": True},
|
|
205
|
+
)
|
|
206
|
+
|
|
145
207
|
if self._engine is None:
|
|
208
|
+
connect_args: dict[str, object] = {"timeout": 30}
|
|
209
|
+
if self._read_only:
|
|
210
|
+
# aiosqlite forwards unknown kwargs to sqlite3.connect — the
|
|
211
|
+
# ``uri=True`` flag is what turns the ``file:...?mode=ro`` form
|
|
212
|
+
# into a real read-only connection.
|
|
213
|
+
connect_args["uri"] = True
|
|
214
|
+
|
|
146
215
|
self._engine = create_async_engine(
|
|
147
216
|
self._database_url,
|
|
148
217
|
echo=False,
|
|
149
|
-
connect_args=
|
|
218
|
+
connect_args=connect_args,
|
|
150
219
|
)
|
|
151
220
|
|
|
152
|
-
# Enable WAL mode and set busy timeout on every new connection
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
221
|
+
# Enable WAL mode and set busy timeout on every new connection.
|
|
222
|
+
# Skipped for read-only consumers: ``PRAGMA journal_mode=WAL`` is
|
|
223
|
+
# itself a write and would trip SQLite's read-only guard.
|
|
224
|
+
if not self._read_only:
|
|
225
|
+
|
|
226
|
+
@event.listens_for(self._engine.sync_engine, "connect")
|
|
227
|
+
def _set_sqlite_pragmas(dbapi_conn, _connection_record):
|
|
228
|
+
cursor = dbapi_conn.cursor()
|
|
229
|
+
cursor.execute("PRAGMA journal_mode=WAL")
|
|
230
|
+
cursor.execute("PRAGMA synchronous=NORMAL")
|
|
231
|
+
cursor.execute("PRAGMA busy_timeout=30000")
|
|
232
|
+
cursor.close()
|
|
233
|
+
|
|
234
|
+
# Create all tables defined in metadata (skipped for read-only consumers)
|
|
235
|
+
if create_schema:
|
|
236
|
+
async with self._engine.begin() as conn:
|
|
237
|
+
await conn.run_sync(metadata.create_all)
|
|
164
238
|
|
|
165
239
|
async def append(self, event: BaseEvent) -> None:
|
|
166
240
|
"""Append an event to the store.
|