ayder-cli 2.5.2__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.2 → ayder_cli-2.5.4}/.gitignore +1 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/AGENTS.md +30 -19
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/PKG-INFO +26 -29
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/README.md +23 -28
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/docs/GATE.md +1 -1
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/docs/PROJECT_STRUCTURE.md +25 -21
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/docs/README_AGENT_WORKFLOW.md +35 -35
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/docs/README_OLLAMA.md +0 -1
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/docs/config.toml.example +3 -3
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/pyproject.toml +4 -2
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/scripts/check_exception_handlers.py +1 -1
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/scripts/check_log_arguments.py +5 -5
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/scripts/log_argument_baseline.txt +4 -3
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/agents/config.py +1 -1
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/agents/runner.py +3 -10
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/cli.py +9 -40
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/cli_runner.py +0 -27
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/core/config.py +2 -107
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/core/config_migration.py +2 -44
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/core/skills.py +5 -3
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/logging_config.py +5 -1
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/loops/chat_loop.py +29 -1
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/prompts.py +3 -1
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/providers/impl/ollama_drivers/base.py +0 -2
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/providers/retry.py +7 -1
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/themes/ayder.py +17 -25
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/themes/claude.py +17 -25
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/tools/builtins/tasks.py +0 -44
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/tools/plugin_manager.py +0 -16
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/tui/__init__.py +4 -3
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/tui/app.py +42 -57
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/tui/commands.py +1 -61
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/tui/screens.py +6 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/tui/widgets.py +123 -17
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/application/test_runtime_factory.py +1 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/core/test_config.py +0 -57
- {ayder_cli-2.5.2 → 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.2 → ayder_cli-2.5.4}/tests/core/test_logging_config_keys.py +1 -2
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/core/test_logging_sinks.py +21 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/loops/test_chat_loop_guards.py +70 -5
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/providers/test_retry_classifier.py +11 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/scripts/test_exception_gate.py +6 -3
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/scripts/test_log_argument_gate.py +14 -14
- {ayder_cli-2.5.2 → 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.2 → ayder_cli-2.5.4}/tests/test_prompts_environment.py +92 -1
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/test_tasks.py +0 -58
- ayder_cli-2.5.4/tests/tui/test_follow_mode.py +132 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/tui/test_help_screen.py +26 -0
- ayder_cli-2.5.4/tests/tui/test_inline_sync_output.py +77 -0
- ayder_cli-2.5.4/tests/tui/test_mouse_support.py +20 -0
- ayder_cli-2.5.4/tests/tui/test_panel_layout.py +490 -0
- ayder_cli-2.5.4/tests/tui/test_real_turn_follow.py +260 -0
- ayder_cli-2.5.4/tests/tui/test_skill_label_refresh.py +126 -0
- ayder_cli-2.5.4/tests/tui/test_status_bar_cwd.py +185 -0
- ayder_cli-2.5.4/uv.lock +3037 -0
- ayder_cli-2.5.2/tests/tui/test_follow_mode.py +0 -38
- ayder_cli-2.5.2/tests/ui/test_tui_temporal_command.py +0 -115
- ayder_cli-2.5.2/uv.lock +0 -2441
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/.github/workflows/ci.yml +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/.github/workflows/python-package.yml +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/.python-version +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/LICENSE +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/docs/cc.png +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/scripts/check_logging_imports.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/scripts/exception_baseline.txt +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/scripts/find_percent_logging.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/scripts/logging_gates.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/__init__.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/__main__.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/agents/__init__.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/agents/callbacks.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/agents/registry.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/agents/run.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/agents/tool.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/agents/worktree.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/application/README.md +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/application/__init__.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/application/execution_policy.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/application/message_contract.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/application/runtime_factory.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/application/validation.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/cli_callbacks.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/console.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/core/cache_monitor.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/core/context.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/core/context_manager.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/core/context_manager_factory.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/core/default_context_manager.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/core/ollama_context_manager.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/core/reasoning.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/core/result.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/core/session.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/diagnostics.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/log.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/loops/__init__.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/masking.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/parser.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/process_manager.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/providers/__init__.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/providers/base.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/providers/evren.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/providers/impl/claude.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/providers/impl/deepseek.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/providers/impl/gemini.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/providers/impl/glm.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/providers/impl/ollama.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/providers/impl/ollama_drivers/__init__.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/providers/impl/ollama_drivers/_errors.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/providers/impl/ollama_drivers/deepseek.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/providers/impl/ollama_drivers/generic_native.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/providers/impl/ollama_drivers/generic_xml.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/providers/impl/ollama_drivers/matrix.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/providers/impl/ollama_drivers/minimax.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/providers/impl/ollama_drivers/qwen3.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/providers/impl/ollama_drivers/registry.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/providers/impl/ollama_inspector.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/providers/impl/openai.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/providers/impl/qwen.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/providers/orchestrator.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/services/__init__.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/services/interactions.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/services/messaging_inbox.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/skills/development-workflow/SKILL.md +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/themes/__init__.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/tools/__init__.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/tools/builtins/__init__.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/tools/builtins/background_process_tool.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/tools/builtins/context.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/tools/builtins/context_definitions.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/tools/builtins/filesystem.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/tools/builtins/filesystem_definitions.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/tools/builtins/note_tool.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/tools/builtins/notes.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/tools/builtins/notes_definitions.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/tools/builtins/process_manager_definitions.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/tools/builtins/search.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/tools/builtins/search_definitions.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/tools/builtins/shell.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/tools/builtins/shell_definitions.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/tools/builtins/skill.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/tools/builtins/skill_definitions.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/tools/builtins/task_definitions.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/tools/builtins/task_tool.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/tools/builtins/utils_tools.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/tools/builtins/utils_tools_definitions.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/tools/builtins/web.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/tools/builtins/web_definitions.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/tools/definition.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/tools/execution.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/tools/hooks.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/tools/mcp.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/tools/mcp_client.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/tools/normalization.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/tools/plugin_api.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/tools/plugin_github.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/tools/plugin_status.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/tools/registry.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/tools/schemas.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/tools/utils.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/tui/adapter.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/tui/helpers.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/tui/keybindings.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/tui/parser.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/tui/rendering.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/tui/theme_manager.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/tui/types.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/ui.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/version.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/COVERAGE.md +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/__init__.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/agents/__init__.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/agents/test_agent_consolidated.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/agents/test_agent_severity.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/agents/test_agent_tools.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/agents/test_callbacks.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/agents/test_config.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/agents/test_integration.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/agents/test_queue.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/agents/test_registry.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/agents/test_run.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/agents/test_runner.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/agents/test_runner_provider_unavailable.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/agents/test_tool.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/agents/test_worktree_helpers.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/agents/test_worktree_isolation.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/application/test_argument_canonicalization.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/application/test_execution_result_truthfulness.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/application/test_message_contract.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/client/test_main.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/conftest.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/convergence/__init__.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/convergence/test_execution_policy_parity.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/convergence/test_runtime_wiring.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/convergence/test_validation_path.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/core/test_asyncio_bridge.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/core/test_cache_monitor.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/core/test_config_migration.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/core/test_config_provider_logging.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/core/test_config_retry.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/core/test_config_skills.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/core/test_config_v2.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/core/test_context_manager_factory.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/core/test_default_config_evren.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/core/test_default_context_manager.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/core/test_default_context_manager_should_compact.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/core/test_default_context_newest_unit.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/core/test_default_context_skill_resupply.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/core/test_event_emission.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/core/test_event_stream.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/core/test_exception_guarantee.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/core/test_exception_hooks.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/core/test_log_facade.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/core/test_loguru_caplog.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/core/test_max_output_tokens_default.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/core/test_ollama_compaction_persistence.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/core/test_ollama_context_manager.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/core/test_ollama_context_manager_cache_monitor.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/core/test_ollama_context_manager_max_history.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/core/test_ollama_skill_resupply.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/core/test_parameter_aliasing.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/core/test_parser.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/core/test_reasoning_config.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/core/test_scratch_dir.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/core/test_session.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/core/test_session_id_threading.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/core/test_sink_masking.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/core/test_skills.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/core/test_skills_builtin_sync.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/loops/__init__.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/loops/test_base.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/loops/test_chat_loop_hook.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/loops/test_chat_loop_tool_truncation.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/loops/test_loop_severity.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/loops/test_required_args_aliases.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/loops/test_tool_argument_integrity.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/loops/test_tool_batch_cancellation.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/loops/test_tool_batch_ordering.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/providers/__init__.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/providers/ollama_drivers/__init__.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/providers/ollama_drivers/test_base.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/providers/ollama_drivers/test_deepseek.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/providers/ollama_drivers/test_errors.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/providers/ollama_drivers/test_fallback.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/providers/ollama_drivers/test_generic_native.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/providers/ollama_drivers/test_generic_xml.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/providers/ollama_drivers/test_matrix.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/providers/ollama_drivers/test_minimax.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/providers/ollama_drivers/test_provider_integration.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/providers/ollama_drivers/test_qwen3.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/providers/ollama_drivers/test_registry.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/providers/test_claude_stream_tool_calls.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/providers/test_evren.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/providers/test_gemini_function_calls.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/providers/test_glm_async.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/providers/test_ollama_inspector.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/providers/test_ollama_native.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/providers/test_ollama_parallel_tool_call_ids.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/providers/test_ollama_xml.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/providers/test_ollama_xml_autoroute.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/providers/test_ollama_xml_usage.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/providers/test_openai_list_models.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/providers/test_orchestrator_capabilities.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/providers/test_provider_channel_binding.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/providers/test_provider_severity.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/providers/test_qwen_async.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/providers/test_reasoning_effort.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/providers/test_retry_integration.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/providers/test_retrying_provider.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/providers/test_skill_load_prefix.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/scripts/test_logging_policy_gates.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/scripts/test_loguru_private_shape.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/services/test_boundary.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/services/test_interaction_sink.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/services/test_messaging_inbox.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/test_agents_md.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/test_cli_callbacks.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/test_context.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/test_env_manager.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/test_logging_config.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/test_notes.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/test_process_manager.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/test_prompts_general.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/tools/__init__.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/tools/test_agent_notes.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/tools/test_background_process_tool.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/tools/test_bash_process_safety.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/tools/test_bash_tool.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/tools/test_context_storage_confinement.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/tools/test_definition_discovery.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/tools/test_di_injection.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/tools/test_error_labels.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/tools/test_file_editor_hardening.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/tools/test_file_editor_size_limit.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/tools/test_file_tool_output.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/tools/test_impl.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/tools/test_impl_coverage.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/tools/test_mcp.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/tools/test_mcp_client.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/tools/test_note_tool.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/tools/test_notes_api.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/tools/test_notes_confinement.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/tools/test_parallel_safe.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/tools/test_path_security.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/tools/test_plugin_api.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/tools/test_plugin_github.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/tools/test_plugin_loading.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/tools/test_plugin_manager.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/tools/test_plugin_status.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/tools/test_registry.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/tools/test_registry_coverage.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/tools/test_result.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/tools/test_schemas.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/tools/test_search_codebase.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/tools/test_search_hardening.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/tools/test_skill_catalog_and_filter.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/tools/test_skill_scope_wiring.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/tools/test_skill_tool.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/tools/test_task_integrity.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/tools/test_task_path_confinement.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/tools/test_task_tool.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/tools/test_tool_severity.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/tools/test_unexpected_args.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/tools/test_utils.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/tools/test_web.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/tui/__init__.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/tui/test_agent_list_screen.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/tui/test_do_clear_coordination.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/tui/test_evren_terms.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/tui/test_input_box.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/tui/test_keybindings.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/tui/test_multi_select_screen.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/tui/test_multiline_input.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/tui/test_paste.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/tui/test_peer_message_turn.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/tui/test_pending_compact_consumer.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/tui/test_pull_delivery.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/tui/test_resume.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/tui/test_status_bar_badges.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/tui/test_themes.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/tui/test_turn_consumer.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/tui/test_widgets.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/ui/test_confirm_screen.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/ui/test_diff_preview.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/ui/test_plugin_autoenable.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/ui/test_provider_switch.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/ui/test_run_tui_startup.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/ui/test_tui_assistant_sanitization.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/ui/test_tui_chat_loop.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/ui/test_tui_commands_agent.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/ui/test_tui_commands_effort.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/ui/test_tui_commands_logging.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/ui/test_tui_commands_plugin.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/ui/test_tui_commands_provider.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/ui/test_tui_commands_skill.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/ui/test_tui_helpers.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/ui/test_tui_system_prompt_no_structure.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/ui/test_tui_widgets.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/ui/test_ui.py +0 -0
- {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/ui/test_ui_coverage.py +0 -0
- {ayder_cli-2.5.2 → 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 |
|
|
@@ -535,6 +530,7 @@ inside the Ollama summary.
|
|
|
535
530
|
| `Ctrl+L` | Clear chat |
|
|
536
531
|
| `Ctrl+O` | Toggle tool panel |
|
|
537
532
|
| `Ctrl+T` | Toggle thinking/reasoning blocks |
|
|
533
|
+
| `Shift` + drag | Select text with the mouse (Option in iTerm2 and Terminal.app) |
|
|
538
534
|
| `PageUp` / `PageDown` | Scroll chat view |
|
|
539
535
|
| `Tab` | Auto-complete slash commands |
|
|
540
536
|
|
|
@@ -542,7 +538,7 @@ inside the Ollama summary.
|
|
|
542
538
|
|
|
543
539
|
ayder-cli is optimized for both large and small (local) LLMs:
|
|
544
540
|
|
|
545
|
-
- **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.
|
|
546
542
|
- **Tiered Prompts**: Use `prompt = "MINIMAL"` in config for smaller models (7B-14B) to strip complex reasoning frameworks and improve follow-through.
|
|
547
543
|
- **Automatic Context Bounding**: Conversation history is bounded based on `max_history_messages` to prevent context rot.
|
|
548
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.
|
|
@@ -609,23 +605,24 @@ The tool system:
|
|
|
609
605
|
- Supports tag-based filtering for dynamic enable/disable
|
|
610
606
|
- Injects tool-specific system prompts when enabled
|
|
611
607
|
|
|
612
|
-
**Built-in tools (
|
|
608
|
+
**Built-in tools (13):**
|
|
613
609
|
|
|
614
610
|
| Category | Tools |
|
|
615
611
|
|----------|-------|
|
|
616
612
|
| **Filesystem** | `file_explorer`, `read_file`, `file_editor` |
|
|
617
613
|
| **Search** | `search_codebase`, `get_project_structure` |
|
|
618
|
-
| **Shell** | `
|
|
614
|
+
| **Shell** | `bash` |
|
|
619
615
|
| **Context** | `context` (save / load / list / stats / clear session context slots) |
|
|
620
|
-
| **Notes** | `
|
|
621
|
-
| **Background Processes** | `
|
|
622
|
-
| **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) |
|
|
623
620
|
| **Environment** | `manage_environment_vars` |
|
|
624
621
|
| **Web** | `fetch_web` |
|
|
625
622
|
|
|
626
|
-
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)).
|
|
627
624
|
|
|
628
|
-
**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.
|
|
629
626
|
|
|
630
627
|
## Multi-Agent System
|
|
631
628
|
|
|
@@ -636,7 +633,7 @@ ayder-cli supports user-defined **specialized agents**: each agent is an indepen
|
|
|
636
633
|
```
|
|
637
634
|
Main LLM (your conversation)
|
|
638
635
|
│
|
|
639
|
-
├─ calls `
|
|
636
|
+
├─ calls `agent` tool ──────────────────────────────────────┐
|
|
640
637
|
│ OR you type `/agent <name> <task>` │
|
|
641
638
|
│ ▼
|
|
642
639
|
│ AgentRunner (background asyncio task)
|
|
@@ -660,10 +657,10 @@ pre_iteration_hook drains queue
|
|
|
660
657
|
|
|
661
658
|
Key properties:
|
|
662
659
|
- **Separate context** — agents have no access to the main conversation history. They receive only their system prompt and the task description.
|
|
663
|
-
- **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.
|
|
664
661
|
- **Concurrent** — multiple agents can run simultaneously, each in its own async task.
|
|
665
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.
|
|
666
|
-
- **Timeout** — agents are automatically cancelled after `agent_timeout` seconds (default:
|
|
663
|
+
- **Timeout** — agents are automatically cancelled after `agent_timeout` seconds (default: 600).
|
|
667
664
|
|
|
668
665
|
### Configuring Agents
|
|
669
666
|
|
|
@@ -732,14 +729,14 @@ Each agent field:
|
|
|
732
729
|
|
|
733
730
|
**Via the main LLM (automatic):**
|
|
734
731
|
|
|
735
|
-
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:
|
|
736
733
|
|
|
737
734
|
```
|
|
738
735
|
You: Review the authentication module and write tests for it.
|
|
739
736
|
|
|
740
737
|
LLM: I'll dispatch two agents to handle this in parallel.
|
|
741
|
-
[calls
|
|
742
|
-
[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..."]
|
|
743
740
|
|
|
744
741
|
Both agents are running in the background. I'll incorporate
|
|
745
742
|
their findings when they complete.
|
|
@@ -815,7 +812,7 @@ built-in support; your existing `.ayder/mcp.json` continues to work. The legacy
|
|
|
815
812
|
|
|
816
813
|
## Plugins
|
|
817
814
|
|
|
818
|
-
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:
|
|
819
816
|
|
|
820
817
|
```bash
|
|
821
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 |
|
|
@@ -492,6 +485,7 @@ inside the Ollama summary.
|
|
|
492
485
|
| `Ctrl+L` | Clear chat |
|
|
493
486
|
| `Ctrl+O` | Toggle tool panel |
|
|
494
487
|
| `Ctrl+T` | Toggle thinking/reasoning blocks |
|
|
488
|
+
| `Shift` + drag | Select text with the mouse (Option in iTerm2 and Terminal.app) |
|
|
495
489
|
| `PageUp` / `PageDown` | Scroll chat view |
|
|
496
490
|
| `Tab` | Auto-complete slash commands |
|
|
497
491
|
|
|
@@ -499,7 +493,7 @@ inside the Ollama summary.
|
|
|
499
493
|
|
|
500
494
|
ayder-cli is optimized for both large and small (local) LLMs:
|
|
501
495
|
|
|
502
|
-
- **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.
|
|
503
497
|
- **Tiered Prompts**: Use `prompt = "MINIMAL"` in config for smaller models (7B-14B) to strip complex reasoning frameworks and improve follow-through.
|
|
504
498
|
- **Automatic Context Bounding**: Conversation history is bounded based on `max_history_messages` to prevent context rot.
|
|
505
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.
|
|
@@ -566,23 +560,24 @@ The tool system:
|
|
|
566
560
|
- Supports tag-based filtering for dynamic enable/disable
|
|
567
561
|
- Injects tool-specific system prompts when enabled
|
|
568
562
|
|
|
569
|
-
**Built-in tools (
|
|
563
|
+
**Built-in tools (13):**
|
|
570
564
|
|
|
571
565
|
| Category | Tools |
|
|
572
566
|
|----------|-------|
|
|
573
567
|
| **Filesystem** | `file_explorer`, `read_file`, `file_editor` |
|
|
574
568
|
| **Search** | `search_codebase`, `get_project_structure` |
|
|
575
|
-
| **Shell** | `
|
|
569
|
+
| **Shell** | `bash` |
|
|
576
570
|
| **Context** | `context` (save / load / list / stats / clear session context slots) |
|
|
577
|
-
| **Notes** | `
|
|
578
|
-
| **Background Processes** | `
|
|
579
|
-
| **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) |
|
|
580
575
|
| **Environment** | `manage_environment_vars` |
|
|
581
576
|
| **Web** | `fetch_web` |
|
|
582
577
|
|
|
583
|
-
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)).
|
|
584
579
|
|
|
585
|
-
**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.
|
|
586
581
|
|
|
587
582
|
## Multi-Agent System
|
|
588
583
|
|
|
@@ -593,7 +588,7 @@ ayder-cli supports user-defined **specialized agents**: each agent is an indepen
|
|
|
593
588
|
```
|
|
594
589
|
Main LLM (your conversation)
|
|
595
590
|
│
|
|
596
|
-
├─ calls `
|
|
591
|
+
├─ calls `agent` tool ──────────────────────────────────────┐
|
|
597
592
|
│ OR you type `/agent <name> <task>` │
|
|
598
593
|
│ ▼
|
|
599
594
|
│ AgentRunner (background asyncio task)
|
|
@@ -617,10 +612,10 @@ pre_iteration_hook drains queue
|
|
|
617
612
|
|
|
618
613
|
Key properties:
|
|
619
614
|
- **Separate context** — agents have no access to the main conversation history. They receive only their system prompt and the task description.
|
|
620
|
-
- **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.
|
|
621
616
|
- **Concurrent** — multiple agents can run simultaneously, each in its own async task.
|
|
622
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.
|
|
623
|
-
- **Timeout** — agents are automatically cancelled after `agent_timeout` seconds (default:
|
|
618
|
+
- **Timeout** — agents are automatically cancelled after `agent_timeout` seconds (default: 600).
|
|
624
619
|
|
|
625
620
|
### Configuring Agents
|
|
626
621
|
|
|
@@ -689,14 +684,14 @@ Each agent field:
|
|
|
689
684
|
|
|
690
685
|
**Via the main LLM (automatic):**
|
|
691
686
|
|
|
692
|
-
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:
|
|
693
688
|
|
|
694
689
|
```
|
|
695
690
|
You: Review the authentication module and write tests for it.
|
|
696
691
|
|
|
697
692
|
LLM: I'll dispatch two agents to handle this in parallel.
|
|
698
|
-
[calls
|
|
699
|
-
[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..."]
|
|
700
695
|
|
|
701
696
|
Both agents are running in the background. I'll incorporate
|
|
702
697
|
their findings when they complete.
|
|
@@ -772,7 +767,7 @@ built-in support; your existing `.ayder/mcp.json` continues to work. The legacy
|
|
|
772
767
|
|
|
773
768
|
## Plugins
|
|
774
769
|
|
|
775
|
-
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:
|
|
776
771
|
|
|
777
772
|
```bash
|
|
778
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
|
|
|
@@ -329,11 +328,13 @@ AyderApp (Textual App)
|
|
|
329
328
|
├── CSS (from theme_manager.py)
|
|
330
329
|
├── Compose:
|
|
331
330
|
│ ├── Banner (Static)
|
|
331
|
+
│ ├── ToolPanel (custom widget) ← Tool calls; hidden until Ctrl+O, opens at the top (fixed 10% height)
|
|
332
|
+
│ ├── ThinkingPanel (custom widget) ← Reasoning stream; Ctrl+T, opens at the top (fixed 30% height)
|
|
333
|
+
│ ├── AgentPanel (custom widget) ← Agent runs; Ctrl+G, opens at the top (fixed 10% height)
|
|
332
334
|
│ ├── ChatView (custom widget) ← Messages displayed here
|
|
333
|
-
│ ├── ToolPanel (custom widget) ← Tool calls shown here
|
|
334
335
|
│ ├── ActivityBar (custom widget) ← Status indicators
|
|
335
336
|
│ ├── CLIInputBar (custom widget) ← User input
|
|
336
|
-
│ └── StatusBar (custom widget) ←
|
|
337
|
+
│ └── StatusBar (custom widget) ← Working directory (~ for home, shortened from the left), model, effort, mode, context usage, files
|
|
337
338
|
│
|
|
338
339
|
├── Screens (Modal):
|
|
339
340
|
│ ├── CLIConfirmScreen ← Tool confirmation with diff
|
|
@@ -574,15 +575,15 @@ The TUI module provides a clean, terminal-like interface with:
|
|
|
574
575
|
- Simple text output with prefixes
|
|
575
576
|
- Minimal borders and chrome design
|
|
576
577
|
- Slash command auto-completion
|
|
577
|
-
- Status bar with contextual information
|
|
578
|
-
-
|
|
578
|
+
- Status bar with contextual information, starting with the working directory (home shown as `~`; a long path is shortened from the left to at most a third of the bar, never below `…/<last component>`, regardless of the other items, which may overflow the bar's right edge)
|
|
579
|
+
- Keyboard-first operation, with mouse support enabled
|
|
579
580
|
|
|
580
581
|
It exposes key components like AyderApp, widgets (ChatView, ToolPanel), and screens (CLIConfirmScreen) for building the terminal interface.
|
|
581
582
|
|
|
582
583
|
### TUI Application File Summary (src/ayder_cli/tui/app.py)
|
|
583
584
|
|
|
584
585
|
AyderApp is the main Textual application implementing a chat-style interface:
|
|
585
|
-
- **Layout**:
|
|
586
|
+
- **Layout**: ToolPanel, ThinkingPanel and AgentPanel (hidden by default; they open at the top, above the chat, at a fixed 10% / 30% / 10% of the screen height with their content scrolling inside, and toggling prints no chat message), ChatView, ActivityBar, CLIInputBar, StatusBar
|
|
586
587
|
- **Keybindings**: Ctrl+Q (quit), Ctrl+C/X (cancel), Ctrl+L (clear), Ctrl+O (toggle tools)
|
|
587
588
|
- **Features**:
|
|
588
589
|
- Async processing with worker threads
|
|
@@ -594,7 +595,7 @@ AyderApp is the main Textual application implementing a chat-style interface:
|
|
|
594
595
|
The application manages:
|
|
595
596
|
- LLM provider setup and configuration
|
|
596
597
|
- Tool registry initialization with middleware
|
|
597
|
-
- System prompt construction (base prompt + environment section + tool prompts + skill catalog; no project tree). The environment section (`prompts.build_environment_prompt`) gives the absolute working directory and the session start date and time (ISO 8601, local time with UTC offset). It is built once per session and reused on `/model` rebuilds. A resumed session (`--resume`) restores the provider it last used (the session file stores it; a provider no longer configured falls back to the default with a warning) and its `--system-prompt` text, keeps its history, and rebuilds the system prompt for the current session, so the scratch directory, start time, tool prompts and agent capability prompts are current; `/model` rebuilds keep the capability prompts.
|
|
598
|
+
- System prompt construction (base prompt + environment section + tool prompts + skill catalog; no project tree). The environment section (`prompts.build_environment_prompt`) gives the absolute working directory and the session start date and time (ISO 8601, local time with UTC offset). It also tells the model that replies render as Markdown (paragraphs separated by a blank line, no fixed-width wrapping). It is built once per session and reused on `/model` rebuilds. A resumed session (`--resume`) restores the provider it last used (the session file stores it; a provider no longer configured falls back to the default with a warning) and its `--system-prompt` text, keeps its history, and rebuilds the system prompt for the current session, so the scratch directory, start time, tool prompts and agent capability prompts are current; `/model` rebuilds keep the capability prompts.
|
|
598
599
|
- Process manager for background operations
|
|
599
600
|
|
|
600
601
|
### Chat Loop Summary (src/ayder_cli/loops/chat_loop.py)
|
|
@@ -651,18 +652,21 @@ Schema-driven tool definitions with auto-discovery:
|
|
|
651
652
|
- **Schema generation**: `to_openai_schema()` returns the OpenAI function-calling dict
|
|
652
653
|
- **Plugin loading**: `tools/plugin_manager.py` can augment `TOOL_DEFINITIONS` at runtime from local or GitHub-sourced plugins
|
|
653
654
|
|
|
654
|
-
|
|
655
|
+
13 built-in tools across 10 definition files:
|
|
655
656
|
- Filesystem (3): `file_explorer`, `read_file`, `file_editor`
|
|
656
657
|
- Search (2): `search_codebase`, `get_project_structure`
|
|
657
658
|
- Shell (1): `bash`
|
|
658
|
-
- Context (1): `context`
|
|
659
|
-
- Notes (1): `
|
|
659
|
+
- Context (1): `context` (action=save|load|list|stats|clear)
|
|
660
|
+
- Notes (1): `note` (action=create|read|update|list|delete)
|
|
660
661
|
- Background Process (1): `background_process` (action=start|logs|stop|list|info)
|
|
661
|
-
- Tasks (
|
|
662
|
+
- Tasks (1): `task` (action=create|list|show|status|update_status|update|update_dependencies)
|
|
663
|
+
- Skills (1): `skill` (action=list|load|read|unload)
|
|
662
664
|
- Environment (1): `manage_environment_vars`
|
|
663
665
|
- Web (1): `fetch_web`
|
|
664
666
|
|
|
665
|
-
|
|
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.
|
|
666
670
|
|
|
667
671
|
---
|
|
668
672
|
|