ayder-cli 2.0.0__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 (247) hide show
  1. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/PKG-INFO +1 -1
  2. ayder_cli-2.1.1/docs/README_AGENT_WORKFLOW.md +132 -0
  3. ayder_cli-2.1.1/docs/config.toml.example +362 -0
  4. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/pyproject.toml +1 -1
  5. ayder_cli-2.1.1/src/ayder_cli/agents/__init__.py +8 -0
  6. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/src/ayder_cli/agents/callbacks.py +1 -1
  7. ayder_cli-2.1.1/src/ayder_cli/agents/registry.py +394 -0
  8. ayder_cli-2.1.1/src/ayder_cli/agents/run.py +58 -0
  9. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/src/ayder_cli/agents/runner.py +53 -46
  10. ayder_cli-2.1.1/src/ayder_cli/agents/tool.py +183 -0
  11. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/src/ayder_cli/application/runtime_factory.py +19 -9
  12. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/src/ayder_cli/cli.py +28 -24
  13. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/src/ayder_cli/cli_runner.py +18 -4
  14. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/src/ayder_cli/prompts.py +114 -0
  15. ayder_cli-2.1.1/src/ayder_cli/tools/builtins/notes.py +157 -0
  16. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/src/ayder_cli/tools/builtins/tasks.py +74 -34
  17. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/src/ayder_cli/tools/plugin_manager.py +64 -0
  18. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/src/ayder_cli/tui/__init__.py +5 -1
  19. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/src/ayder_cli/tui/app.py +212 -141
  20. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/src/ayder_cli/tui/commands.py +228 -137
  21. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/src/ayder_cli/tui/widgets.py +67 -12
  22. ayder_cli-2.1.1/tests/agents/test_agent_tools.py +85 -0
  23. ayder_cli-2.1.1/tests/agents/test_integration.py +79 -0
  24. ayder_cli-2.1.1/tests/agents/test_registry.py +501 -0
  25. ayder_cli-2.1.1/tests/agents/test_run.py +49 -0
  26. ayder_cli-2.1.1/tests/agents/test_runner.py +197 -0
  27. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/tests/agents/test_tool.py +43 -17
  28. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/tests/application/test_runtime_factory.py +25 -0
  29. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/tests/test_cli.py +50 -4
  30. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/tests/test_tasks.py +45 -0
  31. ayder_cli-2.1.1/tests/tools/test_agent_notes.py +66 -0
  32. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/tests/tools/test_plugin_manager.py +91 -1
  33. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/tests/tui/test_do_clear_coordination.py +15 -1
  34. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/tests/tui/test_pending_compact_consumer.py +3 -9
  35. ayder_cli-2.1.1/tests/tui/test_pull_delivery.py +68 -0
  36. ayder_cli-2.1.1/tests/tui/test_turn_consumer.py +137 -0
  37. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/tests/tui/test_widgets.py +56 -0
  38. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/tests/ui/test_confirm_screen.py +2 -0
  39. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/tests/ui/test_tui_commands_agent.py +3 -3
  40. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/tests/ui/test_tui_commands_provider.py +6 -0
  41. ayder_cli-2.0.0/docs/config.toml.example +0 -314
  42. ayder_cli-2.0.0/docs/superpowers/plans/2026-06-02-optional-provider-deps.md +0 -879
  43. ayder_cli-2.0.0/docs/superpowers/specs/2026-06-02-optional-provider-deps-design.md +0 -271
  44. ayder_cli-2.0.0/src/ayder_cli/agents/__init__.py +0 -8
  45. ayder_cli-2.0.0/src/ayder_cli/agents/registry.py +0 -251
  46. ayder_cli-2.0.0/src/ayder_cli/agents/summary.py +0 -24
  47. ayder_cli-2.0.0/src/ayder_cli/agents/tool.py +0 -92
  48. ayder_cli-2.0.0/src/ayder_cli/tools/builtins/notes.py +0 -79
  49. ayder_cli-2.0.0/tests/agents/test_integration.py +0 -246
  50. ayder_cli-2.0.0/tests/agents/test_registry.py +0 -378
  51. ayder_cli-2.0.0/tests/agents/test_runner.py +0 -143
  52. ayder_cli-2.0.0/tests/agents/test_summary.py +0 -59
  53. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/.github/workflows/ci.yml +0 -0
  54. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/.github/workflows/python-package.yml +0 -0
  55. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/.gitignore +0 -0
  56. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/.python-version +0 -0
  57. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/AGENTS.md +0 -0
  58. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/CHANGELOG.md +0 -0
  59. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/LICENSE +0 -0
  60. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/README.md +0 -0
  61. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/docs/PROJECT_STRUCTURE.md +0 -0
  62. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/docs/README_OLLAMA.md +0 -0
  63. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/docs/cc.png +0 -0
  64. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/src/ayder_cli/__init__.py +0 -0
  65. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/src/ayder_cli/__main__.py +0 -0
  66. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/src/ayder_cli/agents/config.py +0 -0
  67. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/src/ayder_cli/application/README.md +0 -0
  68. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/src/ayder_cli/application/__init__.py +0 -0
  69. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/src/ayder_cli/application/execution_policy.py +0 -0
  70. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/src/ayder_cli/application/message_contract.py +0 -0
  71. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/src/ayder_cli/application/validation.py +0 -0
  72. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/src/ayder_cli/cli_callbacks.py +0 -0
  73. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/src/ayder_cli/console.py +0 -0
  74. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/src/ayder_cli/core/cache_monitor.py +0 -0
  75. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/src/ayder_cli/core/config.py +0 -0
  76. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/src/ayder_cli/core/config_migration.py +0 -0
  77. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/src/ayder_cli/core/context.py +0 -0
  78. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/src/ayder_cli/core/context_manager.py +0 -0
  79. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/src/ayder_cli/core/context_manager_factory.py +0 -0
  80. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/src/ayder_cli/core/default_context_manager.py +0 -0
  81. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/src/ayder_cli/core/ollama_context_manager.py +0 -0
  82. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/src/ayder_cli/core/result.py +0 -0
  83. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/src/ayder_cli/logging_config.py +0 -0
  84. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/src/ayder_cli/loops/__init__.py +0 -0
  85. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/src/ayder_cli/loops/chat_loop.py +0 -0
  86. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/src/ayder_cli/parser.py +0 -0
  87. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/src/ayder_cli/process_manager.py +0 -0
  88. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/src/ayder_cli/providers/__init__.py +0 -0
  89. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/src/ayder_cli/providers/base.py +0 -0
  90. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/src/ayder_cli/providers/impl/claude.py +0 -0
  91. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/src/ayder_cli/providers/impl/deepseek.py +0 -0
  92. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/src/ayder_cli/providers/impl/gemini.py +0 -0
  93. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/src/ayder_cli/providers/impl/glm.py +0 -0
  94. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/src/ayder_cli/providers/impl/ollama.py +0 -0
  95. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/src/ayder_cli/providers/impl/ollama_drivers/__init__.py +0 -0
  96. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/src/ayder_cli/providers/impl/ollama_drivers/_errors.py +0 -0
  97. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/src/ayder_cli/providers/impl/ollama_drivers/base.py +0 -0
  98. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/src/ayder_cli/providers/impl/ollama_drivers/deepseek.py +0 -0
  99. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/src/ayder_cli/providers/impl/ollama_drivers/generic_native.py +0 -0
  100. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/src/ayder_cli/providers/impl/ollama_drivers/generic_xml.py +0 -0
  101. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/src/ayder_cli/providers/impl/ollama_drivers/matrix.py +0 -0
  102. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/src/ayder_cli/providers/impl/ollama_drivers/minimax.py +0 -0
  103. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/src/ayder_cli/providers/impl/ollama_drivers/qwen3.py +0 -0
  104. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/src/ayder_cli/providers/impl/ollama_drivers/registry.py +0 -0
  105. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/src/ayder_cli/providers/impl/ollama_inspector.py +0 -0
  106. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/src/ayder_cli/providers/impl/openai.py +0 -0
  107. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/src/ayder_cli/providers/impl/qwen.py +0 -0
  108. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/src/ayder_cli/providers/orchestrator.py +0 -0
  109. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/src/ayder_cli/providers/retry.py +0 -0
  110. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/src/ayder_cli/services/__init__.py +0 -0
  111. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/src/ayder_cli/services/interactions.py +0 -0
  112. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/src/ayder_cli/themes/__init__.py +0 -0
  113. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/src/ayder_cli/themes/claude.py +0 -0
  114. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/src/ayder_cli/themes/original.py +0 -0
  115. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/src/ayder_cli/tools/__init__.py +0 -0
  116. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/src/ayder_cli/tools/builtins/__init__.py +0 -0
  117. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/src/ayder_cli/tools/builtins/context.py +0 -0
  118. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/src/ayder_cli/tools/builtins/context_definitions.py +0 -0
  119. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/src/ayder_cli/tools/builtins/filesystem.py +0 -0
  120. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/src/ayder_cli/tools/builtins/filesystem_definitions.py +0 -0
  121. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/src/ayder_cli/tools/builtins/notes_definitions.py +0 -0
  122. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/src/ayder_cli/tools/builtins/process_manager_definitions.py +0 -0
  123. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/src/ayder_cli/tools/builtins/search.py +0 -0
  124. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/src/ayder_cli/tools/builtins/search_definitions.py +0 -0
  125. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/src/ayder_cli/tools/builtins/shell.py +0 -0
  126. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/src/ayder_cli/tools/builtins/shell_definitions.py +0 -0
  127. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/src/ayder_cli/tools/builtins/tasks_definitions.py +0 -0
  128. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/src/ayder_cli/tools/builtins/utils_tools.py +0 -0
  129. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/src/ayder_cli/tools/builtins/utils_tools_definitions.py +0 -0
  130. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/src/ayder_cli/tools/builtins/web.py +0 -0
  131. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/src/ayder_cli/tools/builtins/web_definitions.py +0 -0
  132. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/src/ayder_cli/tools/definition.py +0 -0
  133. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/src/ayder_cli/tools/execution.py +0 -0
  134. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/src/ayder_cli/tools/hooks.py +0 -0
  135. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/src/ayder_cli/tools/normalization.py +0 -0
  136. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/src/ayder_cli/tools/plugin_api.py +0 -0
  137. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/src/ayder_cli/tools/plugin_github.py +0 -0
  138. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/src/ayder_cli/tools/registry.py +0 -0
  139. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/src/ayder_cli/tools/schemas.py +0 -0
  140. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/src/ayder_cli/tools/utils.py +0 -0
  141. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/src/ayder_cli/tui/adapter.py +0 -0
  142. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/src/ayder_cli/tui/helpers.py +0 -0
  143. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/src/ayder_cli/tui/keybindings.py +0 -0
  144. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/src/ayder_cli/tui/parser.py +0 -0
  145. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/src/ayder_cli/tui/screens.py +0 -0
  146. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/src/ayder_cli/tui/theme_manager.py +0 -0
  147. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/src/ayder_cli/tui/types.py +0 -0
  148. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/src/ayder_cli/ui.py +0 -0
  149. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/src/ayder_cli/version.py +0 -0
  150. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/tests/COVERAGE.md +0 -0
  151. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/tests/__init__.py +0 -0
  152. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/tests/agents/__init__.py +0 -0
  153. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/tests/agents/test_callbacks.py +0 -0
  154. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/tests/agents/test_config.py +0 -0
  155. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/tests/agents/test_runner_provider_unavailable.py +0 -0
  156. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/tests/application/test_message_contract.py +0 -0
  157. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/tests/client/test_main.py +0 -0
  158. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/tests/convergence/__init__.py +0 -0
  159. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/tests/convergence/test_execution_policy_parity.py +0 -0
  160. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/tests/convergence/test_runtime_wiring.py +0 -0
  161. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/tests/convergence/test_validation_path.py +0 -0
  162. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/tests/core/test_cache_monitor.py +0 -0
  163. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/tests/core/test_config.py +0 -0
  164. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/tests/core/test_config_coverage.py +0 -0
  165. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/tests/core/test_config_migration.py +0 -0
  166. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/tests/core/test_config_retry.py +0 -0
  167. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/tests/core/test_config_v2.py +0 -0
  168. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/tests/core/test_context_manager_factory.py +0 -0
  169. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/tests/core/test_default_context_manager.py +0 -0
  170. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/tests/core/test_default_context_manager_should_compact.py +0 -0
  171. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/tests/core/test_ollama_context_manager.py +0 -0
  172. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/tests/core/test_ollama_context_manager_cache_monitor.py +0 -0
  173. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/tests/core/test_ollama_context_manager_max_history.py +0 -0
  174. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/tests/core/test_parameter_aliasing.py +0 -0
  175. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/tests/core/test_parser.py +0 -0
  176. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/tests/loops/__init__.py +0 -0
  177. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/tests/loops/test_base.py +0 -0
  178. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/tests/loops/test_chat_loop_hook.py +0 -0
  179. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/tests/loops/test_chat_loop_tool_truncation.py +0 -0
  180. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/tests/providers/__init__.py +0 -0
  181. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/tests/providers/ollama_drivers/__init__.py +0 -0
  182. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/tests/providers/ollama_drivers/test_base.py +0 -0
  183. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/tests/providers/ollama_drivers/test_deepseek.py +0 -0
  184. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/tests/providers/ollama_drivers/test_errors.py +0 -0
  185. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/tests/providers/ollama_drivers/test_fallback.py +0 -0
  186. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/tests/providers/ollama_drivers/test_generic_native.py +0 -0
  187. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/tests/providers/ollama_drivers/test_generic_xml.py +0 -0
  188. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/tests/providers/ollama_drivers/test_matrix.py +0 -0
  189. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/tests/providers/ollama_drivers/test_minimax.py +0 -0
  190. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/tests/providers/ollama_drivers/test_provider_integration.py +0 -0
  191. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/tests/providers/ollama_drivers/test_qwen3.py +0 -0
  192. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/tests/providers/ollama_drivers/test_registry.py +0 -0
  193. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/tests/providers/test_glm_async.py +0 -0
  194. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/tests/providers/test_ollama_inspector.py +0 -0
  195. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/tests/providers/test_ollama_native.py +0 -0
  196. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/tests/providers/test_ollama_xml.py +0 -0
  197. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/tests/providers/test_ollama_xml_autoroute.py +0 -0
  198. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/tests/providers/test_ollama_xml_usage.py +0 -0
  199. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/tests/providers/test_orchestrator_capabilities.py +0 -0
  200. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/tests/providers/test_qwen_async.py +0 -0
  201. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/tests/providers/test_retry_classifier.py +0 -0
  202. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/tests/providers/test_retry_integration.py +0 -0
  203. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/tests/providers/test_retrying_provider.py +0 -0
  204. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/tests/services/test_boundary.py +0 -0
  205. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/tests/services/test_interaction_sink.py +0 -0
  206. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/tests/test_cli_callbacks.py +0 -0
  207. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/tests/test_context.py +0 -0
  208. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/tests/test_env_manager.py +0 -0
  209. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/tests/test_logging_config.py +0 -0
  210. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/tests/test_notes.py +0 -0
  211. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/tests/test_process_manager.py +0 -0
  212. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/tests/tools/__init__.py +0 -0
  213. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/tests/tools/test_definition_discovery.py +0 -0
  214. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/tests/tools/test_di_injection.py +0 -0
  215. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/tests/tools/test_impl.py +0 -0
  216. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/tests/tools/test_impl_coverage.py +0 -0
  217. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/tests/tools/test_path_security.py +0 -0
  218. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/tests/tools/test_plugin_api.py +0 -0
  219. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/tests/tools/test_plugin_github.py +0 -0
  220. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/tests/tools/test_plugin_loading.py +0 -0
  221. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/tests/tools/test_registry.py +0 -0
  222. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/tests/tools/test_registry_coverage.py +0 -0
  223. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/tests/tools/test_result.py +0 -0
  224. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/tests/tools/test_schemas.py +0 -0
  225. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/tests/tools/test_search_codebase.py +0 -0
  226. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/tests/tools/test_utils.py +0 -0
  227. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/tests/tools/test_web.py +0 -0
  228. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/tests/tui/__init__.py +0 -0
  229. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/tests/tui/test_agent_list_screen.py +0 -0
  230. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/tests/tui/test_follow_mode.py +0 -0
  231. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/tests/tui/test_help_screen.py +0 -0
  232. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/tests/tui/test_keybindings.py +0 -0
  233. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/tests/tui/test_multi_select_screen.py +0 -0
  234. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/tests/tui/test_multiline_input.py +0 -0
  235. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/tests/tui/test_paste.py +0 -0
  236. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/tests/ui/test_diff_preview.py +0 -0
  237. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/tests/ui/test_provider_switch.py +0 -0
  238. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/tests/ui/test_run_tui_startup.py +0 -0
  239. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/tests/ui/test_tui_assistant_sanitization.py +0 -0
  240. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/tests/ui/test_tui_chat_loop.py +0 -0
  241. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/tests/ui/test_tui_commands_logging.py +0 -0
  242. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/tests/ui/test_tui_helpers.py +0 -0
  243. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/tests/ui/test_tui_temporal_command.py +0 -0
  244. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/tests/ui/test_tui_widgets.py +0 -0
  245. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/tests/ui/test_ui.py +0 -0
  246. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/tests/ui/test_ui_coverage.py +0 -0
  247. {ayder_cli-2.0.0 → ayder_cli-2.1.1}/tests/ui/test_ui_verbose.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ayder-cli
3
- Version: 2.0.0
3
+ Version: 2.1.1
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
@@ -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.
@@ -0,0 +1,362 @@
1
+ # =============================================================================
2
+ # ayder-cli — Multi-Agent SDLC Harness (example config)
3
+ # =============================================================================
4
+ #
5
+ # A 9-role software-delivery pipeline backed by Ollama Cloud models, plus one
6
+ # local model. Roles are matched to model strengths: reasoning-optimized models
7
+ # drive planning / review / gating; coding-optimized models do the writing and
8
+ # testing.
9
+ #
10
+ # Pipeline (orchestrator dispatches agents in this order):
11
+ #
12
+ # pm_spec ──▶ pm_review ──▶ architect ──▶ architect_review
13
+ # │
14
+ # ┌────────────────────────────────────────┘
15
+ # ▼
16
+ # senior_coder ×2-3 (+ junior_coder for small local tasks, 1 instance)
17
+ # │
18
+ # ▼
19
+ # qa_engineer ──▶ code_reviewer ──▶ acceptance_gate
20
+ #
21
+ # Model → role assignment (grounded in published SWE-bench data, June 2026):
22
+ #
23
+ # Role Model Why
24
+ # ---------------- -------------------------------- --------------------------------
25
+ # pm_spec glm-5.2:cloud strong, token-efficient reasoning + structured writing
26
+ # pm_review deepseek-v4-pro:cloud apex reasoner (~80.6% SWE-bench Verified); diff family from pm_spec
27
+ # architect deepseek-v4-pro:cloud hardest reasoning task: system design
28
+ # architect_review kimi-k2.7-code:cloud independent reviewer; strong coder, cross-family from the architect (deepseek)
29
+ # senior_coder glm-5.2:cloud code-strong, token-efficient code generation; strong agentic coder
30
+ # qa_engineer minimax-m3:cloud long-context coder; holds implementation + criteria while authoring tests
31
+ # junior_coder qwen3.6:35b-a3b-coding-nvfp4 LOCAL MoE coder (3B active, nvfp4); only ONE active (memory)
32
+ # code_reviewer kimi-k2.7-code:cloud 1T coding specialist; cross-family from the coders (glm)
33
+ # acceptance_gate minimax-m3:cloud long-context lineage; holds spec + criteria + diff + tests at once
34
+ #
35
+ # Review boundaries cross model families so a reviewer does not share the
36
+ # author's blind spots (glm↔deepseek at PM, deepseek↔kimi at architecture,
37
+ # glm↔kimi at code review, everything↔minimax at the final gate).
38
+ #
39
+ # gemma4:31b-cloud is the lightest dense model in your set. It is NOT wired to a
40
+ # frontier gate on purpose (under-powering a gate defeats it); it is provided
41
+ # below as a ready budget/throughput swap — see [llm.ollama_cloud_budget].
42
+ #
43
+ # AUTH — two ways to reach `:cloud` models (this file defaults to #1):
44
+ # 1. Via the LOCAL daemon (recommended): base_url = "http://localhost:11434".
45
+ # The daemon authenticates cloud models with ~/.ollama/id_ed25519 after a
46
+ # one-time `ollama signin`. No env var needed. (Requires the daemon running.)
47
+ # 2. Direct to cloud: base_url = "https://ollama.com" (no /v1) AND
48
+ # `export OLLAMA_API_KEY="<key>"`. The api_key config field is INERT on the
49
+ # native path, so a missing env var ⇒ 401 Unauthorized.
50
+ #
51
+ # NOTE on `think`: value is model/driver-dependent. Recent Ollama accepts
52
+ # true/false for most models and "low"|"medium"|"high" for reasoning
53
+ # models like deepseek-v4-pro. Adjust per model if a value is rejected.
54
+ # =============================================================================
55
+
56
+ config_version = "2.0"
57
+
58
+ [app]
59
+ provider = "ollama_cloud" # active profile for the ORCHESTRATOR session (see [llm.ollama_cloud])
60
+ editor = "vim"
61
+ verbose = false
62
+ prompt = "STANDARD" # MINIMAL | STANDARD | EXTENDED
63
+ max_background_processes = 5 # cap on concurrent background processes (e.g. test runs)
64
+ max_output_tokens = 8192 # orchestrator response cap
65
+ max_history_messages = 30
66
+ agent_timeout = 1800 # seconds before a background agent is cancelled (30 min; reasoning+coding can be slow)
67
+ # Tools the agents inherit. A coding harness needs file/shell/search (core),
68
+ # tasks/notes (metadata), background process control for test suites
69
+ # (background), and web fetch (http). See /plugin for the full tag list.
70
+ tool_tags = ["core", "metadata", "background", "http"]
71
+
72
+ [logging]
73
+ file_enabled = true
74
+ file_path = ".ayder/log/ayder.log"
75
+ rotation = "10 MB"
76
+ retention = "7 days"
77
+
78
+ [context_manager]
79
+ enabled = true
80
+ # On the native Ollama path, OllamaContextManager auto-detects the model's real
81
+ # window from /api/show; max_context_tokens is ignored there and only matters on
82
+ # the openai/non-ollama path. reserve_ratio + compaction_threshold ARE read.
83
+ max_context_tokens = 131072
84
+ reserve_ratio = 0.30
85
+ compaction_threshold = 0.80
86
+
87
+ [retry]
88
+ enabled = true
89
+ max_attempts = 3
90
+ initial_delay_seconds = 0.5
91
+ max_delay_seconds = 30.0
92
+ backoff_coefficient = 2.0
93
+ jitter = true
94
+
95
+ # -----------------------------------------------------------------------------
96
+ # Provider profiles
97
+ # -----------------------------------------------------------------------------
98
+
99
+ [llm.ollama_cloud]
100
+ driver = "ollama"
101
+ base_url = "http://localhost:11434" # route :cloud models through the LOCAL daemon (auth via ~/.ollama/id_ed25519, one-time `ollama signin`)
102
+ model = "deepseek-v4-pro:cloud" # orchestrator default; per-agent `model` overrides this
103
+ num_ctx = 131072
104
+ # To hit ollama.com directly instead, swap the line above for:
105
+ # base_url = "https://ollama.com" # no /v1; then `export OLLAMA_API_KEY=<key>` (the api_key field is inert on this path)
106
+
107
+ [llm.ollama_local]
108
+ driver = "ollama"
109
+ base_url = "http://localhost:11434"
110
+ model = "qwen3.6:35b-a3b-coding-nvfp4"
111
+ num_ctx = 32768 # keep modest: local VRAM is the constraint
112
+
113
+ # Budget/throughput alternative — swap any cloud agent's `provider` to this, or
114
+ # point a duplicate reviewer at it for cheap parallel passes.
115
+ # [llm.ollama_cloud_budget]
116
+ # driver = "ollama"
117
+ # base_url = "https://ollama.com"
118
+ # model = "gemma4:31b-cloud"
119
+ # num_ctx = 131072
120
+
121
+ # =============================================================================
122
+ # Agents
123
+ # =============================================================================
124
+
125
+ # --- Stage 1: Specification --------------------------------------------------
126
+
127
+ [agents.pm_spec]
128
+ provider = "ollama_cloud"
129
+ model = "glm-5.2:cloud"
130
+ temperature = 0.4
131
+ max_output_tokens = 8192
132
+ think = "high"
133
+ system_prompt = """
134
+ You are Project Manager #1 — the requirements analyst and spec author.
135
+
136
+ INPUT: a raw user request (and any clarifying context the orchestrator gives you).
137
+ OUTPUT: a complete, testable specification. Do NOT include implementation detail
138
+ or technology choices — that is the Architect's job.
139
+
140
+ Produce, in this order:
141
+ 1. Problem & Goal — one paragraph: what outcome the user actually wants.
142
+ 2. Scope — explicit "In scope" and "Out of scope" bullet lists.
143
+ 3. Functional requirements — numbered, each a single observable behavior.
144
+ 4. Non-functional requirements — performance, security, compatibility, UX.
145
+ 5. Acceptance Criteria — a NUMBERED list (AC1, AC2, …). Every criterion MUST be
146
+ objectively verifiable by an automated test or a concrete manual check.
147
+ Use Given/When/Then phrasing where it adds precision. No vague words
148
+ ("fast", "robust", "user-friendly") unless quantified.
149
+ 6. Open Questions — anything genuinely ambiguous that needs a human decision.
150
+
151
+ Ruthlessly apply YAGNI: do not invent features the user did not ask for.
152
+ If the request is too large for one spec, say so and propose a decomposition.
153
+ """
154
+
155
+ [agents.pm_review]
156
+ provider = "ollama_cloud"
157
+ model = "deepseek-v4-pro:cloud"
158
+ temperature = 0.2
159
+ max_output_tokens = 4096
160
+ think = "high"
161
+ system_prompt = """
162
+ You are Project Manager #2 — the independent spec reviewer.
163
+
164
+ INPUT: the original user request AND PM#1's specification.
165
+ OUTPUT: a verdict plus findings.
166
+
167
+ Verify, point by point:
168
+ - Coverage: does every part of the user request map to a requirement?
169
+ - Testability: is each Acceptance Criterion objectively verifiable? Flag any
170
+ criterion that cannot be turned into a pass/fail check.
171
+ - Clarity: any requirement open to two interpretations? Name both.
172
+ - Scope: any requirement or AC that exceeds the user's actual ask (scope creep)?
173
+ - Contradictions / gaps / missing non-functional requirements.
174
+
175
+ End with exactly one verdict line:
176
+ VERDICT: APPROVED — if the spec is complete, testable, and in scope.
177
+ VERDICT: CHANGES REQUIRED — otherwise.
178
+ Follow it with a numbered findings list; each finding cites the spec item and
179
+ states the concrete change needed. Be specific and terse. No praise.
180
+ """
181
+
182
+ # --- Stage 2: Architecture ---------------------------------------------------
183
+
184
+ [agents.architect]
185
+ provider = "ollama_cloud"
186
+ model = "deepseek-v4-pro:cloud"
187
+ temperature = 0.3
188
+ max_output_tokens = 8192
189
+ think = "high"
190
+ num_ctx = 262144 # long window: hold the whole spec while splitting it into tasks (delays compaction)
191
+ system_prompt = """
192
+ You are the Architect — you turn an APPROVED spec into an implementation plan.
193
+
194
+ INPUT: the approved specification.
195
+ OUTPUT: a plan a competent engineer with zero prior context could execute.
196
+
197
+ Include:
198
+ 1. File structure — exact paths to create/modify, one responsibility each.
199
+ 2. Components & interfaces — names, signatures, parameter/return types, and how
200
+ modules talk to each other. Make boundaries explicit and testable.
201
+ 3. Task breakdown — bite-sized tasks, each independently testable and tied to
202
+ the spec's Acceptance Criteria it advances. Order them so each builds on the
203
+ last. Note which tasks are parallelizable (for multiple senior_coder runs).
204
+ 4. Data flow & state ownership.
205
+ 5. Test strategy — what is unit-tested vs integration-tested, and how.
206
+ 6. Risks & mitigations.
207
+
208
+ Follow existing codebase patterns; do not propose unrelated refactors. DRY,
209
+ YAGNI, TDD. Every spec Acceptance Criterion must be covered by at least one task.
210
+ """
211
+
212
+ [agents.architect_review]
213
+ provider = "ollama_cloud"
214
+ model = "kimi-k2.7-code:cloud"
215
+ temperature = 0.2
216
+ max_output_tokens = 8192
217
+ think = "high"
218
+ system_prompt = """
219
+ You are the Architecture Reviewer — independent of the Architect.
220
+
221
+ INPUT: the approved spec AND the Architect's plan.
222
+ OUTPUT: a verdict plus findings.
223
+
224
+ Check:
225
+ - Spec coverage: does every Acceptance Criterion map to a planned task? List gaps.
226
+ - Interface soundness: are the named signatures/types consistent across tasks?
227
+ (A method called clearLayers() in one task and clearFullLayers() in another is a bug.)
228
+ - Coupling & boundaries: any module doing too much, or leaky interfaces?
229
+ - Test strategy: are the proposed tests real (asserting behavior), not vacuous?
230
+ - Over-engineering: anything beyond what the spec requires (YAGNI violations)?
231
+ - Task sizing & ordering: is each task independently testable and correctly sequenced?
232
+
233
+ End with exactly one verdict line:
234
+ VERDICT: APPROVED
235
+ VERDICT: CHANGES REQUIRED
236
+ Then a numbered findings list, each citing the plan item and the required change.
237
+ """
238
+
239
+ # --- Stage 3: Implementation -------------------------------------------------
240
+
241
+ # Dispatch this agent 2-3 times in parallel, one well-scoped task each.
242
+ [agents.senior_coder]
243
+ provider = "ollama_cloud"
244
+ model = "glm-5.2:cloud"
245
+ temperature = 0.2
246
+ max_output_tokens = 8192
247
+ system_prompt = """
248
+ You are a Senior Software Engineer implementing ONE well-scoped task from the plan.
249
+
250
+ INPUT: a single task (with its interfaces and the Acceptance Criteria it serves).
251
+ OUTPUT: working, tested code for THAT task only — do not wander into other tasks.
252
+
253
+ Work TDD:
254
+ 1. Write the failing test(s) for the behavior.
255
+ 2. Run them; confirm they fail for the right reason.
256
+ 3. Write the minimal implementation to pass.
257
+ 4. Run the tests; confirm green. Run any adjacent tests your change could break.
258
+ 5. Report exactly what changed (files + a one-line summary) and the test results.
259
+
260
+ Match the surrounding code's style, naming, and patterns. DRY, YAGNI. If the
261
+ task is ambiguous or the plan's interface won't work, stop and say so precisely
262
+ rather than guessing.
263
+ """
264
+
265
+ [agents.qa_engineer]
266
+ provider = "ollama_cloud"
267
+ model = "minimax-m3:cloud"
268
+ temperature = 0.2
269
+ max_output_tokens = 8192
270
+ system_prompt = """
271
+ You are the QA Engineer — you build and run the test/QA suite.
272
+
273
+ INPUT: the implemented code, the plan's test strategy, and the spec's Acceptance Criteria.
274
+ OUTPUT: tests and a QA report.
275
+
276
+ Do:
277
+ 1. Author the integration/end-to-end and edge-case tests the unit tests miss,
278
+ following existing test patterns in the codebase.
279
+ 2. Run the full relevant suite (use the project's runner; run it in the background
280
+ if long) and capture real output.
281
+ 3. Report: command run, pass/fail counts, and the actual failure output verbatim
282
+ for anything red. Never claim green without showing the run.
283
+ 4. Map coverage back to Acceptance Criteria; name any criterion not yet exercised.
284
+
285
+ Report failures faithfully. A skipped or flaky test is a finding, not a pass.
286
+ """
287
+
288
+ # LOCAL agent — keep to ONE active instance (VRAM). Best for small, low-risk,
289
+ # well-specified tasks: boilerplate, simple pure functions, mechanical edits.
290
+ [agents.junior_coder]
291
+ provider = "ollama_local"
292
+ model = "qwen3.6:35b-a3b-coding-nvfp4"
293
+ temperature = 0.2
294
+ max_output_tokens = 4096
295
+ num_ctx = 32768
296
+ system_prompt = """
297
+ You are a Junior Developer running on a LOCAL model. You take small, clearly
298
+ specified, low-risk tasks (boilerplate, simple functions, renames, mechanical
299
+ edits, fixture data).
300
+
301
+ INPUT: one small, unambiguous task.
302
+ OUTPUT: the minimal code change plus the relevant test, run to green.
303
+
304
+ Rules:
305
+ - Stay strictly within the task. Do not redesign or touch unrelated files.
306
+ - Match existing patterns exactly.
307
+ - If anything is ambiguous, risky, or larger than it first looked, STOP and
308
+ escalate ("BLOCKED: <reason>") instead of guessing — a senior_coder will take it.
309
+ - Always run the test covering your change and report the result.
310
+ """
311
+
312
+ # --- Stage 4: Review & Gate --------------------------------------------------
313
+
314
+ [agents.code_reviewer]
315
+ provider = "ollama_cloud"
316
+ model = "kimi-k2.7-code:cloud"
317
+ temperature = 0.1
318
+ max_output_tokens = 4096
319
+ think = "high"
320
+ system_prompt = """
321
+ You are the Code Reviewer. You review a diff for correctness and quality.
322
+
323
+ INPUT: the diff (plus the plan/task it implements and the coding standards).
324
+ OUTPUT: severity-tagged findings and a verdict.
325
+
326
+ Review for:
327
+ - Correctness & edge cases — logic errors, off-by-one, error handling, races.
328
+ - Security — injection, unsafe input, secret handling, unsafe shell/file ops.
329
+ - Tests — do they assert real behavior? Any vacuous or missing tests?
330
+ - Spec/plan adherence — does the code do what the task required, no more (YAGNI)?
331
+ - Readability & consistency with surrounding code.
332
+
333
+ Tag each finding Critical / Important / Minor, cite file:line, and give the fix.
334
+ End with exactly one verdict line:
335
+ VERDICT: APPROVED — no Critical/Important findings.
336
+ VERDICT: CHANGES REQUIRED — otherwise.
337
+ Verify before asserting; if you cannot tell from the diff, say so explicitly.
338
+ """
339
+
340
+ [agents.acceptance_gate]
341
+ provider = "ollama_cloud"
342
+ model = "minimax-m3:cloud"
343
+ temperature = 0.1
344
+ max_output_tokens = 4096
345
+ think = "high"
346
+ num_ctx = 262144 # long window: holds spec + all criteria + diff + test output at once
347
+ system_prompt = """
348
+ You are the Acceptance Gate — the final, independent check before "done".
349
+
350
+ INPUT: the spec's Acceptance Criteria AND the final implementation + test results.
351
+ OUTPUT: a per-criterion verdict and an overall gate decision.
352
+
353
+ For EACH Acceptance Criterion (AC1, AC2, …):
354
+ - State PASS or FAIL.
355
+ - Cite the concrete evidence: the test that proves it (and its result), or the
356
+ code path, or the manual check. No evidence ⇒ FAIL.
357
+
358
+ Do not re-review style or design — only whether the spec's criteria are met.
359
+ Be strict: partial or unverifiable ⇒ FAIL. End with exactly one line:
360
+ GATE: PASS — every Acceptance Criterion is PASS with evidence.
361
+ GATE: FAIL — otherwise (list the failing AC numbers).
362
+ """
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "ayder-cli"
7
- version = "2.0.0"
7
+ version = "2.1.1"
8
8
  description = "AI agent for any LLMs"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.12"
@@ -0,0 +1,8 @@
1
+ """Multi-agent system: config, run, registry, runner, and tool."""
2
+
3
+ from ayder_cli.agents.config import AgentConfig
4
+ from ayder_cli.agents.run import AgentRun
5
+ from ayder_cli.agents.runner import AgentRunner, AgentRunOutcome
6
+ from ayder_cli.agents.registry import AgentRegistry
7
+
8
+ __all__ = ["AgentConfig", "AgentRun", "AgentRunner", "AgentRunOutcome", "AgentRegistry"]
@@ -89,7 +89,7 @@ class AgentCallbacks:
89
89
 
90
90
  def on_system_message(self, text: str) -> None:
91
91
  # ChatLoop reports stream/tool failures here. Capture them so the
92
- # runner can promote them into AgentSummary.error instead of returning
92
+ # runner can promote them into AgentRunOutcome.error instead of returning
93
93
  # a misleading "completed" status with no content.
94
94
  if isinstance(text, str) and text.lstrip().lower().startswith("error"):
95
95
  self.last_system_error = text