ayder-cli 2.5.3__tar.gz → 2.5.4__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.
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/.gitignore +1 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/AGENTS.md +30 -19
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/PKG-INFO +25 -29
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/README.md +22 -28
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/docs/GATE.md +1 -1
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/docs/PROJECT_STRUCTURE.md +17 -15
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/docs/README_AGENT_WORKFLOW.md +35 -35
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/docs/README_OLLAMA.md +0 -1
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/docs/config.toml.example +3 -3
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/pyproject.toml +4 -2
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/scripts/check_exception_handlers.py +1 -1
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/scripts/check_log_arguments.py +5 -5
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/scripts/log_argument_baseline.txt +4 -3
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/src/ayder_cli/agents/config.py +1 -1
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/src/ayder_cli/agents/runner.py +3 -10
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/src/ayder_cli/cli.py +9 -40
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/src/ayder_cli/cli_runner.py +0 -27
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/src/ayder_cli/core/config.py +2 -107
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/src/ayder_cli/core/config_migration.py +2 -44
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/src/ayder_cli/core/skills.py +5 -3
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/src/ayder_cli/logging_config.py +5 -1
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/src/ayder_cli/loops/chat_loop.py +29 -1
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/src/ayder_cli/prompts.py +2 -1
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/src/ayder_cli/providers/impl/ollama_drivers/base.py +0 -2
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/src/ayder_cli/providers/retry.py +7 -1
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/src/ayder_cli/tools/builtins/tasks.py +0 -44
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/src/ayder_cli/tools/plugin_manager.py +0 -16
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/src/ayder_cli/tui/app.py +21 -34
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/src/ayder_cli/tui/commands.py +1 -61
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/application/test_runtime_factory.py +1 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/core/test_config.py +0 -57
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/core/test_config_coverage.py +0 -33
- ayder_cli-2.5.4/tests/core/test_config_retired_temporal.py +153 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/core/test_logging_config_keys.py +1 -2
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/core/test_logging_sinks.py +21 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/loops/test_chat_loop_guards.py +70 -5
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/providers/test_retry_classifier.py +11 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/scripts/test_exception_gate.py +6 -3
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/scripts/test_log_argument_gate.py +14 -14
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/test_cli.py +0 -12
- ayder_cli-2.5.4/tests/test_cli_startup_logging.py +87 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/test_prompts_environment.py +11 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/test_tasks.py +0 -58
- ayder_cli-2.5.4/tests/tui/test_skill_label_refresh.py +126 -0
- ayder_cli-2.5.4/uv.lock +3037 -0
- ayder_cli-2.5.3/tests/ui/test_tui_temporal_command.py +0 -115
- ayder_cli-2.5.3/uv.lock +0 -2441
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/.github/workflows/ci.yml +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/.github/workflows/python-package.yml +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/.python-version +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/LICENSE +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/docs/cc.png +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/scripts/check_logging_imports.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/scripts/exception_baseline.txt +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/scripts/find_percent_logging.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/scripts/logging_gates.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/src/ayder_cli/__init__.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/src/ayder_cli/__main__.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/src/ayder_cli/agents/__init__.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/src/ayder_cli/agents/callbacks.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/src/ayder_cli/agents/registry.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/src/ayder_cli/agents/run.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/src/ayder_cli/agents/tool.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/src/ayder_cli/agents/worktree.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/src/ayder_cli/application/README.md +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/src/ayder_cli/application/__init__.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/src/ayder_cli/application/execution_policy.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/src/ayder_cli/application/message_contract.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/src/ayder_cli/application/runtime_factory.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/src/ayder_cli/application/validation.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/src/ayder_cli/cli_callbacks.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/src/ayder_cli/console.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/src/ayder_cli/core/cache_monitor.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/src/ayder_cli/core/context.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/src/ayder_cli/core/context_manager.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/src/ayder_cli/core/context_manager_factory.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/src/ayder_cli/core/default_context_manager.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/src/ayder_cli/core/ollama_context_manager.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/src/ayder_cli/core/reasoning.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/src/ayder_cli/core/result.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/src/ayder_cli/core/session.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/src/ayder_cli/diagnostics.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/src/ayder_cli/log.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/src/ayder_cli/loops/__init__.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/src/ayder_cli/masking.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/src/ayder_cli/parser.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/src/ayder_cli/process_manager.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/src/ayder_cli/providers/__init__.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/src/ayder_cli/providers/base.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/src/ayder_cli/providers/evren.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/src/ayder_cli/providers/impl/claude.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/src/ayder_cli/providers/impl/deepseek.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/src/ayder_cli/providers/impl/gemini.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/src/ayder_cli/providers/impl/glm.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/src/ayder_cli/providers/impl/ollama.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/src/ayder_cli/providers/impl/ollama_drivers/__init__.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/src/ayder_cli/providers/impl/ollama_drivers/_errors.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/src/ayder_cli/providers/impl/ollama_drivers/deepseek.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/src/ayder_cli/providers/impl/ollama_drivers/generic_native.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/src/ayder_cli/providers/impl/ollama_drivers/generic_xml.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/src/ayder_cli/providers/impl/ollama_drivers/matrix.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/src/ayder_cli/providers/impl/ollama_drivers/minimax.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/src/ayder_cli/providers/impl/ollama_drivers/qwen3.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/src/ayder_cli/providers/impl/ollama_drivers/registry.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/src/ayder_cli/providers/impl/ollama_inspector.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/src/ayder_cli/providers/impl/openai.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/src/ayder_cli/providers/impl/qwen.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/src/ayder_cli/providers/orchestrator.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/src/ayder_cli/services/__init__.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/src/ayder_cli/services/interactions.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/src/ayder_cli/services/messaging_inbox.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/src/ayder_cli/skills/development-workflow/SKILL.md +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/src/ayder_cli/themes/__init__.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/src/ayder_cli/themes/ayder.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/src/ayder_cli/themes/claude.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/src/ayder_cli/tools/__init__.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/src/ayder_cli/tools/builtins/__init__.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/src/ayder_cli/tools/builtins/background_process_tool.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/src/ayder_cli/tools/builtins/context.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/src/ayder_cli/tools/builtins/context_definitions.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/src/ayder_cli/tools/builtins/filesystem.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/src/ayder_cli/tools/builtins/filesystem_definitions.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/src/ayder_cli/tools/builtins/note_tool.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/src/ayder_cli/tools/builtins/notes.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/src/ayder_cli/tools/builtins/notes_definitions.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/src/ayder_cli/tools/builtins/process_manager_definitions.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/src/ayder_cli/tools/builtins/search.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/src/ayder_cli/tools/builtins/search_definitions.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/src/ayder_cli/tools/builtins/shell.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/src/ayder_cli/tools/builtins/shell_definitions.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/src/ayder_cli/tools/builtins/skill.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/src/ayder_cli/tools/builtins/skill_definitions.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/src/ayder_cli/tools/builtins/task_definitions.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/src/ayder_cli/tools/builtins/task_tool.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/src/ayder_cli/tools/builtins/utils_tools.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/src/ayder_cli/tools/builtins/utils_tools_definitions.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/src/ayder_cli/tools/builtins/web.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/src/ayder_cli/tools/builtins/web_definitions.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/src/ayder_cli/tools/definition.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/src/ayder_cli/tools/execution.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/src/ayder_cli/tools/hooks.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/src/ayder_cli/tools/mcp.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/src/ayder_cli/tools/mcp_client.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/src/ayder_cli/tools/normalization.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/src/ayder_cli/tools/plugin_api.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/src/ayder_cli/tools/plugin_github.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/src/ayder_cli/tools/plugin_status.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/src/ayder_cli/tools/registry.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/src/ayder_cli/tools/schemas.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/src/ayder_cli/tools/utils.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/src/ayder_cli/tui/__init__.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/src/ayder_cli/tui/adapter.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/src/ayder_cli/tui/helpers.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/src/ayder_cli/tui/keybindings.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/src/ayder_cli/tui/parser.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/src/ayder_cli/tui/rendering.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/src/ayder_cli/tui/screens.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/src/ayder_cli/tui/theme_manager.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/src/ayder_cli/tui/types.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/src/ayder_cli/tui/widgets.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/src/ayder_cli/ui.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/src/ayder_cli/version.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/COVERAGE.md +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/__init__.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/agents/__init__.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/agents/test_agent_consolidated.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/agents/test_agent_severity.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/agents/test_agent_tools.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/agents/test_callbacks.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/agents/test_config.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/agents/test_integration.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/agents/test_queue.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/agents/test_registry.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/agents/test_run.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/agents/test_runner.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/agents/test_runner_provider_unavailable.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/agents/test_tool.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/agents/test_worktree_helpers.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/agents/test_worktree_isolation.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/application/test_argument_canonicalization.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/application/test_execution_result_truthfulness.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/application/test_message_contract.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/client/test_main.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/conftest.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/convergence/__init__.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/convergence/test_execution_policy_parity.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/convergence/test_runtime_wiring.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/convergence/test_validation_path.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/core/test_asyncio_bridge.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/core/test_cache_monitor.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/core/test_config_migration.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/core/test_config_provider_logging.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/core/test_config_retry.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/core/test_config_skills.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/core/test_config_v2.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/core/test_context_manager_factory.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/core/test_default_config_evren.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/core/test_default_context_manager.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/core/test_default_context_manager_should_compact.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/core/test_default_context_newest_unit.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/core/test_default_context_skill_resupply.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/core/test_event_emission.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/core/test_event_stream.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/core/test_exception_guarantee.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/core/test_exception_hooks.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/core/test_log_facade.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/core/test_loguru_caplog.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/core/test_max_output_tokens_default.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/core/test_ollama_compaction_persistence.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/core/test_ollama_context_manager.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/core/test_ollama_context_manager_cache_monitor.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/core/test_ollama_context_manager_max_history.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/core/test_ollama_skill_resupply.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/core/test_parameter_aliasing.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/core/test_parser.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/core/test_reasoning_config.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/core/test_scratch_dir.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/core/test_session.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/core/test_session_id_threading.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/core/test_sink_masking.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/core/test_skills.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/core/test_skills_builtin_sync.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/loops/__init__.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/loops/test_base.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/loops/test_chat_loop_hook.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/loops/test_chat_loop_tool_truncation.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/loops/test_loop_severity.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/loops/test_required_args_aliases.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/loops/test_tool_argument_integrity.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/loops/test_tool_batch_cancellation.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/loops/test_tool_batch_ordering.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/providers/__init__.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/providers/ollama_drivers/__init__.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/providers/ollama_drivers/test_base.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/providers/ollama_drivers/test_deepseek.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/providers/ollama_drivers/test_errors.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/providers/ollama_drivers/test_fallback.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/providers/ollama_drivers/test_generic_native.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/providers/ollama_drivers/test_generic_xml.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/providers/ollama_drivers/test_matrix.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/providers/ollama_drivers/test_minimax.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/providers/ollama_drivers/test_provider_integration.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/providers/ollama_drivers/test_qwen3.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/providers/ollama_drivers/test_registry.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/providers/test_claude_stream_tool_calls.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/providers/test_evren.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/providers/test_gemini_function_calls.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/providers/test_glm_async.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/providers/test_ollama_inspector.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/providers/test_ollama_native.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/providers/test_ollama_parallel_tool_call_ids.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/providers/test_ollama_xml.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/providers/test_ollama_xml_autoroute.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/providers/test_ollama_xml_usage.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/providers/test_openai_list_models.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/providers/test_orchestrator_capabilities.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/providers/test_provider_channel_binding.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/providers/test_provider_severity.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/providers/test_qwen_async.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/providers/test_reasoning_effort.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/providers/test_retry_integration.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/providers/test_retrying_provider.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/providers/test_skill_load_prefix.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/scripts/test_logging_policy_gates.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/scripts/test_loguru_private_shape.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/services/test_boundary.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/services/test_interaction_sink.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/services/test_messaging_inbox.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/test_agents_md.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/test_cli_callbacks.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/test_context.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/test_env_manager.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/test_logging_config.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/test_notes.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/test_process_manager.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/test_prompts_general.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/tools/__init__.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/tools/test_agent_notes.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/tools/test_background_process_tool.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/tools/test_bash_process_safety.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/tools/test_bash_tool.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/tools/test_context_storage_confinement.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/tools/test_definition_discovery.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/tools/test_di_injection.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/tools/test_error_labels.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/tools/test_file_editor_hardening.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/tools/test_file_editor_size_limit.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/tools/test_file_tool_output.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/tools/test_impl.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/tools/test_impl_coverage.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/tools/test_mcp.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/tools/test_mcp_client.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/tools/test_note_tool.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/tools/test_notes_api.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/tools/test_notes_confinement.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/tools/test_parallel_safe.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/tools/test_path_security.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/tools/test_plugin_api.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/tools/test_plugin_github.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/tools/test_plugin_loading.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/tools/test_plugin_manager.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/tools/test_plugin_status.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/tools/test_registry.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/tools/test_registry_coverage.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/tools/test_result.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/tools/test_schemas.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/tools/test_search_codebase.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/tools/test_search_hardening.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/tools/test_skill_catalog_and_filter.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/tools/test_skill_scope_wiring.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/tools/test_skill_tool.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/tools/test_task_integrity.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/tools/test_task_path_confinement.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/tools/test_task_tool.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/tools/test_tool_severity.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/tools/test_unexpected_args.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/tools/test_utils.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/tools/test_web.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/tui/__init__.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/tui/test_agent_list_screen.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/tui/test_do_clear_coordination.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/tui/test_evren_terms.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/tui/test_follow_mode.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/tui/test_help_screen.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/tui/test_inline_sync_output.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/tui/test_input_box.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/tui/test_keybindings.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/tui/test_mouse_support.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/tui/test_multi_select_screen.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/tui/test_multiline_input.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/tui/test_panel_layout.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/tui/test_paste.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/tui/test_peer_message_turn.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/tui/test_pending_compact_consumer.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/tui/test_pull_delivery.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/tui/test_real_turn_follow.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/tui/test_resume.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/tui/test_status_bar_badges.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/tui/test_status_bar_cwd.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/tui/test_themes.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/tui/test_turn_consumer.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/tui/test_widgets.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/ui/test_confirm_screen.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/ui/test_diff_preview.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/ui/test_plugin_autoenable.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/ui/test_provider_switch.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/ui/test_run_tui_startup.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/ui/test_tui_assistant_sanitization.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/ui/test_tui_chat_loop.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/ui/test_tui_commands_agent.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/ui/test_tui_commands_effort.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/ui/test_tui_commands_logging.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/ui/test_tui_commands_plugin.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/ui/test_tui_commands_provider.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/ui/test_tui_commands_skill.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/ui/test_tui_helpers.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/ui/test_tui_system_prompt_no_structure.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/ui/test_tui_widgets.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/ui/test_ui.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/ui/test_ui_coverage.py +0 -0
- {ayder_cli-2.5.3 → ayder_cli-2.5.4}/tests/ui/test_ui_verbose.py +0 -0
|
@@ -17,27 +17,33 @@ This document provides coding standards, tool configurations, and workflows for
|
|
|
17
17
|
| Package | Purpose | Version |
|
|
18
18
|
|---------|---------|---------|
|
|
19
19
|
| **openai** | OpenAI-compatible API client for LLM calls | latest |
|
|
20
|
-
| **
|
|
20
|
+
| **ollama** | Native Ollama API client (Ollama provider) | >=0.6.2 |
|
|
21
|
+
| **loguru** | Logging backend (channel loggers, masking sinks) | >=0.7,<0.8 |
|
|
22
|
+
| **httpx** | HTTP client for `fetch_web` | latest |
|
|
23
|
+
| **mcp** | Model Context Protocol client (built-in MCP) | >=1.19,<2 |
|
|
21
24
|
| **rich** | Rich text and beautiful formatting | >=13.0.0 |
|
|
22
|
-
| **
|
|
25
|
+
| **textual** | Terminal User Interface (TUI) framework | ==8.2.7 |
|
|
23
26
|
| **python-dotenv** | Environment variable management | >=1.0.0 |
|
|
24
|
-
| **
|
|
27
|
+
| **tiktoken** | Token counting for context management | >=0.7.0 |
|
|
28
|
+
|
|
29
|
+
Optional extras: `anthropic`, `google` (google-genai), `qwen` (dashscope), `glm` (zhipuai>=2, with pydantic<2.14 because zhipuai holds mcp at 1.19.0), `all` (the four provider extras), `libcst` (for plugins that do CST code transforms); `mcp` is an empty compatibility extra.
|
|
25
30
|
|
|
26
31
|
### Development Dependencies
|
|
27
32
|
|
|
28
33
|
| Package | Purpose | Version |
|
|
29
34
|
|---------|---------|---------|
|
|
30
|
-
| **pytest** | Testing framework | >=9.0.
|
|
31
|
-
| **pytest-
|
|
32
|
-
| **pytest-
|
|
35
|
+
| **pytest** | Testing framework | >=9.0.3 |
|
|
36
|
+
| **pytest-cov** | Code coverage | >=7.1.0 |
|
|
37
|
+
| **pytest-xdist** | Parallel test execution | >=3.8.0 |
|
|
38
|
+
| **pytest-timeout** | Test timeout protection | >=2.4.0 |
|
|
33
39
|
| **pytest-instafail** | Show failures immediately | >=0.5.0 |
|
|
34
|
-
| **pytest-
|
|
35
|
-
| **
|
|
36
|
-
| **ruff** | Fast Python linter |
|
|
37
|
-
| **mypy** | Static type checker |
|
|
38
|
-
| **pyright** | Static type checker (Microsoft) | >=1.1.
|
|
39
|
-
|
|
40
|
-
|
|
40
|
+
| **pytest-asyncio** | Async test support | >=1.3.0 |
|
|
41
|
+
| **poethepoet** | Task runner | >=0.44.0 |
|
|
42
|
+
| **ruff** | Fast Python linter | >=0.15.12 |
|
|
43
|
+
| **mypy** | Static type checker | >=1.20.2 |
|
|
44
|
+
| **pyright** | Static type checker (Microsoft) | >=1.1.409 |
|
|
45
|
+
|
|
46
|
+
The dev group also installs the optional provider SDKs (`anthropic`, `google-genai`, `dashscope`, `zhipuai>=2`) so their tests run.
|
|
41
47
|
|
|
42
48
|
### Build System
|
|
43
49
|
|
|
@@ -211,7 +217,7 @@ This project uses `uv` as the package manager with a pre-configured `.venv`:
|
|
|
211
217
|
Poe the Poet is the preferred task runner. It automatically uses the `.venv`:
|
|
212
218
|
|
|
213
219
|
```bash
|
|
214
|
-
# Run tests (excludes slow TUI tests) - uses pytest-timeout
|
|
220
|
+
# Run tests (excludes slow TUI tests) - uses pytest-timeout
|
|
215
221
|
uv run --active poe test
|
|
216
222
|
|
|
217
223
|
# Run tests in parallel (fastest - uses pytest-xdist)
|
|
@@ -248,7 +254,7 @@ uv run poe --help
|
|
|
248
254
|
**Pytest Plugins Used:**
|
|
249
255
|
- **pytest-timeout** (30s) - Prevents tests from hanging
|
|
250
256
|
- **pytest-instafail** - Shows failures immediately
|
|
251
|
-
- **pytest-
|
|
257
|
+
- **pytest-asyncio** - Async test support
|
|
252
258
|
- **pytest-xdist** (-n auto) - Parallel execution (test-fast only)
|
|
253
259
|
- **pytest-cov** - Coverage reporting (test-cov only)
|
|
254
260
|
|
|
@@ -343,10 +349,15 @@ uv run ruff check src/ --fix
|
|
|
343
349
|
|
|
344
350
|
### Ruff Standards
|
|
345
351
|
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
- **
|
|
349
|
-
- **
|
|
352
|
+
The rule set is `select` under `[tool.ruff.lint]` in pyproject.toml:
|
|
353
|
+
|
|
354
|
+
- **E4, E7, E9**: pycodestyle import, statement and runtime-error rules (no formatting rules)
|
|
355
|
+
- **F**: Pyflakes (undefined names, unused imports)
|
|
356
|
+
- **TRY400, TRY401**: tryceratops `error-instead-of-exception` and `verbose-log-message`
|
|
357
|
+
- **BLE001**: flake8-blind-except `blind-except`
|
|
358
|
+
- **LOG, G**: flake8-logging and flake8-logging-format
|
|
359
|
+
|
|
360
|
+
`tests/**/*.py` ignores `BLE001` and `G004`. `poe lint` checks `src/` only.
|
|
350
361
|
|
|
351
362
|
**Before committing, ensure:**
|
|
352
363
|
```bash
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: ayder-cli
|
|
3
|
-
Version: 2.5.
|
|
3
|
+
Version: 2.5.4
|
|
4
4
|
Summary: AI agent for any LLMs
|
|
5
5
|
Project-URL: Homepage, https://github.com/ayder/ayder-cli
|
|
6
6
|
Project-URL: Repository, https://github.com/ayder/ayder-cli.git
|
|
@@ -27,10 +27,12 @@ Provides-Extra: all
|
|
|
27
27
|
Requires-Dist: anthropic; extra == 'all'
|
|
28
28
|
Requires-Dist: dashscope; extra == 'all'
|
|
29
29
|
Requires-Dist: google-genai; extra == 'all'
|
|
30
|
+
Requires-Dist: pydantic<2.14; extra == 'all'
|
|
30
31
|
Requires-Dist: zhipuai>=2; extra == 'all'
|
|
31
32
|
Provides-Extra: anthropic
|
|
32
33
|
Requires-Dist: anthropic; extra == 'anthropic'
|
|
33
34
|
Provides-Extra: glm
|
|
35
|
+
Requires-Dist: pydantic<2.14; extra == 'glm'
|
|
34
36
|
Requires-Dist: zhipuai>=2; extra == 'glm'
|
|
35
37
|
Provides-Extra: google
|
|
36
38
|
Requires-Dist: google-genai; extra == 'google'
|
|
@@ -83,7 +85,7 @@ LLMs on their own can only generate text. To be a useful coding assistant, the m
|
|
|
83
85
|
Each tool has an OpenAI-compatible JSON schema so models that support function calling can use them natively. For models that don't, ayder-cli also parses a custom XML-like syntax (`<function=name><parameter=key>value</parameter></function>`) as a fallback.
|
|
84
86
|
|
|
85
87
|
- **Path sandboxing**: All file operations are confined to the project root via `ProjectContext`. Path traversal attacks (`../`) and absolute paths outside the project are blocked. The one exception is the session scratch directory, `/tmp/ayder-<uid>/<project>-<hash>/<session>/` (mode 0700, one subdirectory per agent run), which the system prompt names as the place for temporary files and which the file tools accept. It is not cleaned up; the OS clears `/tmp`.
|
|
86
|
-
- **Safe mode** (TUI): Blocks `file_editor`, `
|
|
88
|
+
- **Safe mode** (TUI): Blocks `file_editor`, `bash`, `background_process`, and `fetch_web`.
|
|
87
89
|
- Every tool call requires your confirmation before it runs -- you always stay in control. Use `-r`, `-w`, `-x` flags to auto-approve tool categories.
|
|
88
90
|
- You may also prefer to run ayder-cli in a container for additional security.
|
|
89
91
|
|
|
@@ -203,9 +205,9 @@ provider = "openai" # Active provider profile name
|
|
|
203
205
|
editor = "vim" # Editor for /task-edit command
|
|
204
206
|
verbose = false # Show file contents after write + LLM debug
|
|
205
207
|
max_background_processes = 5 # Max concurrent background processes (1-20)
|
|
206
|
-
max_iterations =
|
|
208
|
+
max_iterations = 0 # LLM calls per message before the loop stops (default 0 = unlimited)
|
|
207
209
|
max_output_tokens = 32768 # Max tokens in LLM response
|
|
208
|
-
max_history_messages =
|
|
210
|
+
max_history_messages = 0 # Messages kept in history (default 0 = unlimited)
|
|
209
211
|
prompt = "STANDARD" # System prompt tier: MINIMAL, STANDARD, EXTENDED
|
|
210
212
|
tool_tags = ["core", "metadata"] # Enabled tool tags (see /plugin)
|
|
211
213
|
# skills = ["development-workflow"] # or "none"; default: the built-in skills
|
|
@@ -234,12 +236,6 @@ retention = "7 days"
|
|
|
234
236
|
enabled = true
|
|
235
237
|
max_context_tokens = 8192
|
|
236
238
|
|
|
237
|
-
[temporal]
|
|
238
|
-
enabled = false
|
|
239
|
-
host = "localhost:7233"
|
|
240
|
-
namespace = "default"
|
|
241
|
-
metadata_dir = ".ayder/temporal"
|
|
242
|
-
|
|
243
239
|
# --- Provider Profiles ---
|
|
244
240
|
|
|
245
241
|
[llm.my_local_ollama]
|
|
@@ -381,9 +377,9 @@ By default, every tool call requires user confirmation. Use permission flags to
|
|
|
381
377
|
|
|
382
378
|
| Flag | Category | Built-in tools |
|
|
383
379
|
| ---- | -------- | -------------- |
|
|
384
|
-
| `-r` | Read | `file_explorer`, `read_file`, `search_codebase`, `get_project_structure`, `
|
|
385
|
-
| `-w` | Write | `file_editor`, `context`, `
|
|
386
|
-
| `-x` | Execute | `
|
|
380
|
+
| `-r` | Read | `file_explorer`, `read_file`, `search_codebase`, `get_project_structure`, `skill`, `agent` (when agents are configured) |
|
|
381
|
+
| `-w` | Write | `file_editor`, `context`, `note`, `task`, `manage_environment_vars` |
|
|
382
|
+
| `-x` | Execute | `bash`, `background_process` |
|
|
387
383
|
| `--http` | Web/Network | `fetch_web` |
|
|
388
384
|
|
|
389
385
|
Installed plugins extend these categories (e.g. `python_editor` → write, virtualenv tools → execute, `dbs_tool` → web).
|
|
@@ -463,7 +459,6 @@ You can also manually manage context with the `context` tool and its slash-comma
|
|
|
463
459
|
| `/list-contexts` | List saved context slots |
|
|
464
460
|
| `/context-stats` | Show current token and KV-cache usage |
|
|
465
461
|
| `/archive-completed-tasks` | Move completed tasks to `.ayder/task_archive/` |
|
|
466
|
-
| `/temporal` | Start/status Temporal queue worker |
|
|
467
462
|
| `/agent list` | List configured agents and their current status |
|
|
468
463
|
| `/agent <name> <task>` | Dispatch an agent to run a task in the background |
|
|
469
464
|
| `/agent cancel <name>` | Cancel a running agent |
|
|
@@ -543,7 +538,7 @@ inside the Ollama summary.
|
|
|
543
538
|
|
|
544
539
|
ayder-cli is optimized for both large and small (local) LLMs:
|
|
545
540
|
|
|
546
|
-
- **Dynamic Tool Loading**: Only `core` and `metadata` tools are loaded by default. Use `/plugin` to enable specialized toolsets (venv, python, http, background, dbs,
|
|
541
|
+
- **Dynamic Tool Loading**: Only `core` and `metadata` tools are loaded by default. Use `/plugin` to enable specialized toolsets (venv, python, http, background, dbs, env) only when needed.
|
|
547
542
|
- **Tiered Prompts**: Use `prompt = "MINIMAL"` in config for smaller models (7B-14B) to strip complex reasoning frameworks and improve follow-through.
|
|
548
543
|
- **Automatic Context Bounding**: Conversation history is bounded based on `max_history_messages` to prevent context rot.
|
|
549
544
|
- **Tool System Prompts**: Tool-specific prompt blocks (e.g., DBS instructions) are only injected when their tag is enabled, keeping the system prompt lean.
|
|
@@ -610,23 +605,24 @@ The tool system:
|
|
|
610
605
|
- Supports tag-based filtering for dynamic enable/disable
|
|
611
606
|
- Injects tool-specific system prompts when enabled
|
|
612
607
|
|
|
613
|
-
**Built-in tools (
|
|
608
|
+
**Built-in tools (13):**
|
|
614
609
|
|
|
615
610
|
| Category | Tools |
|
|
616
611
|
|----------|-------|
|
|
617
612
|
| **Filesystem** | `file_explorer`, `read_file`, `file_editor` |
|
|
618
613
|
| **Search** | `search_codebase`, `get_project_structure` |
|
|
619
|
-
| **Shell** | `
|
|
614
|
+
| **Shell** | `bash` |
|
|
620
615
|
| **Context** | `context` (save / load / list / stats / clear session context slots) |
|
|
621
|
-
| **Notes** | `
|
|
622
|
-
| **Background Processes** | `
|
|
623
|
-
| **Tasks** | `
|
|
616
|
+
| **Notes** | `note` (create / read / update / list / delete) |
|
|
617
|
+
| **Background Processes** | `background_process` (start / logs / stop / list / info) |
|
|
618
|
+
| **Tasks** | `task` (create / list / show / status / update_status / update / update_dependencies) |
|
|
619
|
+
| **Skills** | `skill` (list / load / read / unload) |
|
|
624
620
|
| **Environment** | `manage_environment_vars` |
|
|
625
621
|
| **Web** | `fetch_web` |
|
|
626
622
|
|
|
627
|
-
When agents are configured, the `
|
|
623
|
+
When agents are configured, the `agent` tool is also registered so the main LLM can dispatch them (see [Multi-Agent System](#multi-agent-system)).
|
|
628
624
|
|
|
629
|
-
**Plugin tools** — `python_editor`, `dbs_tool`,
|
|
625
|
+
**Plugin tools** — `python_editor`, `dbs_tool`, virtualenv tools, and MCP integrations ship as optional plugins in the [ayder/ayder-plugins](https://github.com/ayder/ayder-plugins) repo (see [Plugins](#plugins)). Once installed they are auto-discovered exactly like built-ins.
|
|
630
626
|
|
|
631
627
|
## Multi-Agent System
|
|
632
628
|
|
|
@@ -637,7 +633,7 @@ ayder-cli supports user-defined **specialized agents**: each agent is an indepen
|
|
|
637
633
|
```
|
|
638
634
|
Main LLM (your conversation)
|
|
639
635
|
│
|
|
640
|
-
├─ calls `
|
|
636
|
+
├─ calls `agent` tool ──────────────────────────────────────┐
|
|
641
637
|
│ OR you type `/agent <name> <task>` │
|
|
642
638
|
│ ▼
|
|
643
639
|
│ AgentRunner (background asyncio task)
|
|
@@ -661,10 +657,10 @@ pre_iteration_hook drains queue
|
|
|
661
657
|
|
|
662
658
|
Key properties:
|
|
663
659
|
- **Separate context** — agents have no access to the main conversation history. They receive only their system prompt and the task description.
|
|
664
|
-
- **Non-blocking** — dispatching an agent returns immediately. Both `/agent` and `
|
|
660
|
+
- **Non-blocking** — dispatching an agent returns immediately. Both `/agent` and the `agent` tool are fire-and-forget.
|
|
665
661
|
- **Concurrent** — multiple agents can run simultaneously, each in its own async task.
|
|
666
662
|
- **Summary injection** — when an agent finishes, its structured `<agent-summary>` block is injected as a system message into the main LLM's context at the start of the next turn.
|
|
667
|
-
- **Timeout** — agents are automatically cancelled after `agent_timeout` seconds (default:
|
|
663
|
+
- **Timeout** — agents are automatically cancelled after `agent_timeout` seconds (default: 600).
|
|
668
664
|
|
|
669
665
|
### Configuring Agents
|
|
670
666
|
|
|
@@ -733,14 +729,14 @@ Each agent field:
|
|
|
733
729
|
|
|
734
730
|
**Via the main LLM (automatic):**
|
|
735
731
|
|
|
736
|
-
When agents are configured, the main LLM is told about them via its system prompt and can call `
|
|
732
|
+
When agents are configured, the main LLM is told about them via its system prompt and can call the `agent` tool autonomously:
|
|
737
733
|
|
|
738
734
|
```
|
|
739
735
|
You: Review the authentication module and write tests for it.
|
|
740
736
|
|
|
741
737
|
LLM: I'll dispatch two agents to handle this in parallel.
|
|
742
|
-
[calls
|
|
743
|
-
[calls
|
|
738
|
+
[calls agent: action="call", name="code-reviewer", task="Review src/auth.py..."]
|
|
739
|
+
[calls agent: action="call", name="test-writer", task="Write tests for src/auth.py..."]
|
|
744
740
|
|
|
745
741
|
Both agents are running in the background. I'll incorporate
|
|
746
742
|
their findings when they complete.
|
|
@@ -816,7 +812,7 @@ built-in support; your existing `.ayder/mcp.json` continues to work. The legacy
|
|
|
816
812
|
|
|
817
813
|
## Plugins
|
|
818
814
|
|
|
819
|
-
Official plugins (venv, python, dbs
|
|
815
|
+
Official plugins (venv, python, dbs) are maintained in the **[ayder/ayder-plugins](https://github.com/ayder/ayder-plugins)** repository. Install any plugin directly from GitHub:
|
|
820
816
|
|
|
821
817
|
```bash
|
|
822
818
|
ayder install-plugin https://github.com/ayder/ayder-plugins/tree/main/venv-tools
|
|
@@ -40,7 +40,7 @@ LLMs on their own can only generate text. To be a useful coding assistant, the m
|
|
|
40
40
|
Each tool has an OpenAI-compatible JSON schema so models that support function calling can use them natively. For models that don't, ayder-cli also parses a custom XML-like syntax (`<function=name><parameter=key>value</parameter></function>`) as a fallback.
|
|
41
41
|
|
|
42
42
|
- **Path sandboxing**: All file operations are confined to the project root via `ProjectContext`. Path traversal attacks (`../`) and absolute paths outside the project are blocked. The one exception is the session scratch directory, `/tmp/ayder-<uid>/<project>-<hash>/<session>/` (mode 0700, one subdirectory per agent run), which the system prompt names as the place for temporary files and which the file tools accept. It is not cleaned up; the OS clears `/tmp`.
|
|
43
|
-
- **Safe mode** (TUI): Blocks `file_editor`, `
|
|
43
|
+
- **Safe mode** (TUI): Blocks `file_editor`, `bash`, `background_process`, and `fetch_web`.
|
|
44
44
|
- Every tool call requires your confirmation before it runs -- you always stay in control. Use `-r`, `-w`, `-x` flags to auto-approve tool categories.
|
|
45
45
|
- You may also prefer to run ayder-cli in a container for additional security.
|
|
46
46
|
|
|
@@ -160,9 +160,9 @@ provider = "openai" # Active provider profile name
|
|
|
160
160
|
editor = "vim" # Editor for /task-edit command
|
|
161
161
|
verbose = false # Show file contents after write + LLM debug
|
|
162
162
|
max_background_processes = 5 # Max concurrent background processes (1-20)
|
|
163
|
-
max_iterations =
|
|
163
|
+
max_iterations = 0 # LLM calls per message before the loop stops (default 0 = unlimited)
|
|
164
164
|
max_output_tokens = 32768 # Max tokens in LLM response
|
|
165
|
-
max_history_messages =
|
|
165
|
+
max_history_messages = 0 # Messages kept in history (default 0 = unlimited)
|
|
166
166
|
prompt = "STANDARD" # System prompt tier: MINIMAL, STANDARD, EXTENDED
|
|
167
167
|
tool_tags = ["core", "metadata"] # Enabled tool tags (see /plugin)
|
|
168
168
|
# skills = ["development-workflow"] # or "none"; default: the built-in skills
|
|
@@ -191,12 +191,6 @@ retention = "7 days"
|
|
|
191
191
|
enabled = true
|
|
192
192
|
max_context_tokens = 8192
|
|
193
193
|
|
|
194
|
-
[temporal]
|
|
195
|
-
enabled = false
|
|
196
|
-
host = "localhost:7233"
|
|
197
|
-
namespace = "default"
|
|
198
|
-
metadata_dir = ".ayder/temporal"
|
|
199
|
-
|
|
200
194
|
# --- Provider Profiles ---
|
|
201
195
|
|
|
202
196
|
[llm.my_local_ollama]
|
|
@@ -338,9 +332,9 @@ By default, every tool call requires user confirmation. Use permission flags to
|
|
|
338
332
|
|
|
339
333
|
| Flag | Category | Built-in tools |
|
|
340
334
|
| ---- | -------- | -------------- |
|
|
341
|
-
| `-r` | Read | `file_explorer`, `read_file`, `search_codebase`, `get_project_structure`, `
|
|
342
|
-
| `-w` | Write | `file_editor`, `context`, `
|
|
343
|
-
| `-x` | Execute | `
|
|
335
|
+
| `-r` | Read | `file_explorer`, `read_file`, `search_codebase`, `get_project_structure`, `skill`, `agent` (when agents are configured) |
|
|
336
|
+
| `-w` | Write | `file_editor`, `context`, `note`, `task`, `manage_environment_vars` |
|
|
337
|
+
| `-x` | Execute | `bash`, `background_process` |
|
|
344
338
|
| `--http` | Web/Network | `fetch_web` |
|
|
345
339
|
|
|
346
340
|
Installed plugins extend these categories (e.g. `python_editor` → write, virtualenv tools → execute, `dbs_tool` → web).
|
|
@@ -420,7 +414,6 @@ You can also manually manage context with the `context` tool and its slash-comma
|
|
|
420
414
|
| `/list-contexts` | List saved context slots |
|
|
421
415
|
| `/context-stats` | Show current token and KV-cache usage |
|
|
422
416
|
| `/archive-completed-tasks` | Move completed tasks to `.ayder/task_archive/` |
|
|
423
|
-
| `/temporal` | Start/status Temporal queue worker |
|
|
424
417
|
| `/agent list` | List configured agents and their current status |
|
|
425
418
|
| `/agent <name> <task>` | Dispatch an agent to run a task in the background |
|
|
426
419
|
| `/agent cancel <name>` | Cancel a running agent |
|
|
@@ -500,7 +493,7 @@ inside the Ollama summary.
|
|
|
500
493
|
|
|
501
494
|
ayder-cli is optimized for both large and small (local) LLMs:
|
|
502
495
|
|
|
503
|
-
- **Dynamic Tool Loading**: Only `core` and `metadata` tools are loaded by default. Use `/plugin` to enable specialized toolsets (venv, python, http, background, dbs,
|
|
496
|
+
- **Dynamic Tool Loading**: Only `core` and `metadata` tools are loaded by default. Use `/plugin` to enable specialized toolsets (venv, python, http, background, dbs, env) only when needed.
|
|
504
497
|
- **Tiered Prompts**: Use `prompt = "MINIMAL"` in config for smaller models (7B-14B) to strip complex reasoning frameworks and improve follow-through.
|
|
505
498
|
- **Automatic Context Bounding**: Conversation history is bounded based on `max_history_messages` to prevent context rot.
|
|
506
499
|
- **Tool System Prompts**: Tool-specific prompt blocks (e.g., DBS instructions) are only injected when their tag is enabled, keeping the system prompt lean.
|
|
@@ -567,23 +560,24 @@ The tool system:
|
|
|
567
560
|
- Supports tag-based filtering for dynamic enable/disable
|
|
568
561
|
- Injects tool-specific system prompts when enabled
|
|
569
562
|
|
|
570
|
-
**Built-in tools (
|
|
563
|
+
**Built-in tools (13):**
|
|
571
564
|
|
|
572
565
|
| Category | Tools |
|
|
573
566
|
|----------|-------|
|
|
574
567
|
| **Filesystem** | `file_explorer`, `read_file`, `file_editor` |
|
|
575
568
|
| **Search** | `search_codebase`, `get_project_structure` |
|
|
576
|
-
| **Shell** | `
|
|
569
|
+
| **Shell** | `bash` |
|
|
577
570
|
| **Context** | `context` (save / load / list / stats / clear session context slots) |
|
|
578
|
-
| **Notes** | `
|
|
579
|
-
| **Background Processes** | `
|
|
580
|
-
| **Tasks** | `
|
|
571
|
+
| **Notes** | `note` (create / read / update / list / delete) |
|
|
572
|
+
| **Background Processes** | `background_process` (start / logs / stop / list / info) |
|
|
573
|
+
| **Tasks** | `task` (create / list / show / status / update_status / update / update_dependencies) |
|
|
574
|
+
| **Skills** | `skill` (list / load / read / unload) |
|
|
581
575
|
| **Environment** | `manage_environment_vars` |
|
|
582
576
|
| **Web** | `fetch_web` |
|
|
583
577
|
|
|
584
|
-
When agents are configured, the `
|
|
578
|
+
When agents are configured, the `agent` tool is also registered so the main LLM can dispatch them (see [Multi-Agent System](#multi-agent-system)).
|
|
585
579
|
|
|
586
|
-
**Plugin tools** — `python_editor`, `dbs_tool`,
|
|
580
|
+
**Plugin tools** — `python_editor`, `dbs_tool`, virtualenv tools, and MCP integrations ship as optional plugins in the [ayder/ayder-plugins](https://github.com/ayder/ayder-plugins) repo (see [Plugins](#plugins)). Once installed they are auto-discovered exactly like built-ins.
|
|
587
581
|
|
|
588
582
|
## Multi-Agent System
|
|
589
583
|
|
|
@@ -594,7 +588,7 @@ ayder-cli supports user-defined **specialized agents**: each agent is an indepen
|
|
|
594
588
|
```
|
|
595
589
|
Main LLM (your conversation)
|
|
596
590
|
│
|
|
597
|
-
├─ calls `
|
|
591
|
+
├─ calls `agent` tool ──────────────────────────────────────┐
|
|
598
592
|
│ OR you type `/agent <name> <task>` │
|
|
599
593
|
│ ▼
|
|
600
594
|
│ AgentRunner (background asyncio task)
|
|
@@ -618,10 +612,10 @@ pre_iteration_hook drains queue
|
|
|
618
612
|
|
|
619
613
|
Key properties:
|
|
620
614
|
- **Separate context** — agents have no access to the main conversation history. They receive only their system prompt and the task description.
|
|
621
|
-
- **Non-blocking** — dispatching an agent returns immediately. Both `/agent` and `
|
|
615
|
+
- **Non-blocking** — dispatching an agent returns immediately. Both `/agent` and the `agent` tool are fire-and-forget.
|
|
622
616
|
- **Concurrent** — multiple agents can run simultaneously, each in its own async task.
|
|
623
617
|
- **Summary injection** — when an agent finishes, its structured `<agent-summary>` block is injected as a system message into the main LLM's context at the start of the next turn.
|
|
624
|
-
- **Timeout** — agents are automatically cancelled after `agent_timeout` seconds (default:
|
|
618
|
+
- **Timeout** — agents are automatically cancelled after `agent_timeout` seconds (default: 600).
|
|
625
619
|
|
|
626
620
|
### Configuring Agents
|
|
627
621
|
|
|
@@ -690,14 +684,14 @@ Each agent field:
|
|
|
690
684
|
|
|
691
685
|
**Via the main LLM (automatic):**
|
|
692
686
|
|
|
693
|
-
When agents are configured, the main LLM is told about them via its system prompt and can call `
|
|
687
|
+
When agents are configured, the main LLM is told about them via its system prompt and can call the `agent` tool autonomously:
|
|
694
688
|
|
|
695
689
|
```
|
|
696
690
|
You: Review the authentication module and write tests for it.
|
|
697
691
|
|
|
698
692
|
LLM: I'll dispatch two agents to handle this in parallel.
|
|
699
|
-
[calls
|
|
700
|
-
[calls
|
|
693
|
+
[calls agent: action="call", name="code-reviewer", task="Review src/auth.py..."]
|
|
694
|
+
[calls agent: action="call", name="test-writer", task="Write tests for src/auth.py..."]
|
|
701
695
|
|
|
702
696
|
Both agents are running in the background. I'll incorporate
|
|
703
697
|
their findings when they complete.
|
|
@@ -773,7 +767,7 @@ built-in support; your existing `.ayder/mcp.json` continues to work. The legacy
|
|
|
773
767
|
|
|
774
768
|
## Plugins
|
|
775
769
|
|
|
776
|
-
Official plugins (venv, python, dbs
|
|
770
|
+
Official plugins (venv, python, dbs) are maintained in the **[ayder/ayder-plugins](https://github.com/ayder/ayder-plugins)** repository. Install any plugin directly from GitHub:
|
|
777
771
|
|
|
778
772
|
```bash
|
|
779
773
|
ayder install-plugin https://github.com/ayder/ayder-plugins/tree/main/venv-tools
|
|
@@ -12,7 +12,7 @@ Input: the candidate SHA.
|
|
|
12
12
|
gates and the test suite, and stops at the first failing task.
|
|
13
13
|
4. Copy the final pytest summary line (`=== N passed, M skipped in …s ===`) verbatim.
|
|
14
14
|
|
|
15
|
-
Last measured: `
|
|
15
|
+
Last measured: `3042 passed, 2 skipped` on `fix/various-scopes` (2026-11-14, release 2.5.4).
|
|
16
16
|
|
|
17
17
|
## Report format
|
|
18
18
|
|
|
@@ -97,7 +97,7 @@ ayder-cli is an AI agent chat client with a modular, layered architecture:
|
|
|
97
97
|
1. **Layered Architecture**: Clear separation between entry → app → service → core → tools
|
|
98
98
|
2. **Protocol-Based**: `ChatCallbacks` protocol decouples the chat loop from UI concerns; `InteractionSink` decouples LLM providers from UI for debug events
|
|
99
99
|
3. **Single Composition Root**: `application/runtime_factory.create_runtime()` assembles all dependencies — no duplicated wiring between CLI and TUI
|
|
100
|
-
4. **Single Loop**: `ChatLoop` (in `loops/chat_loop.py`) owns the full async LLM + tool execution loop; both CLI and TUI route through it. A run ends on a text-only reply, a cancel, an error, `max_iterations` LLM calls (`[
|
|
100
|
+
4. **Single Loop**: `ChatLoop` (in `loops/chat_loop.py`) owns the full async LLM + tool execution loop; both CLI and TUI route through it. A run ends on a text-only reply, a cancel, an error, `max_iterations` LLM calls when set (default 0 = unlimited; `[agents.<name>]` does not inherit `[app]`), or 3 reasoning-only replies in a row; from the 3rd identical tool call in a row, the result carries a `[harness]` note
|
|
101
101
|
5. **Single Execution Path**: `ExecutionPolicy.execute_with_registry()` is the sole tool execution entry point; validation → permission → execute, no inline policy in loop code
|
|
102
102
|
6. **Single Validation Path**: `ValidationAuthority → SchemaValidator` is the only validation stage; schema derived from live `TOOL_DEFINITIONS` registry (no hardcoded lists)
|
|
103
103
|
7. **Sandboxed Paths**: All file operations go through `ProjectContext` for security (project root plus the session scratch directory from `new_scratch_dir`). Only a path outside the sandbox (`PathOutsideSandboxError`) is reported as a security error; other bad input, such as a binary file or a non-numeric line number, is a validation error
|
|
@@ -187,13 +187,13 @@ cli.py:main()
|
|
|
187
187
|
| `agents/callbacks.py` | `AgentCallbacks` — `ChatCallbacks` for autonomous agents |
|
|
188
188
|
| `agents/runner.py` | `AgentRunner` — wraps one `ChatLoop` per agent dispatch |
|
|
189
189
|
| `agents/registry.py` | `AgentRegistry` — dispatch, cancel, status, capability prompts |
|
|
190
|
-
| `agents/tool.py` | `
|
|
190
|
+
| `agents/tool.py` | `agent` tool definition (`action`: call / list / status / read_result) + handler factory |
|
|
191
191
|
|
|
192
192
|
**Agent dispatch flow (Approach A — all non-blocking):**
|
|
193
193
|
1. Config parsed → `AgentConfig` objects in `Config.agents`
|
|
194
194
|
2. `AyderApp.__init__` creates `AgentRegistry` if agents configured
|
|
195
|
-
3. LLM calls `
|
|
196
|
-
4. User runs `/agent <name> <task>` → same `registry.
|
|
195
|
+
3. LLM calls the `agent` tool with `action="call"` → `registry.create_run()` (sync, fire-and-forget)
|
|
196
|
+
4. User runs `/agent <name> <task>` → same `registry.create_run()`
|
|
197
197
|
5. Agent runs `ChatLoop` with isolated runtime + `AgentCallbacks` in background
|
|
198
198
|
6. Summary parsed from `<agent-summary>` block → `AgentSummary` → `_summary_queue`
|
|
199
199
|
7. `pre_iteration_hook` drains queue → injects summaries as system messages
|
|
@@ -274,9 +274,6 @@ drivers, the registry, or `OllamaProvider` are required.
|
|
|
274
274
|
| `deepseek.py` | deepseek-r1/v3/coder `<function_calls><invoke>` format |
|
|
275
275
|
| `minimax.py` | MiniMax-M1 namespaced `<minimax:tool_call>` format |
|
|
276
276
|
|
|
277
|
-
See `docs/superpowers/specs/2026-05-02-ollama-chat-drivers-design.md` for
|
|
278
|
-
the design rationale.
|
|
279
|
-
|
|
280
277
|
### Tool Modules
|
|
281
278
|
|
|
282
279
|
| Module | Purpose | Key Classes/Functions |
|
|
@@ -295,12 +292,14 @@ the design rationale.
|
|
|
295
292
|
| `tools/builtins/search.py` | Search tool impls | `search_codebase()`, `get_project_structure()` |
|
|
296
293
|
| `tools/builtins/shell.py` | Shell execution impl: own session, closed stdin, prompts/pagers off (`GIT_TERMINAL_PROMPT=0`, `PAGER`/`GIT_PAGER=cat`; `environment` overrides), process-group kill on timeout with partial output, per-stream output bounds | `bash()` |
|
|
297
294
|
| `tools/builtins/context.py` | Session context snapshots | `context` |
|
|
298
|
-
| `tools/builtins/
|
|
299
|
-
| `tools/builtins/
|
|
295
|
+
| `tools/builtins/note_tool.py` | `note` tool (`action`: create / read / update / list / delete) | `note()` |
|
|
296
|
+
| `tools/builtins/notes.py` | Note file helpers used by the `note` tool | `write_note_file()`, `read_note_file()`, `update_note_file()`, `list_note_ids()`, `delete_note_file()` |
|
|
297
|
+
| `tools/builtins/task_tool.py` | `task` tool (`action`: create / list / show / status / update_status / update / update_dependencies) | `task()` |
|
|
298
|
+
| `tools/builtins/tasks.py` | Task file helpers used by the `task` tool and `TaskRunner` | `create_task()`, `list_tasks()`, `show_task()`, `resolve_task_path()` |
|
|
300
299
|
| `tools/builtins/skill.py` | Skill tool impl | `skill()`, `discover_skills()` |
|
|
301
300
|
| `tools/builtins/web.py` | HTTP fetch tool | `fetch_web()` |
|
|
302
301
|
| `tools/builtins/utils_tools.py` | Misc utility tools | `manage_environment_vars()` |
|
|
303
|
-
| `tools/builtins/*_definitions.py` | Per-domain tool definitions (
|
|
302
|
+
| `tools/builtins/*_definitions.py` | Per-domain tool definitions (10 files) | `TOOL_DEFINITIONS` tuples auto-discovered at import |
|
|
304
303
|
|
|
305
304
|
### Feature Modules
|
|
306
305
|
|
|
@@ -653,18 +652,21 @@ Schema-driven tool definitions with auto-discovery:
|
|
|
653
652
|
- **Schema generation**: `to_openai_schema()` returns the OpenAI function-calling dict
|
|
654
653
|
- **Plugin loading**: `tools/plugin_manager.py` can augment `TOOL_DEFINITIONS` at runtime from local or GitHub-sourced plugins
|
|
655
654
|
|
|
656
|
-
|
|
655
|
+
13 built-in tools across 10 definition files:
|
|
657
656
|
- Filesystem (3): `file_explorer`, `read_file`, `file_editor`
|
|
658
657
|
- Search (2): `search_codebase`, `get_project_structure`
|
|
659
658
|
- Shell (1): `bash`
|
|
660
|
-
- Context (1): `context`
|
|
661
|
-
- Notes (1): `
|
|
659
|
+
- Context (1): `context` (action=save|load|list|stats|clear)
|
|
660
|
+
- Notes (1): `note` (action=create|read|update|list|delete)
|
|
662
661
|
- Background Process (1): `background_process` (action=start|logs|stop|list|info)
|
|
663
|
-
- Tasks (
|
|
662
|
+
- Tasks (1): `task` (action=create|list|show|status|update_status|update|update_dependencies)
|
|
663
|
+
- Skills (1): `skill` (action=list|load|read|unload)
|
|
664
664
|
- Environment (1): `manage_environment_vars`
|
|
665
665
|
- Web (1): `fetch_web`
|
|
666
666
|
|
|
667
|
-
|
|
667
|
+
Registered at run time, not counted above: `agent` (when agents are configured) and the tools of configured MCP servers.
|
|
668
|
+
|
|
669
|
+
> The authoritative count comes from `len(_BUILTIN_DEFINITIONS)` (`TOOL_DEFINITIONS` also includes installed plugins); run `python -c "from ayder_cli.tools.definition import _BUILTIN_DEFINITIONS; print(len(_BUILTIN_DEFINITIONS))"` to verify.
|
|
668
670
|
|
|
669
671
|
---
|
|
670
672
|
|
|
@@ -20,26 +20,29 @@ specialist agents, pass each one the right context, and move work through the
|
|
|
20
20
|
pipeline. Keep your own messages short; let the agents do the heavy lifting.
|
|
21
21
|
|
|
22
22
|
### How to talk to an agent
|
|
23
|
-
- `
|
|
24
|
-
immediately. It does not block.
|
|
25
|
-
|
|
26
|
-
`
|
|
27
|
-
-
|
|
28
|
-
|
|
23
|
+
- `agent(action="call", name="<name>", task=…, task_id=…, branch_name=…, base_branch=…)`
|
|
24
|
+
→ returns a **run id** immediately. It does not block. `action` and `name` are
|
|
25
|
+
required; `task` may be left out only when `task_id` is given. Use
|
|
26
|
+
`agent(action="list")` to discover the exact names.
|
|
27
|
+
- Dispatch independent tasks together (several `agent(action="call")` calls), then
|
|
28
|
+
check `agent(action="status")` to see what is `working` vs `done`.
|
|
29
|
+
- Collect a finished one with `agent(action="read_result", run_id=<run_id>)`, or wait
|
|
30
|
+
for a slow one with `agent(action="read_result", run_id=<run_id>, wait=true, timeout_s=…)`
|
|
31
|
+
instead of polling in a loop.
|
|
29
32
|
- Each agent only sees the prompt you give it. **For task-file work, pass
|
|
30
33
|
`task_id="TASK-NNN"` and `branch_name="agent/<slug>"`** — the harness resolves the
|
|
31
34
|
id, **fails fast** if it doesn't exist, and embeds the task file itself in the
|
|
32
35
|
agent's prompt. Do **not** read the task file and paste its body into `task`; use
|
|
33
36
|
`task` only for extra steering (or as the whole instruction when there's no file).
|
|
34
37
|
- **Don't write notes or summaries yourself.** Every agent auto-saves its full
|
|
35
|
-
deliverable to `.ayder/notes/`; collect it with `
|
|
36
|
-
its `note_path`). Re-summarizing an agent's output into your own note is wasted work.
|
|
38
|
+
deliverable to `.ayder/notes/`; collect it with `agent(action="read_result")` (or
|
|
39
|
+
`read_file` its `note_path`). Re-summarizing an agent's output into your own note is wasted work.
|
|
37
40
|
- **Give pointers, not pasted content.** Agents share the working tree and have
|
|
38
41
|
shell/read/search tools — they run their own `git diff` and read their own files.
|
|
39
42
|
Hand a reviewer/QA/gate agent the branch, the base ref, the task id(s), and the
|
|
40
43
|
paths; do **not** read source or diffs and paste them into `task`. Pasting wastes
|
|
41
44
|
your context and is exactly what makes a review/QA dispatch stall.
|
|
42
|
-
- **Never dispatch an empty task.** Every `
|
|
45
|
+
- **Never dispatch an empty task.** Every `agent(action="call")` must carry a concrete
|
|
43
46
|
instruction — a non-empty `task` and/or a `task_id` that resolves to a task file.
|
|
44
47
|
If neither carries real content, you are not ready to dispatch — fix that first.
|
|
45
48
|
|
|
@@ -55,17 +58,14 @@ pipeline. Keep your own messages short; let the agents do the heavy lifting.
|
|
|
55
58
|
which tasks are **parallel** and which are small/low-risk.
|
|
56
59
|
4. **Task split (delegate it — don't split the work yourself).** Ask the
|
|
57
60
|
`architect` to break the **approved plan** into task files in `.ayder/tasks/`,
|
|
58
|
-
one file per task, exactly like `/plan
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
- **Status:** pending
|
|
67
|
-
- **Created:** <YYYY-MM-DD HH:MM:SS>
|
|
68
|
-
```
|
|
61
|
+
one file per task, exactly like `/plan`: one call per task,
|
|
62
|
+
`task(action="create", title=…, body=…, branch="agent/<slug>", dependencies="TASK-NNN,…")`.
|
|
63
|
+
- `body` is the task in PRD form: `## Goal`, `## Files`, `## Acceptance Criteria`
|
|
64
|
+
(as a checklist) and `## Notes`.
|
|
65
|
+
- The tool allocates the next `TASK-<NNN>` id, names the file, writes the
|
|
66
|
+
`## Signature` header (status `pending`) itself and returns the id. Do not
|
|
67
|
+
hand-format a header or compute the next number; use `task(action="list")` to
|
|
68
|
+
review the queue.
|
|
69
69
|
5. **Task review.** `architect_review` checks the **whole task set against the
|
|
70
70
|
approved plan**: full coverage (every plan item maps to a task), no scope
|
|
71
71
|
creep, correct sizing/sequencing, consistent interfaces across tasks. Loop
|
|
@@ -73,13 +73,13 @@ pipeline. Keep your own messages short; let the agents do the heavy lifting.
|
|
|
73
73
|
`/tasks` (○ pending · ◐ in_progress · ✓ done).
|
|
74
74
|
6. **Delegate (isolated — see git rules below).** Work the queue task by task:
|
|
75
75
|
- Flip the task's `**Status:**` to `in_progress`, then dispatch it with
|
|
76
|
-
`
|
|
76
|
+
`agent(action="call", name="senior_coder", task_id="TASK-NNN", branch_name="agent/<slug>", base_branch="feat/<slug>")`
|
|
77
77
|
(small, low-risk tasks → the single `junior_coder`, one at a time). The harness
|
|
78
78
|
hands the agent the task file and the branch directive — you don't paste the
|
|
79
79
|
task body. Each agent commits only to its own branch.
|
|
80
80
|
- When you collect and accept the result, flip the task's `**Status:**` to `done`.
|
|
81
|
-
Update a status
|
|
82
|
-
`
|
|
81
|
+
Update a status with `task(action="update_status", identifier="TASK-NNN",
|
|
82
|
+
status="in_progress")` (or `status="done"`). This keeps `/tasks` accurate so
|
|
83
83
|
the user always sees what is queued, in flight, and finished.
|
|
84
84
|
7. **QA.** `qa_engineer` writes and runs the test suite, reports real pass/fail output.
|
|
85
85
|
Give it the branch + task ids; it reads the code and runs the tests itself.
|
|
@@ -94,26 +94,26 @@ pipeline. Keep your own messages short; let the agents do the heavy lifting.
|
|
|
94
94
|
|
|
95
95
|
### Git rules — so agents don't step on each other
|
|
96
96
|
|
|
97
|
-
|
|
98
|
-
collide.
|
|
97
|
+
Agents without a branch share the main working directory, so two of them editing
|
|
98
|
+
at once will collide. Give every builder a branch and the harness isolates it:
|
|
99
99
|
|
|
100
|
-
- **One branch per task.** Name them `agent/<task-slug
|
|
101
|
-
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
100
|
+
- **One branch per task.** Name them `agent/<task-slug>` and pass
|
|
101
|
+
`branch_name="agent/<task-slug>"` with `base_branch="feat/<slug>"` to
|
|
102
|
+
`agent(action="call")`.
|
|
103
|
+
- **The harness makes the worktree.** A run with a `branch_name` works in its own
|
|
104
|
+
worktree at `.ayder/worktrees/<task-slug>`, forked from `base_branch` (default: the
|
|
105
|
+
repo's default branch; an existing branch is reused), and the worktree is removed
|
|
106
|
+
when the run ends. Parallel builders never touch each other's files. The project
|
|
107
|
+
must be a git repository, or the run fails.
|
|
108
108
|
- **Builders commit only to their own branch.** They never touch `main`, `feat/<slug>`,
|
|
109
|
-
or another agent's branch.
|
|
109
|
+
or another agent's branch. Uncommitted work is lost with the worktree: a branch run
|
|
110
|
+
that makes no commit ends with status `error` ("no commit on branch"); re-dispatch it.
|
|
110
111
|
- **Only the gate merges.** It integrates branches in dependency order:
|
|
111
112
|
```bash
|
|
112
113
|
git switch feat/<slug>
|
|
113
114
|
git merge --no-ff agent/<task-slug> # repeat per approved branch; resolve conflicts
|
|
114
115
|
# run the full suite + acceptance checks, then:
|
|
115
116
|
git switch main && git merge --no-ff feat/<slug>
|
|
116
|
-
git worktree remove .ayder/worktrees/<task-slug> # clean up
|
|
117
117
|
```
|
|
118
118
|
|
|
119
119
|
### Simple rules to keep it on the rails
|