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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (362) hide show
  1. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/.gitignore +1 -0
  2. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/AGENTS.md +30 -19
  3. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/PKG-INFO +26 -29
  4. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/README.md +23 -28
  5. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/docs/GATE.md +1 -1
  6. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/docs/PROJECT_STRUCTURE.md +25 -21
  7. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/docs/README_AGENT_WORKFLOW.md +35 -35
  8. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/docs/README_OLLAMA.md +0 -1
  9. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/docs/config.toml.example +3 -3
  10. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/pyproject.toml +4 -2
  11. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/scripts/check_exception_handlers.py +1 -1
  12. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/scripts/check_log_arguments.py +5 -5
  13. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/scripts/log_argument_baseline.txt +4 -3
  14. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/agents/config.py +1 -1
  15. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/agents/runner.py +3 -10
  16. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/cli.py +9 -40
  17. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/cli_runner.py +0 -27
  18. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/core/config.py +2 -107
  19. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/core/config_migration.py +2 -44
  20. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/core/skills.py +5 -3
  21. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/logging_config.py +5 -1
  22. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/loops/chat_loop.py +29 -1
  23. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/prompts.py +3 -1
  24. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/providers/impl/ollama_drivers/base.py +0 -2
  25. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/providers/retry.py +7 -1
  26. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/themes/ayder.py +17 -25
  27. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/themes/claude.py +17 -25
  28. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/tools/builtins/tasks.py +0 -44
  29. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/tools/plugin_manager.py +0 -16
  30. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/tui/__init__.py +4 -3
  31. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/tui/app.py +42 -57
  32. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/tui/commands.py +1 -61
  33. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/tui/screens.py +6 -0
  34. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/tui/widgets.py +123 -17
  35. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/application/test_runtime_factory.py +1 -0
  36. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/core/test_config.py +0 -57
  37. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/core/test_config_coverage.py +0 -33
  38. ayder_cli-2.5.4/tests/core/test_config_retired_temporal.py +153 -0
  39. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/core/test_logging_config_keys.py +1 -2
  40. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/core/test_logging_sinks.py +21 -0
  41. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/loops/test_chat_loop_guards.py +70 -5
  42. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/providers/test_retry_classifier.py +11 -0
  43. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/scripts/test_exception_gate.py +6 -3
  44. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/scripts/test_log_argument_gate.py +14 -14
  45. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/test_cli.py +0 -12
  46. ayder_cli-2.5.4/tests/test_cli_startup_logging.py +87 -0
  47. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/test_prompts_environment.py +92 -1
  48. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/test_tasks.py +0 -58
  49. ayder_cli-2.5.4/tests/tui/test_follow_mode.py +132 -0
  50. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/tui/test_help_screen.py +26 -0
  51. ayder_cli-2.5.4/tests/tui/test_inline_sync_output.py +77 -0
  52. ayder_cli-2.5.4/tests/tui/test_mouse_support.py +20 -0
  53. ayder_cli-2.5.4/tests/tui/test_panel_layout.py +490 -0
  54. ayder_cli-2.5.4/tests/tui/test_real_turn_follow.py +260 -0
  55. ayder_cli-2.5.4/tests/tui/test_skill_label_refresh.py +126 -0
  56. ayder_cli-2.5.4/tests/tui/test_status_bar_cwd.py +185 -0
  57. ayder_cli-2.5.4/uv.lock +3037 -0
  58. ayder_cli-2.5.2/tests/tui/test_follow_mode.py +0 -38
  59. ayder_cli-2.5.2/tests/ui/test_tui_temporal_command.py +0 -115
  60. ayder_cli-2.5.2/uv.lock +0 -2441
  61. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/.github/workflows/ci.yml +0 -0
  62. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/.github/workflows/python-package.yml +0 -0
  63. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/.python-version +0 -0
  64. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/LICENSE +0 -0
  65. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/docs/cc.png +0 -0
  66. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/scripts/check_logging_imports.py +0 -0
  67. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/scripts/exception_baseline.txt +0 -0
  68. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/scripts/find_percent_logging.py +0 -0
  69. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/scripts/logging_gates.py +0 -0
  70. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/__init__.py +0 -0
  71. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/__main__.py +0 -0
  72. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/agents/__init__.py +0 -0
  73. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/agents/callbacks.py +0 -0
  74. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/agents/registry.py +0 -0
  75. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/agents/run.py +0 -0
  76. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/agents/tool.py +0 -0
  77. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/agents/worktree.py +0 -0
  78. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/application/README.md +0 -0
  79. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/application/__init__.py +0 -0
  80. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/application/execution_policy.py +0 -0
  81. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/application/message_contract.py +0 -0
  82. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/application/runtime_factory.py +0 -0
  83. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/application/validation.py +0 -0
  84. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/cli_callbacks.py +0 -0
  85. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/console.py +0 -0
  86. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/core/cache_monitor.py +0 -0
  87. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/core/context.py +0 -0
  88. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/core/context_manager.py +0 -0
  89. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/core/context_manager_factory.py +0 -0
  90. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/core/default_context_manager.py +0 -0
  91. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/core/ollama_context_manager.py +0 -0
  92. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/core/reasoning.py +0 -0
  93. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/core/result.py +0 -0
  94. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/core/session.py +0 -0
  95. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/diagnostics.py +0 -0
  96. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/log.py +0 -0
  97. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/loops/__init__.py +0 -0
  98. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/masking.py +0 -0
  99. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/parser.py +0 -0
  100. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/process_manager.py +0 -0
  101. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/providers/__init__.py +0 -0
  102. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/providers/base.py +0 -0
  103. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/providers/evren.py +0 -0
  104. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/providers/impl/claude.py +0 -0
  105. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/providers/impl/deepseek.py +0 -0
  106. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/providers/impl/gemini.py +0 -0
  107. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/providers/impl/glm.py +0 -0
  108. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/providers/impl/ollama.py +0 -0
  109. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/providers/impl/ollama_drivers/__init__.py +0 -0
  110. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/providers/impl/ollama_drivers/_errors.py +0 -0
  111. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/providers/impl/ollama_drivers/deepseek.py +0 -0
  112. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/providers/impl/ollama_drivers/generic_native.py +0 -0
  113. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/providers/impl/ollama_drivers/generic_xml.py +0 -0
  114. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/providers/impl/ollama_drivers/matrix.py +0 -0
  115. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/providers/impl/ollama_drivers/minimax.py +0 -0
  116. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/providers/impl/ollama_drivers/qwen3.py +0 -0
  117. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/providers/impl/ollama_drivers/registry.py +0 -0
  118. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/providers/impl/ollama_inspector.py +0 -0
  119. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/providers/impl/openai.py +0 -0
  120. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/providers/impl/qwen.py +0 -0
  121. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/providers/orchestrator.py +0 -0
  122. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/services/__init__.py +0 -0
  123. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/services/interactions.py +0 -0
  124. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/services/messaging_inbox.py +0 -0
  125. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/skills/development-workflow/SKILL.md +0 -0
  126. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/themes/__init__.py +0 -0
  127. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/tools/__init__.py +0 -0
  128. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/tools/builtins/__init__.py +0 -0
  129. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/tools/builtins/background_process_tool.py +0 -0
  130. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/tools/builtins/context.py +0 -0
  131. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/tools/builtins/context_definitions.py +0 -0
  132. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/tools/builtins/filesystem.py +0 -0
  133. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/tools/builtins/filesystem_definitions.py +0 -0
  134. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/tools/builtins/note_tool.py +0 -0
  135. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/tools/builtins/notes.py +0 -0
  136. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/tools/builtins/notes_definitions.py +0 -0
  137. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/tools/builtins/process_manager_definitions.py +0 -0
  138. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/tools/builtins/search.py +0 -0
  139. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/tools/builtins/search_definitions.py +0 -0
  140. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/tools/builtins/shell.py +0 -0
  141. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/tools/builtins/shell_definitions.py +0 -0
  142. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/tools/builtins/skill.py +0 -0
  143. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/tools/builtins/skill_definitions.py +0 -0
  144. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/tools/builtins/task_definitions.py +0 -0
  145. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/tools/builtins/task_tool.py +0 -0
  146. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/tools/builtins/utils_tools.py +0 -0
  147. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/tools/builtins/utils_tools_definitions.py +0 -0
  148. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/tools/builtins/web.py +0 -0
  149. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/tools/builtins/web_definitions.py +0 -0
  150. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/tools/definition.py +0 -0
  151. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/tools/execution.py +0 -0
  152. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/tools/hooks.py +0 -0
  153. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/tools/mcp.py +0 -0
  154. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/tools/mcp_client.py +0 -0
  155. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/tools/normalization.py +0 -0
  156. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/tools/plugin_api.py +0 -0
  157. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/tools/plugin_github.py +0 -0
  158. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/tools/plugin_status.py +0 -0
  159. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/tools/registry.py +0 -0
  160. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/tools/schemas.py +0 -0
  161. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/tools/utils.py +0 -0
  162. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/tui/adapter.py +0 -0
  163. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/tui/helpers.py +0 -0
  164. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/tui/keybindings.py +0 -0
  165. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/tui/parser.py +0 -0
  166. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/tui/rendering.py +0 -0
  167. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/tui/theme_manager.py +0 -0
  168. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/tui/types.py +0 -0
  169. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/ui.py +0 -0
  170. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/src/ayder_cli/version.py +0 -0
  171. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/COVERAGE.md +0 -0
  172. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/__init__.py +0 -0
  173. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/agents/__init__.py +0 -0
  174. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/agents/test_agent_consolidated.py +0 -0
  175. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/agents/test_agent_severity.py +0 -0
  176. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/agents/test_agent_tools.py +0 -0
  177. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/agents/test_callbacks.py +0 -0
  178. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/agents/test_config.py +0 -0
  179. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/agents/test_integration.py +0 -0
  180. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/agents/test_queue.py +0 -0
  181. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/agents/test_registry.py +0 -0
  182. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/agents/test_run.py +0 -0
  183. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/agents/test_runner.py +0 -0
  184. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/agents/test_runner_provider_unavailable.py +0 -0
  185. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/agents/test_tool.py +0 -0
  186. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/agents/test_worktree_helpers.py +0 -0
  187. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/agents/test_worktree_isolation.py +0 -0
  188. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/application/test_argument_canonicalization.py +0 -0
  189. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/application/test_execution_result_truthfulness.py +0 -0
  190. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/application/test_message_contract.py +0 -0
  191. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/client/test_main.py +0 -0
  192. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/conftest.py +0 -0
  193. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/convergence/__init__.py +0 -0
  194. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/convergence/test_execution_policy_parity.py +0 -0
  195. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/convergence/test_runtime_wiring.py +0 -0
  196. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/convergence/test_validation_path.py +0 -0
  197. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/core/test_asyncio_bridge.py +0 -0
  198. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/core/test_cache_monitor.py +0 -0
  199. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/core/test_config_migration.py +0 -0
  200. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/core/test_config_provider_logging.py +0 -0
  201. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/core/test_config_retry.py +0 -0
  202. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/core/test_config_skills.py +0 -0
  203. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/core/test_config_v2.py +0 -0
  204. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/core/test_context_manager_factory.py +0 -0
  205. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/core/test_default_config_evren.py +0 -0
  206. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/core/test_default_context_manager.py +0 -0
  207. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/core/test_default_context_manager_should_compact.py +0 -0
  208. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/core/test_default_context_newest_unit.py +0 -0
  209. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/core/test_default_context_skill_resupply.py +0 -0
  210. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/core/test_event_emission.py +0 -0
  211. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/core/test_event_stream.py +0 -0
  212. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/core/test_exception_guarantee.py +0 -0
  213. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/core/test_exception_hooks.py +0 -0
  214. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/core/test_log_facade.py +0 -0
  215. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/core/test_loguru_caplog.py +0 -0
  216. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/core/test_max_output_tokens_default.py +0 -0
  217. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/core/test_ollama_compaction_persistence.py +0 -0
  218. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/core/test_ollama_context_manager.py +0 -0
  219. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/core/test_ollama_context_manager_cache_monitor.py +0 -0
  220. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/core/test_ollama_context_manager_max_history.py +0 -0
  221. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/core/test_ollama_skill_resupply.py +0 -0
  222. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/core/test_parameter_aliasing.py +0 -0
  223. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/core/test_parser.py +0 -0
  224. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/core/test_reasoning_config.py +0 -0
  225. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/core/test_scratch_dir.py +0 -0
  226. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/core/test_session.py +0 -0
  227. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/core/test_session_id_threading.py +0 -0
  228. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/core/test_sink_masking.py +0 -0
  229. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/core/test_skills.py +0 -0
  230. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/core/test_skills_builtin_sync.py +0 -0
  231. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/loops/__init__.py +0 -0
  232. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/loops/test_base.py +0 -0
  233. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/loops/test_chat_loop_hook.py +0 -0
  234. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/loops/test_chat_loop_tool_truncation.py +0 -0
  235. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/loops/test_loop_severity.py +0 -0
  236. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/loops/test_required_args_aliases.py +0 -0
  237. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/loops/test_tool_argument_integrity.py +0 -0
  238. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/loops/test_tool_batch_cancellation.py +0 -0
  239. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/loops/test_tool_batch_ordering.py +0 -0
  240. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/providers/__init__.py +0 -0
  241. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/providers/ollama_drivers/__init__.py +0 -0
  242. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/providers/ollama_drivers/test_base.py +0 -0
  243. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/providers/ollama_drivers/test_deepseek.py +0 -0
  244. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/providers/ollama_drivers/test_errors.py +0 -0
  245. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/providers/ollama_drivers/test_fallback.py +0 -0
  246. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/providers/ollama_drivers/test_generic_native.py +0 -0
  247. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/providers/ollama_drivers/test_generic_xml.py +0 -0
  248. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/providers/ollama_drivers/test_matrix.py +0 -0
  249. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/providers/ollama_drivers/test_minimax.py +0 -0
  250. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/providers/ollama_drivers/test_provider_integration.py +0 -0
  251. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/providers/ollama_drivers/test_qwen3.py +0 -0
  252. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/providers/ollama_drivers/test_registry.py +0 -0
  253. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/providers/test_claude_stream_tool_calls.py +0 -0
  254. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/providers/test_evren.py +0 -0
  255. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/providers/test_gemini_function_calls.py +0 -0
  256. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/providers/test_glm_async.py +0 -0
  257. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/providers/test_ollama_inspector.py +0 -0
  258. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/providers/test_ollama_native.py +0 -0
  259. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/providers/test_ollama_parallel_tool_call_ids.py +0 -0
  260. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/providers/test_ollama_xml.py +0 -0
  261. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/providers/test_ollama_xml_autoroute.py +0 -0
  262. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/providers/test_ollama_xml_usage.py +0 -0
  263. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/providers/test_openai_list_models.py +0 -0
  264. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/providers/test_orchestrator_capabilities.py +0 -0
  265. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/providers/test_provider_channel_binding.py +0 -0
  266. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/providers/test_provider_severity.py +0 -0
  267. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/providers/test_qwen_async.py +0 -0
  268. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/providers/test_reasoning_effort.py +0 -0
  269. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/providers/test_retry_integration.py +0 -0
  270. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/providers/test_retrying_provider.py +0 -0
  271. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/providers/test_skill_load_prefix.py +0 -0
  272. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/scripts/test_logging_policy_gates.py +0 -0
  273. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/scripts/test_loguru_private_shape.py +0 -0
  274. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/services/test_boundary.py +0 -0
  275. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/services/test_interaction_sink.py +0 -0
  276. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/services/test_messaging_inbox.py +0 -0
  277. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/test_agents_md.py +0 -0
  278. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/test_cli_callbacks.py +0 -0
  279. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/test_context.py +0 -0
  280. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/test_env_manager.py +0 -0
  281. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/test_logging_config.py +0 -0
  282. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/test_notes.py +0 -0
  283. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/test_process_manager.py +0 -0
  284. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/test_prompts_general.py +0 -0
  285. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/tools/__init__.py +0 -0
  286. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/tools/test_agent_notes.py +0 -0
  287. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/tools/test_background_process_tool.py +0 -0
  288. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/tools/test_bash_process_safety.py +0 -0
  289. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/tools/test_bash_tool.py +0 -0
  290. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/tools/test_context_storage_confinement.py +0 -0
  291. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/tools/test_definition_discovery.py +0 -0
  292. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/tools/test_di_injection.py +0 -0
  293. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/tools/test_error_labels.py +0 -0
  294. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/tools/test_file_editor_hardening.py +0 -0
  295. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/tools/test_file_editor_size_limit.py +0 -0
  296. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/tools/test_file_tool_output.py +0 -0
  297. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/tools/test_impl.py +0 -0
  298. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/tools/test_impl_coverage.py +0 -0
  299. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/tools/test_mcp.py +0 -0
  300. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/tools/test_mcp_client.py +0 -0
  301. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/tools/test_note_tool.py +0 -0
  302. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/tools/test_notes_api.py +0 -0
  303. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/tools/test_notes_confinement.py +0 -0
  304. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/tools/test_parallel_safe.py +0 -0
  305. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/tools/test_path_security.py +0 -0
  306. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/tools/test_plugin_api.py +0 -0
  307. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/tools/test_plugin_github.py +0 -0
  308. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/tools/test_plugin_loading.py +0 -0
  309. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/tools/test_plugin_manager.py +0 -0
  310. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/tools/test_plugin_status.py +0 -0
  311. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/tools/test_registry.py +0 -0
  312. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/tools/test_registry_coverage.py +0 -0
  313. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/tools/test_result.py +0 -0
  314. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/tools/test_schemas.py +0 -0
  315. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/tools/test_search_codebase.py +0 -0
  316. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/tools/test_search_hardening.py +0 -0
  317. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/tools/test_skill_catalog_and_filter.py +0 -0
  318. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/tools/test_skill_scope_wiring.py +0 -0
  319. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/tools/test_skill_tool.py +0 -0
  320. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/tools/test_task_integrity.py +0 -0
  321. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/tools/test_task_path_confinement.py +0 -0
  322. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/tools/test_task_tool.py +0 -0
  323. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/tools/test_tool_severity.py +0 -0
  324. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/tools/test_unexpected_args.py +0 -0
  325. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/tools/test_utils.py +0 -0
  326. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/tools/test_web.py +0 -0
  327. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/tui/__init__.py +0 -0
  328. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/tui/test_agent_list_screen.py +0 -0
  329. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/tui/test_do_clear_coordination.py +0 -0
  330. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/tui/test_evren_terms.py +0 -0
  331. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/tui/test_input_box.py +0 -0
  332. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/tui/test_keybindings.py +0 -0
  333. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/tui/test_multi_select_screen.py +0 -0
  334. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/tui/test_multiline_input.py +0 -0
  335. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/tui/test_paste.py +0 -0
  336. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/tui/test_peer_message_turn.py +0 -0
  337. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/tui/test_pending_compact_consumer.py +0 -0
  338. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/tui/test_pull_delivery.py +0 -0
  339. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/tui/test_resume.py +0 -0
  340. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/tui/test_status_bar_badges.py +0 -0
  341. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/tui/test_themes.py +0 -0
  342. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/tui/test_turn_consumer.py +0 -0
  343. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/tui/test_widgets.py +0 -0
  344. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/ui/test_confirm_screen.py +0 -0
  345. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/ui/test_diff_preview.py +0 -0
  346. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/ui/test_plugin_autoenable.py +0 -0
  347. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/ui/test_provider_switch.py +0 -0
  348. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/ui/test_run_tui_startup.py +0 -0
  349. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/ui/test_tui_assistant_sanitization.py +0 -0
  350. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/ui/test_tui_chat_loop.py +0 -0
  351. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/ui/test_tui_commands_agent.py +0 -0
  352. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/ui/test_tui_commands_effort.py +0 -0
  353. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/ui/test_tui_commands_logging.py +0 -0
  354. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/ui/test_tui_commands_plugin.py +0 -0
  355. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/ui/test_tui_commands_provider.py +0 -0
  356. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/ui/test_tui_commands_skill.py +0 -0
  357. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/ui/test_tui_helpers.py +0 -0
  358. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/ui/test_tui_system_prompt_no_structure.py +0 -0
  359. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/ui/test_tui_widgets.py +0 -0
  360. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/ui/test_ui.py +0 -0
  361. {ayder_cli-2.5.2 → ayder_cli-2.5.4}/tests/ui/test_ui_coverage.py +0 -0
  362. {ayder_cli-2.5.2 → 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.2
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 |
@@ -535,6 +530,7 @@ inside the Ollama summary.
535
530
  | `Ctrl+L` | Clear chat |
536
531
  | `Ctrl+O` | Toggle tool panel |
537
532
  | `Ctrl+T` | Toggle thinking/reasoning blocks |
533
+ | `Shift` + drag | Select text with the mouse (Option in iTerm2 and Terminal.app) |
538
534
  | `PageUp` / `PageDown` | Scroll chat view |
539
535
  | `Tab` | Auto-complete slash commands |
540
536
 
@@ -542,7 +538,7 @@ inside the Ollama summary.
542
538
 
543
539
  ayder-cli is optimized for both large and small (local) LLMs:
544
540
 
545
- - **Dynamic Tool Loading**: Only `core` and `metadata` tools are loaded by default. Use `/plugin` to enable specialized toolsets (venv, python, http, background, dbs, 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.
546
542
  - **Tiered Prompts**: Use `prompt = "MINIMAL"` in config for smaller models (7B-14B) to strip complex reasoning frameworks and improve follow-through.
547
543
  - **Automatic Context Bounding**: Conversation history is bounded based on `max_history_messages` to prevent context rot.
548
544
  - **Tool System Prompts**: Tool-specific prompt blocks (e.g., DBS instructions) are only injected when their tag is enabled, keeping the system prompt lean.
@@ -609,23 +605,24 @@ The tool system:
609
605
  - Supports tag-based filtering for dynamic enable/disable
610
606
  - Injects tool-specific system prompts when enabled
611
607
 
612
- **Built-in tools (16):**
608
+ **Built-in tools (13):**
613
609
 
614
610
  | Category | Tools |
615
611
  |----------|-------|
616
612
  | **Filesystem** | `file_explorer`, `read_file`, `file_editor` |
617
613
  | **Search** | `search_codebase`, `get_project_structure` |
618
- | **Shell** | `run_shell_command` |
614
+ | **Shell** | `bash` |
619
615
  | **Context** | `context` (save / load / list / stats / clear session context slots) |
620
- | **Notes** | `create_note` |
621
- | **Background Processes** | `run_background_process`, `get_background_output`, `kill_background_process`, `list_background_processes` |
622
- | **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) |
623
620
  | **Environment** | `manage_environment_vars` |
624
621
  | **Web** | `fetch_web` |
625
622
 
626
- 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)).
627
624
 
628
- **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.
629
626
 
630
627
  ## Multi-Agent System
631
628
 
@@ -636,7 +633,7 @@ ayder-cli supports user-defined **specialized agents**: each agent is an indepen
636
633
  ```
637
634
  Main LLM (your conversation)
638
635
  │
639
- ├─ calls `call_agent` tool ─────────────────────────────────┐
636
+ ├─ calls `agent` tool ──────────────────────────────────────┐
640
637
  │ OR you type `/agent <name> <task>` │
641
638
  │ ▼
642
639
  │ AgentRunner (background asyncio task)
@@ -660,10 +657,10 @@ pre_iteration_hook drains queue
660
657
 
661
658
  Key properties:
662
659
  - **Separate context** — agents have no access to the main conversation history. They receive only their system prompt and the task description.
663
- - **Non-blocking** — dispatching an agent returns immediately. Both `/agent` and `call_agent` are fire-and-forget.
660
+ - **Non-blocking** — dispatching an agent returns immediately. Both `/agent` and the `agent` tool are fire-and-forget.
664
661
  - **Concurrent** — multiple agents can run simultaneously, each in its own async task.
665
662
  - **Summary injection** — when an agent finishes, its structured `<agent-summary>` block is injected as a system message into the main LLM's context at the start of the next turn.
666
- - **Timeout** — agents are automatically cancelled after `agent_timeout` seconds (default: 300).
663
+ - **Timeout** — agents are automatically cancelled after `agent_timeout` seconds (default: 600).
667
664
 
668
665
  ### Configuring Agents
669
666
 
@@ -732,14 +729,14 @@ Each agent field:
732
729
 
733
730
  **Via the main LLM (automatic):**
734
731
 
735
- When agents are configured, the main LLM is told about them via its system prompt and can call `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:
736
733
 
737
734
  ```
738
735
  You: Review the authentication module and write tests for it.
739
736
 
740
737
  LLM: I'll dispatch two agents to handle this in parallel.
741
- [calls call_agent: name="code-reviewer", task="Review src/auth.py..."]
742
- [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..."]
743
740
 
744
741
  Both agents are running in the background. I'll incorporate
745
742
  their findings when they complete.
@@ -815,7 +812,7 @@ built-in support; your existing `.ayder/mcp.json` continues to work. The legacy
815
812
 
816
813
  ## Plugins
817
814
 
818
- Official plugins (venv, python, dbs, 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:
819
816
 
820
817
  ```bash
821
818
  ayder install-plugin https://github.com/ayder/ayder-plugins/tree/main/venv-tools
@@ -40,7 +40,7 @@ LLMs on their own can only generate text. To be a useful coding assistant, the m
40
40
  Each tool has an OpenAI-compatible JSON schema so models that support function calling can use them natively. For models that don't, ayder-cli also parses a custom XML-like syntax (`<function=name><parameter=key>value</parameter></function>`) as a fallback.
41
41
 
42
42
  - **Path sandboxing**: All file operations are confined to the project root via `ProjectContext`. Path traversal attacks (`../`) and absolute paths outside the project are blocked. The one exception is the session scratch directory, `/tmp/ayder-<uid>/<project>-<hash>/<session>/` (mode 0700, one subdirectory per agent run), which the system prompt names as the place for temporary files and which the file tools accept. It is not cleaned up; the OS clears `/tmp`.
43
- - **Safe mode** (TUI): Blocks `file_editor`, `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 |
@@ -492,6 +485,7 @@ inside the Ollama summary.
492
485
  | `Ctrl+L` | Clear chat |
493
486
  | `Ctrl+O` | Toggle tool panel |
494
487
  | `Ctrl+T` | Toggle thinking/reasoning blocks |
488
+ | `Shift` + drag | Select text with the mouse (Option in iTerm2 and Terminal.app) |
495
489
  | `PageUp` / `PageDown` | Scroll chat view |
496
490
  | `Tab` | Auto-complete slash commands |
497
491
 
@@ -499,7 +493,7 @@ inside the Ollama summary.
499
493
 
500
494
  ayder-cli is optimized for both large and small (local) LLMs:
501
495
 
502
- - **Dynamic Tool Loading**: Only `core` and `metadata` tools are loaded by default. Use `/plugin` to enable specialized toolsets (venv, python, http, background, dbs, 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.
503
497
  - **Tiered Prompts**: Use `prompt = "MINIMAL"` in config for smaller models (7B-14B) to strip complex reasoning frameworks and improve follow-through.
504
498
  - **Automatic Context Bounding**: Conversation history is bounded based on `max_history_messages` to prevent context rot.
505
499
  - **Tool System Prompts**: Tool-specific prompt blocks (e.g., DBS instructions) are only injected when their tag is enabled, keeping the system prompt lean.
@@ -566,23 +560,24 @@ The tool system:
566
560
  - Supports tag-based filtering for dynamic enable/disable
567
561
  - Injects tool-specific system prompts when enabled
568
562
 
569
- **Built-in tools (16):**
563
+ **Built-in tools (13):**
570
564
 
571
565
  | Category | Tools |
572
566
  |----------|-------|
573
567
  | **Filesystem** | `file_explorer`, `read_file`, `file_editor` |
574
568
  | **Search** | `search_codebase`, `get_project_structure` |
575
- | **Shell** | `run_shell_command` |
569
+ | **Shell** | `bash` |
576
570
  | **Context** | `context` (save / load / list / stats / clear session context slots) |
577
- | **Notes** | `create_note` |
578
- | **Background Processes** | `run_background_process`, `get_background_output`, `kill_background_process`, `list_background_processes` |
579
- | **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) |
580
575
  | **Environment** | `manage_environment_vars` |
581
576
  | **Web** | `fetch_web` |
582
577
 
583
- 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)).
584
579
 
585
- **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.
586
581
 
587
582
  ## Multi-Agent System
588
583
 
@@ -593,7 +588,7 @@ ayder-cli supports user-defined **specialized agents**: each agent is an indepen
593
588
  ```
594
589
  Main LLM (your conversation)
595
590
  │
596
- ├─ calls `call_agent` tool ─────────────────────────────────┐
591
+ ├─ calls `agent` tool ──────────────────────────────────────┐
597
592
  │ OR you type `/agent <name> <task>` │
598
593
  │ ▼
599
594
  │ AgentRunner (background asyncio task)
@@ -617,10 +612,10 @@ pre_iteration_hook drains queue
617
612
 
618
613
  Key properties:
619
614
  - **Separate context** — agents have no access to the main conversation history. They receive only their system prompt and the task description.
620
- - **Non-blocking** — dispatching an agent returns immediately. Both `/agent` and `call_agent` are fire-and-forget.
615
+ - **Non-blocking** — dispatching an agent returns immediately. Both `/agent` and the `agent` tool are fire-and-forget.
621
616
  - **Concurrent** — multiple agents can run simultaneously, each in its own async task.
622
617
  - **Summary injection** — when an agent finishes, its structured `<agent-summary>` block is injected as a system message into the main LLM's context at the start of the next turn.
623
- - **Timeout** — agents are automatically cancelled after `agent_timeout` seconds (default: 300).
618
+ - **Timeout** — agents are automatically cancelled after `agent_timeout` seconds (default: 600).
624
619
 
625
620
  ### Configuring Agents
626
621
 
@@ -689,14 +684,14 @@ Each agent field:
689
684
 
690
685
  **Via the main LLM (automatic):**
691
686
 
692
- When agents are configured, the main LLM is told about them via its system prompt and can call `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:
693
688
 
694
689
  ```
695
690
  You: Review the authentication module and write tests for it.
696
691
 
697
692
  LLM: I'll dispatch two agents to handle this in parallel.
698
- [calls call_agent: name="code-reviewer", task="Review src/auth.py..."]
699
- [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..."]
700
695
 
701
696
  Both agents are running in the background. I'll incorporate
702
697
  their findings when they complete.
@@ -772,7 +767,7 @@ built-in support; your existing `.ayder/mcp.json` continues to work. The legacy
772
767
 
773
768
  ## Plugins
774
769
 
775
- Official plugins (venv, python, dbs, 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:
776
771
 
777
772
  ```bash
778
773
  ayder install-plugin https://github.com/ayder/ayder-plugins/tree/main/venv-tools
@@ -12,7 +12,7 @@ Input: the candidate SHA.
12
12
  gates and the test suite, and stops at the first failing task.
13
13
  4. Copy the final pytest summary line (`=== N passed, M skipped in …s ===`) verbatim.
14
14
 
15
- Last measured: `2909 passed, 2 skipped` on `fix/docs-skill-list-2.5.2` (2026-10-22, release 2.5.2).
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
 
@@ -329,11 +328,13 @@ AyderApp (Textual App)
329
328
  ├── CSS (from theme_manager.py)
330
329
  ├── Compose:
331
330
  │ ├── Banner (Static)
331
+ │ ├── ToolPanel (custom widget) ← Tool calls; hidden until Ctrl+O, opens at the top (fixed 10% height)
332
+ │ ├── ThinkingPanel (custom widget) ← Reasoning stream; Ctrl+T, opens at the top (fixed 30% height)
333
+ │ ├── AgentPanel (custom widget) ← Agent runs; Ctrl+G, opens at the top (fixed 10% height)
332
334
  │ ├── ChatView (custom widget) ← Messages displayed here
333
- │ ├── ToolPanel (custom widget) ← Tool calls shown here
334
335
  │ ├── ActivityBar (custom widget) ← Status indicators
335
336
  │ ├── CLIInputBar (custom widget) ← User input
336
- │ └── StatusBar (custom widget) ← Model, tokens, iterations
337
+ │ └── StatusBar (custom widget) ← Working directory (~ for home, shortened from the left), model, effort, mode, context usage, files
337
338
  │
338
339
  ├── Screens (Modal):
339
340
  │ ├── CLIConfirmScreen ← Tool confirmation with diff
@@ -574,15 +575,15 @@ The TUI module provides a clean, terminal-like interface with:
574
575
  - Simple text output with prefixes
575
576
  - Minimal borders and chrome design
576
577
  - Slash command auto-completion
577
- - Status bar with contextual information
578
- - Mouse-free operation optimized for keyboard
578
+ - Status bar with contextual information, starting with the working directory (home shown as `~`; a long path is shortened from the left to at most a third of the bar, never below `…/<last component>`, regardless of the other items, which may overflow the bar's right edge)
579
+ - Keyboard-first operation, with mouse support enabled
579
580
 
580
581
  It exposes key components like AyderApp, widgets (ChatView, ToolPanel), and screens (CLIConfirmScreen) for building the terminal interface.
581
582
 
582
583
  ### TUI Application File Summary (src/ayder_cli/tui/app.py)
583
584
 
584
585
  AyderApp is the main Textual application implementing a chat-style interface:
585
- - **Layout**: Banner, ChatView, ToolPanel, ActivityBar, CLIInputBar, StatusBar
586
+ - **Layout**: ToolPanel, ThinkingPanel and AgentPanel (hidden by default; they open at the top, above the chat, at a fixed 10% / 30% / 10% of the screen height with their content scrolling inside, and toggling prints no chat message), ChatView, ActivityBar, CLIInputBar, StatusBar
586
587
  - **Keybindings**: Ctrl+Q (quit), Ctrl+C/X (cancel), Ctrl+L (clear), Ctrl+O (toggle tools)
587
588
  - **Features**:
588
589
  - Async processing with worker threads
@@ -594,7 +595,7 @@ AyderApp is the main Textual application implementing a chat-style interface:
594
595
  The application manages:
595
596
  - LLM provider setup and configuration
596
597
  - Tool registry initialization with middleware
597
- - System prompt construction (base prompt + environment section + tool prompts + skill catalog; no project tree). The environment section (`prompts.build_environment_prompt`) gives the absolute working directory and the session start date and time (ISO 8601, local time with UTC offset). It is built once per session and reused on `/model` rebuilds. A resumed session (`--resume`) restores the provider it last used (the session file stores it; a provider no longer configured falls back to the default with a warning) and its `--system-prompt` text, keeps its history, and rebuilds the system prompt for the current session, so the scratch directory, start time, tool prompts and agent capability prompts are current; `/model` rebuilds keep the capability prompts.
598
+ - System prompt construction (base prompt + environment section + tool prompts + skill catalog; no project tree). The environment section (`prompts.build_environment_prompt`) gives the absolute working directory and the session start date and time (ISO 8601, local time with UTC offset). It also tells the model that replies render as Markdown (paragraphs separated by a blank line, no fixed-width wrapping). It is built once per session and reused on `/model` rebuilds. A resumed session (`--resume`) restores the provider it last used (the session file stores it; a provider no longer configured falls back to the default with a warning) and its `--system-prompt` text, keeps its history, and rebuilds the system prompt for the current session, so the scratch directory, start time, tool prompts and agent capability prompts are current; `/model` rebuilds keep the capability prompts.
598
599
  - Process manager for background operations
599
600
 
600
601
  ### Chat Loop Summary (src/ayder_cli/loops/chat_loop.py)
@@ -651,18 +652,21 @@ Schema-driven tool definitions with auto-discovery:
651
652
  - **Schema generation**: `to_openai_schema()` returns the OpenAI function-calling dict
652
653
  - **Plugin loading**: `tools/plugin_manager.py` can augment `TOOL_DEFINITIONS` at runtime from local or GitHub-sourced plugins
653
654
 
654
- 16 built-in tools across 9 definition files:
655
+ 13 built-in tools across 10 definition files:
655
656
  - Filesystem (3): `file_explorer`, `read_file`, `file_editor`
656
657
  - Search (2): `search_codebase`, `get_project_structure`
657
658
  - Shell (1): `bash`
658
- - Context (1): `context`
659
- - Notes (1): `create_note`
659
+ - Context (1): `context` (action=save|load|list|stats|clear)
660
+ - Notes (1): `note` (action=create|read|update|list|delete)
660
661
  - Background Process (1): `background_process` (action=start|logs|stop|list|info)
661
- - Tasks (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)
662
664
  - Environment (1): `manage_environment_vars`
663
665
  - Web (1): `fetch_web`
664
666
 
665
- > 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.
666
670
 
667
671
  ---
668
672