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.
Files changed (249) hide show
  1. ayder_cli-2.1.1/CHANGELOG.md +14 -0
  2. ayder_cli-1.8.3/README.md → ayder_cli-2.1.1/PKG-INFO +73 -12
  3. ayder_cli-1.8.3/PKG-INFO → ayder_cli-2.1.1/README.md +33 -41
  4. ayder_cli-2.1.1/docs/README_AGENT_WORKFLOW.md +132 -0
  5. ayder_cli-2.1.1/docs/config.toml.example +362 -0
  6. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/pyproject.toml +12 -3
  7. ayder_cli-2.1.1/src/ayder_cli/agents/__init__.py +8 -0
  8. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/agents/callbacks.py +1 -1
  9. ayder_cli-2.1.1/src/ayder_cli/agents/registry.py +394 -0
  10. ayder_cli-2.1.1/src/ayder_cli/agents/run.py +58 -0
  11. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/agents/runner.py +53 -46
  12. ayder_cli-2.1.1/src/ayder_cli/agents/tool.py +183 -0
  13. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/application/runtime_factory.py +19 -9
  14. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/cli.py +28 -24
  15. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/cli_runner.py +22 -4
  16. ayder_cli-2.1.1/src/ayder_cli/console.py +26 -0
  17. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/core/config.py +13 -3
  18. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/core/context.py +0 -22
  19. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/core/default_context_manager.py +0 -26
  20. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/prompts.py +114 -0
  21. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/providers/__init__.py +2 -1
  22. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/providers/base.py +28 -2
  23. ayder_cli-2.1.1/src/ayder_cli/providers/orchestrator.py +116 -0
  24. ayder_cli-2.1.1/src/ayder_cli/tools/builtins/notes.py +157 -0
  25. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/tools/builtins/tasks.py +72 -56
  26. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/tools/plugin_manager.py +64 -0
  27. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/tools/registry.py +1 -6
  28. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/tui/__init__.py +13 -3
  29. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/tui/adapter.py +0 -7
  30. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/tui/app.py +212 -141
  31. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/tui/commands.py +236 -148
  32. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/tui/widgets.py +126 -77
  33. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/COVERAGE.md +6 -0
  34. ayder_cli-2.1.1/tests/agents/test_agent_tools.py +85 -0
  35. ayder_cli-2.1.1/tests/agents/test_integration.py +79 -0
  36. ayder_cli-2.1.1/tests/agents/test_registry.py +501 -0
  37. ayder_cli-2.1.1/tests/agents/test_run.py +49 -0
  38. ayder_cli-2.1.1/tests/agents/test_runner.py +197 -0
  39. ayder_cli-2.1.1/tests/agents/test_runner_provider_unavailable.py +31 -0
  40. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/agents/test_tool.py +43 -17
  41. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/application/test_runtime_factory.py +25 -0
  42. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/convergence/test_execution_policy_parity.py +47 -90
  43. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/convergence/test_validation_path.py +41 -86
  44. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/core/test_cache_monitor.py +0 -1
  45. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/core/test_config_v2.py +24 -0
  46. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/core/test_context_manager_factory.py +0 -1
  47. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/core/test_default_context_manager.py +0 -1
  48. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/providers/test_ollama_inspector.py +0 -2
  49. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/providers/test_ollama_native.py +0 -1
  50. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/providers/test_ollama_xml.py +0 -11
  51. ayder_cli-2.1.1/tests/providers/test_orchestrator_capabilities.py +131 -0
  52. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/providers/test_retry_integration.py +0 -1
  53. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/services/test_interaction_sink.py +0 -2
  54. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/test_cli.py +50 -4
  55. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/test_tasks.py +45 -0
  56. ayder_cli-2.1.1/tests/tools/test_agent_notes.py +66 -0
  57. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/tools/test_plugin_loading.py +0 -1
  58. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/tools/test_plugin_manager.py +91 -1
  59. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/tui/test_do_clear_coordination.py +15 -1
  60. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/tui/test_multi_select_screen.py +0 -1
  61. ayder_cli-2.1.1/tests/tui/test_paste.py +131 -0
  62. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/tui/test_pending_compact_consumer.py +3 -9
  63. ayder_cli-2.1.1/tests/tui/test_pull_delivery.py +68 -0
  64. ayder_cli-2.1.1/tests/tui/test_turn_consumer.py +137 -0
  65. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/tui/test_widgets.py +56 -0
  66. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/ui/test_confirm_screen.py +2 -0
  67. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/ui/test_diff_preview.py +0 -2
  68. ayder_cli-2.1.1/tests/ui/test_provider_switch.py +32 -0
  69. ayder_cli-2.1.1/tests/ui/test_run_tui_startup.py +21 -0
  70. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/ui/test_tui_commands_agent.py +3 -3
  71. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/ui/test_tui_commands_provider.py +10 -4
  72. ayder_cli-1.8.3/docs/config.toml.example +0 -313
  73. ayder_cli-1.8.3/src/ayder_cli/agents/__init__.py +0 -8
  74. ayder_cli-1.8.3/src/ayder_cli/agents/registry.py +0 -251
  75. ayder_cli-1.8.3/src/ayder_cli/agents/summary.py +0 -24
  76. ayder_cli-1.8.3/src/ayder_cli/agents/tool.py +0 -92
  77. ayder_cli-1.8.3/src/ayder_cli/console.py +0 -69
  78. ayder_cli-1.8.3/src/ayder_cli/providers/orchestrator.py +0 -46
  79. ayder_cli-1.8.3/src/ayder_cli/tools/builtins/notes.py +0 -79
  80. ayder_cli-1.8.3/tests/agents/test_integration.py +0 -246
  81. ayder_cli-1.8.3/tests/agents/test_registry.py +0 -378
  82. ayder_cli-1.8.3/tests/agents/test_runner.py +0 -143
  83. ayder_cli-1.8.3/tests/agents/test_summary.py +0 -59
  84. ayder_cli-1.8.3/tests/manual_test_verbose.py +0 -111
  85. ayder_cli-1.8.3/tests/tui/test_paste.py +0 -69
  86. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/.github/workflows/ci.yml +0 -0
  87. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/.github/workflows/python-package.yml +0 -0
  88. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/.gitignore +0 -0
  89. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/.python-version +0 -0
  90. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/AGENTS.md +0 -0
  91. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/LICENSE +0 -0
  92. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/docs/PROJECT_STRUCTURE.md +0 -0
  93. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/docs/README_OLLAMA.md +0 -0
  94. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/docs/cc.png +0 -0
  95. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/__init__.py +0 -0
  96. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/__main__.py +0 -0
  97. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/agents/config.py +0 -0
  98. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/application/README.md +0 -0
  99. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/application/__init__.py +0 -0
  100. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/application/execution_policy.py +0 -0
  101. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/application/message_contract.py +0 -0
  102. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/application/validation.py +0 -0
  103. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/cli_callbacks.py +0 -0
  104. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/core/cache_monitor.py +0 -0
  105. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/core/config_migration.py +0 -0
  106. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/core/context_manager.py +0 -0
  107. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/core/context_manager_factory.py +0 -0
  108. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/core/ollama_context_manager.py +0 -0
  109. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/core/result.py +0 -0
  110. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/logging_config.py +0 -0
  111. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/loops/__init__.py +0 -0
  112. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/loops/chat_loop.py +0 -0
  113. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/parser.py +0 -0
  114. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/process_manager.py +0 -0
  115. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/providers/impl/claude.py +0 -0
  116. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/providers/impl/deepseek.py +0 -0
  117. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/providers/impl/gemini.py +0 -0
  118. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/providers/impl/glm.py +0 -0
  119. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/providers/impl/ollama.py +0 -0
  120. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/providers/impl/ollama_drivers/__init__.py +0 -0
  121. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/providers/impl/ollama_drivers/_errors.py +0 -0
  122. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/providers/impl/ollama_drivers/base.py +0 -0
  123. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/providers/impl/ollama_drivers/deepseek.py +0 -0
  124. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/providers/impl/ollama_drivers/generic_native.py +0 -0
  125. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/providers/impl/ollama_drivers/generic_xml.py +0 -0
  126. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/providers/impl/ollama_drivers/matrix.py +0 -0
  127. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/providers/impl/ollama_drivers/minimax.py +0 -0
  128. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/providers/impl/ollama_drivers/qwen3.py +0 -0
  129. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/providers/impl/ollama_drivers/registry.py +0 -0
  130. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/providers/impl/ollama_inspector.py +0 -0
  131. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/providers/impl/openai.py +0 -0
  132. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/providers/impl/qwen.py +0 -0
  133. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/providers/retry.py +0 -0
  134. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/services/__init__.py +0 -0
  135. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/services/interactions.py +0 -0
  136. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/themes/__init__.py +0 -0
  137. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/themes/claude.py +0 -0
  138. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/themes/original.py +0 -0
  139. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/tools/__init__.py +0 -0
  140. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/tools/builtins/__init__.py +0 -0
  141. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/tools/builtins/context.py +0 -0
  142. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/tools/builtins/context_definitions.py +0 -0
  143. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/tools/builtins/filesystem.py +0 -0
  144. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/tools/builtins/filesystem_definitions.py +0 -0
  145. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/tools/builtins/notes_definitions.py +0 -0
  146. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/tools/builtins/process_manager_definitions.py +0 -0
  147. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/tools/builtins/search.py +0 -0
  148. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/tools/builtins/search_definitions.py +0 -0
  149. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/tools/builtins/shell.py +0 -0
  150. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/tools/builtins/shell_definitions.py +0 -0
  151. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/tools/builtins/tasks_definitions.py +0 -0
  152. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/tools/builtins/utils_tools.py +0 -0
  153. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/tools/builtins/utils_tools_definitions.py +0 -0
  154. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/tools/builtins/web.py +0 -0
  155. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/tools/builtins/web_definitions.py +0 -0
  156. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/tools/definition.py +0 -0
  157. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/tools/execution.py +0 -0
  158. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/tools/hooks.py +0 -0
  159. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/tools/normalization.py +0 -0
  160. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/tools/plugin_api.py +0 -0
  161. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/tools/plugin_github.py +0 -0
  162. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/tools/schemas.py +0 -0
  163. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/tools/utils.py +0 -0
  164. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/tui/helpers.py +0 -0
  165. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/tui/keybindings.py +0 -0
  166. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/tui/parser.py +0 -0
  167. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/tui/screens.py +0 -0
  168. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/tui/theme_manager.py +0 -0
  169. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/tui/types.py +0 -0
  170. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/ui.py +0 -0
  171. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/src/ayder_cli/version.py +0 -0
  172. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/__init__.py +0 -0
  173. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/agents/__init__.py +0 -0
  174. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/agents/test_callbacks.py +0 -0
  175. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/agents/test_config.py +0 -0
  176. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/application/test_message_contract.py +0 -0
  177. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/client/test_main.py +0 -0
  178. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/convergence/__init__.py +0 -0
  179. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/convergence/test_runtime_wiring.py +0 -0
  180. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/core/test_config.py +0 -0
  181. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/core/test_config_coverage.py +0 -0
  182. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/core/test_config_migration.py +0 -0
  183. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/core/test_config_retry.py +0 -0
  184. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/core/test_default_context_manager_should_compact.py +0 -0
  185. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/core/test_ollama_context_manager.py +0 -0
  186. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/core/test_ollama_context_manager_cache_monitor.py +0 -0
  187. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/core/test_ollama_context_manager_max_history.py +0 -0
  188. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/core/test_parameter_aliasing.py +0 -0
  189. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/core/test_parser.py +0 -0
  190. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/loops/__init__.py +0 -0
  191. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/loops/test_base.py +0 -0
  192. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/loops/test_chat_loop_hook.py +0 -0
  193. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/loops/test_chat_loop_tool_truncation.py +0 -0
  194. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/providers/__init__.py +0 -0
  195. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/providers/ollama_drivers/__init__.py +0 -0
  196. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/providers/ollama_drivers/test_base.py +0 -0
  197. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/providers/ollama_drivers/test_deepseek.py +0 -0
  198. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/providers/ollama_drivers/test_errors.py +0 -0
  199. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/providers/ollama_drivers/test_fallback.py +0 -0
  200. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/providers/ollama_drivers/test_generic_native.py +0 -0
  201. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/providers/ollama_drivers/test_generic_xml.py +0 -0
  202. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/providers/ollama_drivers/test_matrix.py +0 -0
  203. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/providers/ollama_drivers/test_minimax.py +0 -0
  204. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/providers/ollama_drivers/test_provider_integration.py +0 -0
  205. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/providers/ollama_drivers/test_qwen3.py +0 -0
  206. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/providers/ollama_drivers/test_registry.py +0 -0
  207. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/providers/test_glm_async.py +0 -0
  208. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/providers/test_ollama_xml_autoroute.py +0 -0
  209. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/providers/test_ollama_xml_usage.py +0 -0
  210. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/providers/test_qwen_async.py +0 -0
  211. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/providers/test_retry_classifier.py +0 -0
  212. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/providers/test_retrying_provider.py +0 -0
  213. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/services/test_boundary.py +0 -0
  214. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/test_cli_callbacks.py +0 -0
  215. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/test_context.py +0 -0
  216. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/test_env_manager.py +0 -0
  217. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/test_logging_config.py +0 -0
  218. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/test_notes.py +0 -0
  219. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/test_process_manager.py +0 -0
  220. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/tools/__init__.py +0 -0
  221. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/tools/test_definition_discovery.py +0 -0
  222. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/tools/test_di_injection.py +0 -0
  223. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/tools/test_impl.py +0 -0
  224. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/tools/test_impl_coverage.py +0 -0
  225. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/tools/test_path_security.py +0 -0
  226. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/tools/test_plugin_api.py +0 -0
  227. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/tools/test_plugin_github.py +0 -0
  228. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/tools/test_registry.py +0 -0
  229. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/tools/test_registry_coverage.py +0 -0
  230. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/tools/test_result.py +0 -0
  231. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/tools/test_schemas.py +0 -0
  232. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/tools/test_search_codebase.py +0 -0
  233. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/tools/test_utils.py +0 -0
  234. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/tools/test_web.py +0 -0
  235. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/tui/__init__.py +0 -0
  236. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/tui/test_agent_list_screen.py +0 -0
  237. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/tui/test_follow_mode.py +0 -0
  238. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/tui/test_help_screen.py +0 -0
  239. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/tui/test_keybindings.py +0 -0
  240. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/tui/test_multiline_input.py +0 -0
  241. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/ui/test_tui_assistant_sanitization.py +0 -0
  242. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/ui/test_tui_chat_loop.py +0 -0
  243. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/ui/test_tui_commands_logging.py +0 -0
  244. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/ui/test_tui_helpers.py +0 -0
  245. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/ui/test_tui_temporal_command.py +0 -0
  246. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/ui/test_tui_widgets.py +0 -0
  247. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/ui/test_ui.py +0 -0
  248. {ayder_cli-1.8.3 → ayder_cli-2.1.1}/tests/ui/test_ui_coverage.py +0 -0
  249. {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
  ![ayder](docs/cc.png)
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, Anthropic, Google, and Ollama SDKs all ship with ayder-cli, so every provider works out of the box. The terminal UI is built on Rich and Textual.
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 tool. If you don't have uv in your path, get it from
45
- [Astral uv](https://docs.astral.sh/uv/#highlights)
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
- # or install from PyPI
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 (Anthropic, OpenAI, Gemini)
138
+ ### Cloud providers
81
139
 
82
- The Anthropic, OpenAI, and Google SDKs ship with ayder-cli — no extra installs.
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, gemini
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
  ![ayder](docs/cc.png)
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, Anthropic, Google, and Ollama SDKs all ship with ayder-cli, so every provider works out of the box. The terminal UI is built on Rich and Textual.
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 tool. If you don't have uv in your path, get it from
74
- [Astral uv](https://docs.astral.sh/uv/#highlights)
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
- # or install from PyPI
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 (Anthropic, OpenAI, Gemini)
98
+ ### Cloud providers
110
99
 
111
- The Anthropic, OpenAI, and Google SDKs ship with ayder-cli — no extra installs.
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, gemini
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.