ayder-cli 1.8.3__tar.gz → 2.1.1__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.1.1/CHANGELOG.md +14 -0
- ayder_cli-1.8.3/README.md → ayder_cli-2.1.1/PKG-INFO +73 -12
- ayder_cli-1.8.3/PKG-INFO → ayder_cli-2.1.1/README.md +33 -41
- ayder_cli-2.1.1/docs/README_AGENT_WORKFLOW.md +132 -0
- ayder_cli-2.1.1/docs/config.toml.example +362 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/pyproject.toml +12 -3
- ayder_cli-2.1.1/src/ayder_cli/agents/__init__.py +8 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/agents/callbacks.py +1 -1
- ayder_cli-2.1.1/src/ayder_cli/agents/registry.py +394 -0
- ayder_cli-2.1.1/src/ayder_cli/agents/run.py +58 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/agents/runner.py +53 -46
- ayder_cli-2.1.1/src/ayder_cli/agents/tool.py +183 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/application/runtime_factory.py +19 -9
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/cli.py +28 -24
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/cli_runner.py +22 -4
- ayder_cli-2.1.1/src/ayder_cli/console.py +26 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/core/config.py +13 -3
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/core/context.py +0 -22
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/core/default_context_manager.py +0 -26
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/prompts.py +114 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/providers/__init__.py +2 -1
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/providers/base.py +28 -2
- ayder_cli-2.1.1/src/ayder_cli/providers/orchestrator.py +116 -0
- ayder_cli-2.1.1/src/ayder_cli/tools/builtins/notes.py +157 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/tools/builtins/tasks.py +72 -56
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/tools/plugin_manager.py +64 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/tools/registry.py +1 -6
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/tui/__init__.py +13 -3
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/tui/adapter.py +0 -7
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/tui/app.py +212 -141
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/tui/commands.py +236 -148
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/tui/widgets.py +126 -77
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/COVERAGE.md +6 -0
- ayder_cli-2.1.1/tests/agents/test_agent_tools.py +85 -0
- ayder_cli-2.1.1/tests/agents/test_integration.py +79 -0
- ayder_cli-2.1.1/tests/agents/test_registry.py +501 -0
- ayder_cli-2.1.1/tests/agents/test_run.py +49 -0
- ayder_cli-2.1.1/tests/agents/test_runner.py +197 -0
- ayder_cli-2.1.1/tests/agents/test_runner_provider_unavailable.py +31 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/agents/test_tool.py +43 -17
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/application/test_runtime_factory.py +25 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/convergence/test_execution_policy_parity.py +47 -90
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/convergence/test_validation_path.py +41 -86
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/core/test_cache_monitor.py +0 -1
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/core/test_config_v2.py +24 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/core/test_context_manager_factory.py +0 -1
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/core/test_default_context_manager.py +0 -1
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/providers/test_ollama_inspector.py +0 -2
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/providers/test_ollama_native.py +0 -1
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/providers/test_ollama_xml.py +0 -11
- ayder_cli-2.1.1/tests/providers/test_orchestrator_capabilities.py +131 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/providers/test_retry_integration.py +0 -1
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/services/test_interaction_sink.py +0 -2
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/test_cli.py +50 -4
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/test_tasks.py +45 -0
- ayder_cli-2.1.1/tests/tools/test_agent_notes.py +66 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/tools/test_plugin_loading.py +0 -1
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/tools/test_plugin_manager.py +91 -1
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/tui/test_do_clear_coordination.py +15 -1
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/tui/test_multi_select_screen.py +0 -1
- ayder_cli-2.1.1/tests/tui/test_paste.py +131 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/tui/test_pending_compact_consumer.py +3 -9
- ayder_cli-2.1.1/tests/tui/test_pull_delivery.py +68 -0
- ayder_cli-2.1.1/tests/tui/test_turn_consumer.py +137 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/tui/test_widgets.py +56 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/ui/test_confirm_screen.py +2 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/ui/test_diff_preview.py +0 -2
- ayder_cli-2.1.1/tests/ui/test_provider_switch.py +32 -0
- ayder_cli-2.1.1/tests/ui/test_run_tui_startup.py +21 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/ui/test_tui_commands_agent.py +3 -3
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/ui/test_tui_commands_provider.py +10 -4
- ayder_cli-1.8.3/docs/config.toml.example +0 -313
- ayder_cli-1.8.3/src/ayder_cli/agents/__init__.py +0 -8
- ayder_cli-1.8.3/src/ayder_cli/agents/registry.py +0 -251
- ayder_cli-1.8.3/src/ayder_cli/agents/summary.py +0 -24
- ayder_cli-1.8.3/src/ayder_cli/agents/tool.py +0 -92
- ayder_cli-1.8.3/src/ayder_cli/console.py +0 -69
- ayder_cli-1.8.3/src/ayder_cli/providers/orchestrator.py +0 -46
- ayder_cli-1.8.3/src/ayder_cli/tools/builtins/notes.py +0 -79
- ayder_cli-1.8.3/tests/agents/test_integration.py +0 -246
- ayder_cli-1.8.3/tests/agents/test_registry.py +0 -378
- ayder_cli-1.8.3/tests/agents/test_runner.py +0 -143
- ayder_cli-1.8.3/tests/agents/test_summary.py +0 -59
- ayder_cli-1.8.3/tests/manual_test_verbose.py +0 -111
- ayder_cli-1.8.3/tests/tui/test_paste.py +0 -69
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/.github/workflows/ci.yml +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/.github/workflows/python-package.yml +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/.gitignore +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/.python-version +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/AGENTS.md +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/LICENSE +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/docs/PROJECT_STRUCTURE.md +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/docs/README_OLLAMA.md +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/docs/cc.png +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/__init__.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/__main__.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/agents/config.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/application/README.md +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/application/__init__.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/application/execution_policy.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/application/message_contract.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/application/validation.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/cli_callbacks.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/core/cache_monitor.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/core/config_migration.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/core/context_manager.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/core/context_manager_factory.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/core/ollama_context_manager.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/core/result.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/logging_config.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/loops/__init__.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/loops/chat_loop.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/parser.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/process_manager.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/providers/impl/claude.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/providers/impl/deepseek.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/providers/impl/gemini.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/providers/impl/glm.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/providers/impl/ollama.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/providers/impl/ollama_drivers/__init__.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/providers/impl/ollama_drivers/_errors.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/providers/impl/ollama_drivers/base.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/providers/impl/ollama_drivers/deepseek.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/providers/impl/ollama_drivers/generic_native.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/providers/impl/ollama_drivers/generic_xml.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/providers/impl/ollama_drivers/matrix.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/providers/impl/ollama_drivers/minimax.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/providers/impl/ollama_drivers/qwen3.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/providers/impl/ollama_drivers/registry.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/providers/impl/ollama_inspector.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/providers/impl/openai.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/providers/impl/qwen.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/providers/retry.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/services/__init__.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/services/interactions.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/themes/__init__.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/themes/claude.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/themes/original.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/tools/__init__.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/tools/builtins/__init__.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/tools/builtins/context.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/tools/builtins/context_definitions.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/tools/builtins/filesystem.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/tools/builtins/filesystem_definitions.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/tools/builtins/notes_definitions.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/tools/builtins/process_manager_definitions.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/tools/builtins/search.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/tools/builtins/search_definitions.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/tools/builtins/shell.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/tools/builtins/shell_definitions.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/tools/builtins/tasks_definitions.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/tools/builtins/utils_tools.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/tools/builtins/utils_tools_definitions.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/tools/builtins/web.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/tools/builtins/web_definitions.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/tools/definition.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/tools/execution.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/tools/hooks.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/tools/normalization.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/tools/plugin_api.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/tools/plugin_github.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/tools/schemas.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/tools/utils.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/tui/helpers.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/tui/keybindings.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/tui/parser.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/tui/screens.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/tui/theme_manager.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/tui/types.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/ui.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/version.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/__init__.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/agents/__init__.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/agents/test_callbacks.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/agents/test_config.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/application/test_message_contract.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/client/test_main.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/convergence/__init__.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/convergence/test_runtime_wiring.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/core/test_config.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/core/test_config_coverage.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/core/test_config_migration.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/core/test_config_retry.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/core/test_default_context_manager_should_compact.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/core/test_ollama_context_manager.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/core/test_ollama_context_manager_cache_monitor.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/core/test_ollama_context_manager_max_history.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/core/test_parameter_aliasing.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/core/test_parser.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/loops/__init__.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/loops/test_base.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/loops/test_chat_loop_hook.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/loops/test_chat_loop_tool_truncation.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/providers/__init__.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/providers/ollama_drivers/__init__.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/providers/ollama_drivers/test_base.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/providers/ollama_drivers/test_deepseek.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/providers/ollama_drivers/test_errors.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/providers/ollama_drivers/test_fallback.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/providers/ollama_drivers/test_generic_native.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/providers/ollama_drivers/test_generic_xml.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/providers/ollama_drivers/test_matrix.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/providers/ollama_drivers/test_minimax.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/providers/ollama_drivers/test_provider_integration.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/providers/ollama_drivers/test_qwen3.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/providers/ollama_drivers/test_registry.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/providers/test_glm_async.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/providers/test_ollama_xml_autoroute.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/providers/test_ollama_xml_usage.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/providers/test_qwen_async.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/providers/test_retry_classifier.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/providers/test_retrying_provider.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/services/test_boundary.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/test_cli_callbacks.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/test_context.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/test_env_manager.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/test_logging_config.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/test_notes.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/test_process_manager.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/tools/__init__.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/tools/test_definition_discovery.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/tools/test_di_injection.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/tools/test_impl.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/tools/test_impl_coverage.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/tools/test_path_security.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/tools/test_plugin_api.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/tools/test_plugin_github.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/tools/test_registry.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/tools/test_registry_coverage.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/tools/test_result.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/tools/test_schemas.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/tools/test_search_codebase.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/tools/test_utils.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/tools/test_web.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/tui/__init__.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/tui/test_agent_list_screen.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/tui/test_follow_mode.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/tui/test_help_screen.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/tui/test_keybindings.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/tui/test_multiline_input.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/ui/test_tui_assistant_sanitization.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/ui/test_tui_chat_loop.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/ui/test_tui_commands_logging.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/ui/test_tui_helpers.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/ui/test_tui_temporal_command.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/ui/test_tui_widgets.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/ui/test_ui.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/ui/test_ui_coverage.py +0 -0
- {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/ui/test_ui_verbose.py +0 -0
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
## 2.0.0
|
|
4
|
+
|
|
5
|
+
### Breaking
|
|
6
|
+
- `anthropic` and `google-genai` are no longer installed by default. Install the
|
|
7
|
+
corresponding extra: `pip install ayder-cli[anthropic]` / `[google]`.
|
|
8
|
+
- Default install now ships OpenAI + Ollama (+ DeepSeek, which reuses the OpenAI SDK).
|
|
9
|
+
|
|
10
|
+
### Added
|
|
11
|
+
- Optional extras: `[anthropic]`, `[google]`, `[qwen]`, `[glm]`, `[all]`.
|
|
12
|
+
- Driver names `deepseek`, `qwen`/`dashscope`, `glm`/`zhipu` are now selectable.
|
|
13
|
+
- Selecting an uninstalled driver fails fast with the exact `pip install` command
|
|
14
|
+
and a list of available drivers.
|
|
@@ -1,3 +1,43 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: ayder-cli
|
|
3
|
+
Version: 2.1.1
|
|
4
|
+
Summary: AI agent for any LLMs
|
|
5
|
+
Project-URL: Homepage, https://github.com/ayder/ayder-cli
|
|
6
|
+
Project-URL: Repository, https://github.com/ayder/ayder-cli.git
|
|
7
|
+
Project-URL: Issues, https://github.com/ayder/ayder-cli/issues
|
|
8
|
+
Author-email: Sinan Alyuruk <sinan.alyuruk@gmail.com>
|
|
9
|
+
License: MIT
|
|
10
|
+
License-File: LICENSE
|
|
11
|
+
Keywords: agent,ai,ayder,cli,llm,tui
|
|
12
|
+
Classifier: Environment :: Console
|
|
13
|
+
Classifier: Intended Audience :: Developers
|
|
14
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
15
|
+
Classifier: Programming Language :: Python :: 3
|
|
16
|
+
Requires-Python: >=3.12
|
|
17
|
+
Requires-Dist: httpx
|
|
18
|
+
Requires-Dist: libcst>=1.0.0
|
|
19
|
+
Requires-Dist: loguru
|
|
20
|
+
Requires-Dist: ollama>=0.6.2
|
|
21
|
+
Requires-Dist: openai
|
|
22
|
+
Requires-Dist: python-dotenv>=1.0.0
|
|
23
|
+
Requires-Dist: rich>=13.0.0
|
|
24
|
+
Requires-Dist: textual<9.0.0,>=1.0.0
|
|
25
|
+
Requires-Dist: tiktoken>=0.7.0
|
|
26
|
+
Provides-Extra: all
|
|
27
|
+
Requires-Dist: anthropic; extra == 'all'
|
|
28
|
+
Requires-Dist: dashscope; extra == 'all'
|
|
29
|
+
Requires-Dist: google-genai; extra == 'all'
|
|
30
|
+
Requires-Dist: zhipuai; extra == 'all'
|
|
31
|
+
Provides-Extra: anthropic
|
|
32
|
+
Requires-Dist: anthropic; extra == 'anthropic'
|
|
33
|
+
Provides-Extra: glm
|
|
34
|
+
Requires-Dist: zhipuai; extra == 'glm'
|
|
35
|
+
Provides-Extra: google
|
|
36
|
+
Requires-Dist: google-genai; extra == 'google'
|
|
37
|
+
Provides-Extra: qwen
|
|
38
|
+
Requires-Dist: dashscope; extra == 'qwen'
|
|
39
|
+
Description-Content-Type: text/markdown
|
|
40
|
+
|
|
1
41
|
# ayder-cli
|
|
2
42
|
|
|
3
43
|
A multi-provider AI agent chat client for your terminal. ayder supports Ollama, Anthropic Claude, OpenAI, Gemini,
|
|
@@ -5,6 +45,12 @@ or any OpenAI-compatible API and provides an autonomous coding assistant with fi
|
|
|
5
45
|
|
|
6
46
|

|
|
7
47
|
|
|
48
|
+
## What's New in 2.0
|
|
49
|
+
|
|
50
|
+
Provider SDKs are now **optional**. The core install ships only OpenAI + Ollama (plus DeepSeek, which reuses the OpenAI SDK); Anthropic, Google, Qwen, and GLM are opt-in extras -- install only what you use. Selecting a driver whose package isn't installed fails fast with the exact `pip install` command and a list of the drivers available in your install. See [CHANGELOG.md](CHANGELOG.md) and [Installation](#installation).
|
|
51
|
+
|
|
52
|
+
> **Upgrading from 1.x (breaking):** `anthropic` and `google` are no longer installed by default. Run `pip install ayder-cli[anthropic]` / `[google]` (or `[all]`) if you use them.
|
|
53
|
+
|
|
8
54
|
## Supported LLM providers
|
|
9
55
|
|
|
10
56
|
- [Ollama](https://ollama.com) (local or cloud)
|
|
@@ -25,7 +71,7 @@ Most AI coding assistants require cloud APIs, subscriptions, or heavy IDE plugin
|
|
|
25
71
|
- **Agentic workflow** -- the LLM reads files, edits code, runs shell commands, and iterates autonomously with configurable iteration limits per message.
|
|
26
72
|
- **Multi-agent** -- define specialized sub-agents in `config.toml`. Each agent runs independently with its own LLM, model, and context. Results are injected back into the main conversation when complete.
|
|
27
73
|
- **Textual TUI** -- an inline terminal interface with chat view, tool panel, thinking block toggle, slash command auto-completion, permission toggles, and tool confirmation modals with diff previews.
|
|
28
|
-
- **Batteries included** -- the OpenAI
|
|
74
|
+
- **Batteries included** -- the OpenAI and Ollama SDKs ship with ayder-cli core. Anthropic, Google, Qwen, and GLM are optional extras (install only what you need). The terminal UI is built on Rich and Textual.
|
|
29
75
|
|
|
30
76
|
### Tools
|
|
31
77
|
|
|
@@ -41,17 +87,29 @@ Each tool has an OpenAI-compatible JSON schema so models that support function c
|
|
|
41
87
|
## Installation
|
|
42
88
|
|
|
43
89
|
Requires Python 3.12+.
|
|
44
|
-
Works best with uv
|
|
45
|
-
|
|
90
|
+
Works best with uv. If you don't have uv in your path, get it from
|
|
91
|
+
[Astral uv](https://docs.astral.sh/uv/#highlights).
|
|
92
|
+
|
|
93
|
+
Core install (OpenAI + Ollama, plus DeepSeek which reuses the OpenAI SDK):
|
|
94
|
+
|
|
95
|
+
pip install ayder-cli
|
|
96
|
+
|
|
97
|
+
Optional providers (install only what you use):
|
|
98
|
+
|
|
99
|
+
pip install ayder-cli[anthropic] # Claude
|
|
100
|
+
pip install ayder-cli[google] # Gemini
|
|
101
|
+
pip install ayder-cli[qwen] # Qwen (dashscope)
|
|
102
|
+
pip install ayder-cli[glm] # GLM (zhipuai)
|
|
103
|
+
pip install ayder-cli[all] # everything
|
|
104
|
+
|
|
105
|
+
If you select a driver whose package isn't installed, ayder prints the exact
|
|
106
|
+
install command and lists the drivers available in your install.
|
|
46
107
|
|
|
47
108
|
```bash
|
|
48
|
-
# Install to user environment
|
|
109
|
+
# Install to user environment (uv tool)
|
|
49
110
|
uv tool install ayder-cli
|
|
50
111
|
|
|
51
|
-
#
|
|
52
|
-
pip install ayder-cli
|
|
53
|
-
|
|
54
|
-
# For nightly builds:
|
|
112
|
+
# Or for nightly / development builds:
|
|
55
113
|
git clone https://github.com/ayder/ayder-cli.git
|
|
56
114
|
cd ayder-cli
|
|
57
115
|
|
|
@@ -77,16 +135,19 @@ export OLLAMA_FLASH_ATTENTION=true
|
|
|
77
135
|
export OLLAMA_MAX_LOADED_MODELS=1
|
|
78
136
|
```
|
|
79
137
|
|
|
80
|
-
### Cloud providers
|
|
138
|
+
### Cloud providers
|
|
81
139
|
|
|
82
|
-
|
|
83
|
-
Just add an API key to a profile in `~/.ayder/config.toml` (see Configuration
|
|
140
|
+
Add an API key to a profile in `~/.ayder/config.toml` (see Configuration
|
|
84
141
|
below) and switch provider in the TUI:
|
|
85
142
|
|
|
86
143
|
```bash
|
|
87
|
-
/provider anthropic # or: openai,
|
|
144
|
+
/provider anthropic # or: openai, google, deepseek, qwen, glm
|
|
88
145
|
```
|
|
89
146
|
|
|
147
|
+
Note: `anthropic` and `google` require the corresponding optional extra
|
|
148
|
+
(see Installation above). `openai`, `ollama`, and `deepseek` are included
|
|
149
|
+
in the core install.
|
|
150
|
+
|
|
90
151
|
### Configuration: Profiles and Drivers
|
|
91
152
|
|
|
92
153
|
ayder-cli uses a flexible profile-based configuration system. On the first run, it creates a config file at `~/.ayder/config.toml`.
|
|
@@ -1,32 +1,3 @@
|
|
|
1
|
-
Metadata-Version: 2.4
|
|
2
|
-
Name: ayder-cli
|
|
3
|
-
Version: 1.8.3
|
|
4
|
-
Summary: AI agent for any LLMs
|
|
5
|
-
Project-URL: Homepage, https://github.com/ayder/ayder-cli
|
|
6
|
-
Project-URL: Repository, https://github.com/ayder/ayder-cli.git
|
|
7
|
-
Project-URL: Issues, https://github.com/ayder/ayder-cli/issues
|
|
8
|
-
Author-email: Sinan Alyuruk <sinan.alyuruk@gmail.com>
|
|
9
|
-
License: MIT
|
|
10
|
-
License-File: LICENSE
|
|
11
|
-
Keywords: agent,ai,ayder,cli,llm,tui
|
|
12
|
-
Classifier: Environment :: Console
|
|
13
|
-
Classifier: Intended Audience :: Developers
|
|
14
|
-
Classifier: License :: OSI Approved :: MIT License
|
|
15
|
-
Classifier: Programming Language :: Python :: 3
|
|
16
|
-
Requires-Python: >=3.12
|
|
17
|
-
Requires-Dist: anthropic
|
|
18
|
-
Requires-Dist: google-genai
|
|
19
|
-
Requires-Dist: httpx
|
|
20
|
-
Requires-Dist: libcst>=1.0.0
|
|
21
|
-
Requires-Dist: loguru
|
|
22
|
-
Requires-Dist: ollama>=0.6.2
|
|
23
|
-
Requires-Dist: openai
|
|
24
|
-
Requires-Dist: python-dotenv>=1.0.0
|
|
25
|
-
Requires-Dist: rich>=13.0.0
|
|
26
|
-
Requires-Dist: textual<9.0.0,>=1.0.0
|
|
27
|
-
Requires-Dist: tiktoken>=0.7.0
|
|
28
|
-
Description-Content-Type: text/markdown
|
|
29
|
-
|
|
30
1
|
# ayder-cli
|
|
31
2
|
|
|
32
3
|
A multi-provider AI agent chat client for your terminal. ayder supports Ollama, Anthropic Claude, OpenAI, Gemini,
|
|
@@ -34,6 +5,12 @@ or any OpenAI-compatible API and provides an autonomous coding assistant with fi
|
|
|
34
5
|
|
|
35
6
|

|
|
36
7
|
|
|
8
|
+
## What's New in 2.0
|
|
9
|
+
|
|
10
|
+
Provider SDKs are now **optional**. The core install ships only OpenAI + Ollama (plus DeepSeek, which reuses the OpenAI SDK); Anthropic, Google, Qwen, and GLM are opt-in extras -- install only what you use. Selecting a driver whose package isn't installed fails fast with the exact `pip install` command and a list of the drivers available in your install. See [CHANGELOG.md](CHANGELOG.md) and [Installation](#installation).
|
|
11
|
+
|
|
12
|
+
> **Upgrading from 1.x (breaking):** `anthropic` and `google` are no longer installed by default. Run `pip install ayder-cli[anthropic]` / `[google]` (or `[all]`) if you use them.
|
|
13
|
+
|
|
37
14
|
## Supported LLM providers
|
|
38
15
|
|
|
39
16
|
- [Ollama](https://ollama.com) (local or cloud)
|
|
@@ -54,7 +31,7 @@ Most AI coding assistants require cloud APIs, subscriptions, or heavy IDE plugin
|
|
|
54
31
|
- **Agentic workflow** -- the LLM reads files, edits code, runs shell commands, and iterates autonomously with configurable iteration limits per message.
|
|
55
32
|
- **Multi-agent** -- define specialized sub-agents in `config.toml`. Each agent runs independently with its own LLM, model, and context. Results are injected back into the main conversation when complete.
|
|
56
33
|
- **Textual TUI** -- an inline terminal interface with chat view, tool panel, thinking block toggle, slash command auto-completion, permission toggles, and tool confirmation modals with diff previews.
|
|
57
|
-
- **Batteries included** -- the OpenAI
|
|
34
|
+
- **Batteries included** -- the OpenAI and Ollama SDKs ship with ayder-cli core. Anthropic, Google, Qwen, and GLM are optional extras (install only what you need). The terminal UI is built on Rich and Textual.
|
|
58
35
|
|
|
59
36
|
### Tools
|
|
60
37
|
|
|
@@ -70,17 +47,29 @@ Each tool has an OpenAI-compatible JSON schema so models that support function c
|
|
|
70
47
|
## Installation
|
|
71
48
|
|
|
72
49
|
Requires Python 3.12+.
|
|
73
|
-
Works best with uv
|
|
74
|
-
|
|
50
|
+
Works best with uv. If you don't have uv in your path, get it from
|
|
51
|
+
[Astral uv](https://docs.astral.sh/uv/#highlights).
|
|
52
|
+
|
|
53
|
+
Core install (OpenAI + Ollama, plus DeepSeek which reuses the OpenAI SDK):
|
|
54
|
+
|
|
55
|
+
pip install ayder-cli
|
|
56
|
+
|
|
57
|
+
Optional providers (install only what you use):
|
|
58
|
+
|
|
59
|
+
pip install ayder-cli[anthropic] # Claude
|
|
60
|
+
pip install ayder-cli[google] # Gemini
|
|
61
|
+
pip install ayder-cli[qwen] # Qwen (dashscope)
|
|
62
|
+
pip install ayder-cli[glm] # GLM (zhipuai)
|
|
63
|
+
pip install ayder-cli[all] # everything
|
|
64
|
+
|
|
65
|
+
If you select a driver whose package isn't installed, ayder prints the exact
|
|
66
|
+
install command and lists the drivers available in your install.
|
|
75
67
|
|
|
76
68
|
```bash
|
|
77
|
-
# Install to user environment
|
|
69
|
+
# Install to user environment (uv tool)
|
|
78
70
|
uv tool install ayder-cli
|
|
79
71
|
|
|
80
|
-
#
|
|
81
|
-
pip install ayder-cli
|
|
82
|
-
|
|
83
|
-
# For nightly builds:
|
|
72
|
+
# Or for nightly / development builds:
|
|
84
73
|
git clone https://github.com/ayder/ayder-cli.git
|
|
85
74
|
cd ayder-cli
|
|
86
75
|
|
|
@@ -106,16 +95,19 @@ export OLLAMA_FLASH_ATTENTION=true
|
|
|
106
95
|
export OLLAMA_MAX_LOADED_MODELS=1
|
|
107
96
|
```
|
|
108
97
|
|
|
109
|
-
### Cloud providers
|
|
98
|
+
### Cloud providers
|
|
110
99
|
|
|
111
|
-
|
|
112
|
-
Just add an API key to a profile in `~/.ayder/config.toml` (see Configuration
|
|
100
|
+
Add an API key to a profile in `~/.ayder/config.toml` (see Configuration
|
|
113
101
|
below) and switch provider in the TUI:
|
|
114
102
|
|
|
115
103
|
```bash
|
|
116
|
-
/provider anthropic # or: openai,
|
|
104
|
+
/provider anthropic # or: openai, google, deepseek, qwen, glm
|
|
117
105
|
```
|
|
118
106
|
|
|
107
|
+
Note: `anthropic` and `google` require the corresponding optional extra
|
|
108
|
+
(see Installation above). `openai`, `ollama`, and `deepseek` are included
|
|
109
|
+
in the core install.
|
|
110
|
+
|
|
119
111
|
### Configuration: Profiles and Drivers
|
|
120
112
|
|
|
121
113
|
ayder-cli uses a flexible profile-based configuration system. On the first run, it creates a config file at `~/.ayder/config.toml`.
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
## Domain
|
|
2
|
+
Driving the multi-agent software-delivery harness defined in `config.toml.example`:
|
|
3
|
+
a 9-role pipeline (spec → review → plan → review → task-split → task-review →
|
|
4
|
+
build → QA → review → gate). After the plan is approved, the **architect** splits
|
|
5
|
+
it into task files in `.ayder/tasks/` (the same format `/plan` produces) and
|
|
6
|
+
**architect_review** checks the task set, so the user can follow the queue with
|
|
7
|
+
`/tasks`; parallel builders are isolated by git branches and the gate agent
|
|
8
|
+
collects and merges. This skill tells YOU — the main orchestrator LLM — how to run it.
|
|
9
|
+
|
|
10
|
+
## Trigger
|
|
11
|
+
A non-trivial software task ("build / implement / add feature X") where the
|
|
12
|
+
configured agents (`pm_spec`, `pm_review`, `architect`, `architect_review`,
|
|
13
|
+
`senior_coder`, `qa_engineer`, `junior_coder`, `code_reviewer`, `acceptance_gate`)
|
|
14
|
+
are available. For tiny one-file edits, just do it yourself — don't spin up the harness.
|
|
15
|
+
|
|
16
|
+
## Guidelines
|
|
17
|
+
|
|
18
|
+
You are the **orchestrator**. You do not write the feature yourself — you dispatch
|
|
19
|
+
specialist agents, pass each one the right context, and move work through the
|
|
20
|
+
pipeline. Keep your own messages short; let the agents do the heavy lifting.
|
|
21
|
+
|
|
22
|
+
### How to talk to an agent
|
|
23
|
+
- `call_agent("<name>", task=…, task_id=…, branch_name=…)` → returns a **run id**
|
|
24
|
+
immediately. It does not block. Only `name` is required.
|
|
25
|
+
- Dispatch independent tasks together (several `call_agent` calls), then poll
|
|
26
|
+
`agent_status()` to see what is `working` vs `done`.
|
|
27
|
+
- Collect a finished one with `read_agent_result(<run_id>)`, or wait for a slow one
|
|
28
|
+
with `read_agent_result(<run_id>, wait=true, timeout_s=…)`.
|
|
29
|
+
- Each agent only sees the prompt you give it. **For task-file work, pass
|
|
30
|
+
`task_id="TASK-NNN"` and `branch_name="agent/<slug>"`** — the harness resolves the
|
|
31
|
+
id, **fails fast** if it doesn't exist, and embeds the task file itself in the
|
|
32
|
+
agent's prompt. Do **not** read the task file and paste its body into `task`; use
|
|
33
|
+
`task` only for extra steering (or as the whole instruction when there's no file).
|
|
34
|
+
- **Don't write notes or summaries yourself.** Every agent auto-saves its full
|
|
35
|
+
deliverable to `.ayder/notes/`; collect it with `read_agent_result` (or `read_file`
|
|
36
|
+
its `note_path`). Re-summarizing an agent's output into your own note is wasted work.
|
|
37
|
+
- **Give pointers, not pasted content.** Agents share the working tree and have
|
|
38
|
+
shell/read/search tools — they run their own `git diff` and read their own files.
|
|
39
|
+
Hand a reviewer/QA/gate agent the branch, the base ref, the task id(s), and the
|
|
40
|
+
paths; do **not** read source or diffs and paste them into `task`. Pasting wastes
|
|
41
|
+
your context and is exactly what makes a review/QA dispatch stall.
|
|
42
|
+
- **Never dispatch an empty task.** Every `call_agent` must carry a concrete
|
|
43
|
+
instruction — a non-empty `task` and/or a `task_id` that resolves to a task file.
|
|
44
|
+
If neither carries real content, you are not ready to dispatch — fix that first.
|
|
45
|
+
|
|
46
|
+
### The pipeline (run in order)
|
|
47
|
+
|
|
48
|
+
1. **Branch off.** Create one integration branch for the feature:
|
|
49
|
+
`git switch -c feat/<slug>`. All harness work happens off this branch; `main`
|
|
50
|
+
is only touched by the final merge.
|
|
51
|
+
2. **Spec.** `pm_spec` writes the spec + acceptance criteria → `pm_review` checks it.
|
|
52
|
+
Loop until `pm_review` returns `VERDICT: APPROVED`.
|
|
53
|
+
3. **Plan.** `architect` turns the approved spec into a development plan →
|
|
54
|
+
`architect_review` checks it. Loop until `VERDICT: APPROVED`. The plan marks
|
|
55
|
+
which tasks are **parallel** and which are small/low-risk.
|
|
56
|
+
4. **Task split (delegate it — don't split the work yourself).** Ask the
|
|
57
|
+
`architect` to break the **approved plan** into task files in `.ayder/tasks/`,
|
|
58
|
+
one file per task, exactly like `/plan`. Hand it this format to `write_file`:
|
|
59
|
+
- Name each file `.ayder/tasks/TASK-<NNN>-<slug>.md` (zero-padded NNN;
|
|
60
|
+
`list_tasks` first, then increment past the highest existing number).
|
|
61
|
+
- Begin every file with this exact header, then the task in PRD form with its
|
|
62
|
+
acceptance criteria, the files it touches, and its `agent/<slug>` branch:
|
|
63
|
+
```
|
|
64
|
+
## Signature
|
|
65
|
+
- **ID:** TASK-<NNN>
|
|
66
|
+
- **Status:** pending
|
|
67
|
+
- **Created:** <YYYY-MM-DD HH:MM:SS>
|
|
68
|
+
```
|
|
69
|
+
5. **Task review.** `architect_review` checks the **whole task set against the
|
|
70
|
+
approved plan**: full coverage (every plan item maps to a task), no scope
|
|
71
|
+
creep, correct sizing/sequencing, consistent interfaces across tasks. Loop
|
|
72
|
+
split↔review until `VERDICT: APPROVED`. The user can now follow the queue with
|
|
73
|
+
`/tasks` (○ pending · ◐ in_progress · ✓ done).
|
|
74
|
+
6. **Delegate (isolated — see git rules below).** Work the queue task by task:
|
|
75
|
+
- Flip the task's `**Status:**` to `in_progress`, then dispatch it with
|
|
76
|
+
`call_agent("senior_coder", task_id="TASK-NNN", branch_name="agent/<slug>")`
|
|
77
|
+
(small, low-risk tasks → the single `junior_coder`, one at a time). The harness
|
|
78
|
+
hands the agent the task file and the branch directive — you don't paste the
|
|
79
|
+
task body. Each agent commits only to its own branch.
|
|
80
|
+
- When you collect and accept the result, flip the task's `**Status:**` to `done`.
|
|
81
|
+
Update a status by rewriting the task file's `**Status:**` line (read it with
|
|
82
|
+
`show_task`, write it back with `write_file`). This keeps `/tasks` accurate so
|
|
83
|
+
the user always sees what is queued, in flight, and finished.
|
|
84
|
+
7. **QA.** `qa_engineer` writes and runs the test suite, reports real pass/fail output.
|
|
85
|
+
Give it the branch + task ids; it reads the code and runs the tests itself.
|
|
86
|
+
8. **Review.** Tell `code_reviewer` WHERE, not the diff — the branch, the base ref, and
|
|
87
|
+
the task ids (e.g. "review `feat/x` vs `main` for TASK-003..007; run `git diff` yourself").
|
|
88
|
+
It gathers the diff and reads the files from the working tree. Send `CHANGES REQUIRED`
|
|
89
|
+
findings back to the coder, then re-review.
|
|
90
|
+
9. **Gate + merge.** `acceptance_gate` collects the approved branches, merges them
|
|
91
|
+
into `feat/<slug>`, resolves conflicts, runs the full suite, and checks every
|
|
92
|
+
acceptance criterion. `GATE: PASS` → merge `feat/<slug>` into `main`.
|
|
93
|
+
`GATE: FAIL` → send the failing criteria back to the relevant stage.
|
|
94
|
+
|
|
95
|
+
### Git rules — so agents don't step on each other
|
|
96
|
+
|
|
97
|
+
The agents share one working directory, so two builders editing at once will
|
|
98
|
+
collide. Isolate them with git:
|
|
99
|
+
|
|
100
|
+
- **One branch per task.** Name them `agent/<task-slug>`, branched off `feat/<slug>`.
|
|
101
|
+
- **For true parallel builds, give each builder its own worktree** (a separate
|
|
102
|
+
folder) so their files never touch:
|
|
103
|
+
```bash
|
|
104
|
+
git worktree add .ayder/worktrees/<task-slug> -b agent/<task-slug> feat/<slug>
|
|
105
|
+
```
|
|
106
|
+
Tell the builder to work in that folder. If you'd rather keep it simple, skip
|
|
107
|
+
worktrees and run the builders **one at a time** on their branches instead.
|
|
108
|
+
- **Builders commit only to their own branch.** They never touch `main`, `feat/<slug>`,
|
|
109
|
+
or another agent's branch.
|
|
110
|
+
- **Only the gate merges.** It integrates branches in dependency order:
|
|
111
|
+
```bash
|
|
112
|
+
git switch feat/<slug>
|
|
113
|
+
git merge --no-ff agent/<task-slug> # repeat per approved branch; resolve conflicts
|
|
114
|
+
# run the full suite + acceptance checks, then:
|
|
115
|
+
git switch main && git merge --no-ff feat/<slug>
|
|
116
|
+
git worktree remove .ayder/worktrees/<task-slug> # clean up
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
### Simple rules to keep it on the rails
|
|
120
|
+
- Don't skip a review gate. `pm_review`, `architect_review`, and `code_reviewer`
|
|
121
|
+
exist to catch problems early — loop until each approves.
|
|
122
|
+
- Keep `junior_coder` to **one instance at a time** (local memory limit). Don't fan it out.
|
|
123
|
+
- Keep task statuses current: `pending` → `in_progress` (on dispatch) → `done`
|
|
124
|
+
(on accepted result), so `/tasks` always reflects reality for the user.
|
|
125
|
+
- Never call an agent with an empty task string — no concrete task, no dispatch.
|
|
126
|
+
- A reviewer is always a different model family than the author it checks — trust
|
|
127
|
+
that independent second opinion; don't override it without a reason.
|
|
128
|
+
- If an agent fails or times out, handle that task yourself or hand it to a
|
|
129
|
+
`senior_coder` — don't re-dispatch the same failed agent in a loop.
|
|
130
|
+
- Tell the user the verdict at each gate; don't merge to `main` until `GATE: PASS`.
|
|
131
|
+
|
|
132
|
+
See `config.toml.example` for which model backs each role and why.
|