ayder-cli 2.5.3__tar.gz → 2.5.4__tar.gz

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