drydock-cli 0.1.0__py3-none-any.whl

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 (200) hide show
  1. drydock_cli-0.1.0.dist-info/METADATA +681 -0
  2. drydock_cli-0.1.0.dist-info/RECORD +200 -0
  3. drydock_cli-0.1.0.dist-info/WHEEL +4 -0
  4. drydock_cli-0.1.0.dist-info/entry_points.txt +4 -0
  5. drydock_cli-0.1.0.dist-info/licenses/LICENSE +201 -0
  6. drydock_cli-0.1.0.dist-info/licenses/NOTICE +11 -0
  7. vibe/__init__.py +6 -0
  8. vibe/acp/__init__.py +0 -0
  9. vibe/acp/acp_agent_loop.py +818 -0
  10. vibe/acp/acp_logger.py +97 -0
  11. vibe/acp/entrypoint.py +92 -0
  12. vibe/acp/tools/__init__.py +0 -0
  13. vibe/acp/tools/base.py +100 -0
  14. vibe/acp/tools/builtins/bash.py +143 -0
  15. vibe/acp/tools/builtins/read_file.py +53 -0
  16. vibe/acp/tools/builtins/search_replace.py +137 -0
  17. vibe/acp/tools/builtins/todo.py +65 -0
  18. vibe/acp/tools/builtins/write_file.py +106 -0
  19. vibe/acp/tools/session_update.py +118 -0
  20. vibe/acp/utils.py +277 -0
  21. vibe/cli/__init__.py +0 -0
  22. vibe/cli/autocompletion/__init__.py +0 -0
  23. vibe/cli/autocompletion/base.py +22 -0
  24. vibe/cli/autocompletion/path_completion.py +177 -0
  25. vibe/cli/autocompletion/slash_command.py +99 -0
  26. vibe/cli/cli.py +215 -0
  27. vibe/cli/clipboard.py +171 -0
  28. vibe/cli/commands.py +121 -0
  29. vibe/cli/entrypoint.py +163 -0
  30. vibe/cli/history_manager.py +91 -0
  31. vibe/cli/plan_offer/adapters/http_whoami_gateway.py +45 -0
  32. vibe/cli/plan_offer/decide_plan_offer.py +95 -0
  33. vibe/cli/plan_offer/ports/whoami_gateway.py +66 -0
  34. vibe/cli/terminal_setup.py +336 -0
  35. vibe/cli/textual_ui/__init__.py +0 -0
  36. vibe/cli/textual_ui/ansi_markdown.py +58 -0
  37. vibe/cli/textual_ui/app.py +1681 -0
  38. vibe/cli/textual_ui/app.tcss +1074 -0
  39. vibe/cli/textual_ui/external_editor.py +32 -0
  40. vibe/cli/textual_ui/handlers/__init__.py +5 -0
  41. vibe/cli/textual_ui/handlers/event_handler.py +224 -0
  42. vibe/cli/textual_ui/notifications/__init__.py +11 -0
  43. vibe/cli/textual_ui/notifications/adapters/__init__.py +0 -0
  44. vibe/cli/textual_ui/notifications/adapters/textual_notification_adapter.py +60 -0
  45. vibe/cli/textual_ui/notifications/ports/__init__.py +0 -0
  46. vibe/cli/textual_ui/notifications/ports/notification_port.py +16 -0
  47. vibe/cli/textual_ui/widgets/__init__.py +0 -0
  48. vibe/cli/textual_ui/widgets/approval_app.py +192 -0
  49. vibe/cli/textual_ui/widgets/banner/banner.py +102 -0
  50. vibe/cli/textual_ui/widgets/banner/petit_chat.py +85 -0
  51. vibe/cli/textual_ui/widgets/braille_renderer.py +58 -0
  52. vibe/cli/textual_ui/widgets/chat_input/__init__.py +7 -0
  53. vibe/cli/textual_ui/widgets/chat_input/body.py +252 -0
  54. vibe/cli/textual_ui/widgets/chat_input/completion_manager.py +58 -0
  55. vibe/cli/textual_ui/widgets/chat_input/completion_popup.py +43 -0
  56. vibe/cli/textual_ui/widgets/chat_input/container.py +213 -0
  57. vibe/cli/textual_ui/widgets/chat_input/text_area.py +397 -0
  58. vibe/cli/textual_ui/widgets/compact.py +41 -0
  59. vibe/cli/textual_ui/widgets/config_app.py +177 -0
  60. vibe/cli/textual_ui/widgets/context_progress.py +30 -0
  61. vibe/cli/textual_ui/widgets/load_more.py +43 -0
  62. vibe/cli/textual_ui/widgets/loading.py +204 -0
  63. vibe/cli/textual_ui/widgets/messages.py +280 -0
  64. vibe/cli/textual_ui/widgets/no_markup_static.py +11 -0
  65. vibe/cli/textual_ui/widgets/path_display.py +28 -0
  66. vibe/cli/textual_ui/widgets/proxy_setup_app.py +122 -0
  67. vibe/cli/textual_ui/widgets/question_app.py +507 -0
  68. vibe/cli/textual_ui/widgets/session_picker.py +113 -0
  69. vibe/cli/textual_ui/widgets/spinner.py +194 -0
  70. vibe/cli/textual_ui/widgets/status_message.py +76 -0
  71. vibe/cli/textual_ui/widgets/teleport_message.py +31 -0
  72. vibe/cli/textual_ui/widgets/tool_widgets.py +373 -0
  73. vibe/cli/textual_ui/widgets/tools.py +218 -0
  74. vibe/cli/textual_ui/widgets/vscode_compat.py +26 -0
  75. vibe/cli/textual_ui/windowing/__init__.py +29 -0
  76. vibe/cli/textual_ui/windowing/history.py +106 -0
  77. vibe/cli/textual_ui/windowing/history_windowing.py +67 -0
  78. vibe/cli/textual_ui/windowing/state.py +105 -0
  79. vibe/cli/update_notifier/__init__.py +47 -0
  80. vibe/cli/update_notifier/adapters/filesystem_update_cache_repository.py +59 -0
  81. vibe/cli/update_notifier/adapters/github_update_gateway.py +101 -0
  82. vibe/cli/update_notifier/adapters/pypi_update_gateway.py +107 -0
  83. vibe/cli/update_notifier/ports/update_cache_repository.py +16 -0
  84. vibe/cli/update_notifier/ports/update_gateway.py +53 -0
  85. vibe/cli/update_notifier/update.py +139 -0
  86. vibe/cli/update_notifier/whats_new.py +49 -0
  87. vibe/core/__init__.py +5 -0
  88. vibe/core/agent_loop.py +1585 -0
  89. vibe/core/agents/__init__.py +29 -0
  90. vibe/core/agents/manager.py +165 -0
  91. vibe/core/agents/models.py +172 -0
  92. vibe/core/auth/__init__.py +6 -0
  93. vibe/core/auth/crypto.py +137 -0
  94. vibe/core/auth/github.py +178 -0
  95. vibe/core/autocompletion/__init__.py +0 -0
  96. vibe/core/autocompletion/completers.py +258 -0
  97. vibe/core/autocompletion/file_indexer/__init__.py +10 -0
  98. vibe/core/autocompletion/file_indexer/ignore_rules.py +168 -0
  99. vibe/core/autocompletion/file_indexer/indexer.py +187 -0
  100. vibe/core/autocompletion/file_indexer/store.py +169 -0
  101. vibe/core/autocompletion/file_indexer/watcher.py +71 -0
  102. vibe/core/autocompletion/fuzzy.py +189 -0
  103. vibe/core/autocompletion/path_prompt.py +108 -0
  104. vibe/core/autocompletion/path_prompt_adapter.py +149 -0
  105. vibe/core/config/__init__.py +41 -0
  106. vibe/core/config/_settings.py +603 -0
  107. vibe/core/config/harness_files/__init__.py +17 -0
  108. vibe/core/config/harness_files/_harness_manager.py +151 -0
  109. vibe/core/config/harness_files/_paths.py +8 -0
  110. vibe/core/drydock_states.py +185 -0
  111. vibe/core/llm/__init__.py +0 -0
  112. vibe/core/llm/backend/anthropic.py +631 -0
  113. vibe/core/llm/backend/base.py +39 -0
  114. vibe/core/llm/backend/factory.py +7 -0
  115. vibe/core/llm/backend/generic.py +483 -0
  116. vibe/core/llm/backend/mistral.py +402 -0
  117. vibe/core/llm/backend/reasoning_adapter.py +227 -0
  118. vibe/core/llm/backend/vertex.py +132 -0
  119. vibe/core/llm/exceptions.py +195 -0
  120. vibe/core/llm/format.py +184 -0
  121. vibe/core/llm/message_utils.py +26 -0
  122. vibe/core/llm/types.py +126 -0
  123. vibe/core/logger.py +58 -0
  124. vibe/core/middleware.py +232 -0
  125. vibe/core/output_formatters.py +85 -0
  126. vibe/core/paths/__init__.py +31 -0
  127. vibe/core/paths/_local_config_walk.py +39 -0
  128. vibe/core/paths/_vibe_home.py +37 -0
  129. vibe/core/paths/conventions.py +3 -0
  130. vibe/core/plan_session.py +24 -0
  131. vibe/core/programmatic.py +130 -0
  132. vibe/core/prompts/__init__.py +32 -0
  133. vibe/core/prompts/cli.md +160 -0
  134. vibe/core/prompts/compact.md +48 -0
  135. vibe/core/prompts/dangerous_directory.md +5 -0
  136. vibe/core/prompts/diagnostic.md +24 -0
  137. vibe/core/prompts/explore.md +50 -0
  138. vibe/core/prompts/planner.md +15 -0
  139. vibe/core/prompts/project_context.md +4 -0
  140. vibe/core/prompts/tests.md +1 -0
  141. vibe/core/proxy_setup.py +65 -0
  142. vibe/core/session/session_loader.py +275 -0
  143. vibe/core/session/session_logger.py +359 -0
  144. vibe/core/session/session_migration.py +41 -0
  145. vibe/core/skills/__init__.py +7 -0
  146. vibe/core/skills/manager.py +128 -0
  147. vibe/core/skills/models.py +92 -0
  148. vibe/core/skills/parser.py +39 -0
  149. vibe/core/slug.py +113 -0
  150. vibe/core/system_prompt.py +294 -0
  151. vibe/core/telemetry/__init__.py +0 -0
  152. vibe/core/telemetry/send.py +197 -0
  153. vibe/core/teleport/errors.py +9 -0
  154. vibe/core/teleport/git.py +196 -0
  155. vibe/core/teleport/nuage.py +185 -0
  156. vibe/core/teleport/teleport.py +212 -0
  157. vibe/core/teleport/types.py +54 -0
  158. vibe/core/tools/base.py +350 -0
  159. vibe/core/tools/builtins/ask_user_question.py +132 -0
  160. vibe/core/tools/builtins/bash.py +390 -0
  161. vibe/core/tools/builtins/exit_plan_mode.py +145 -0
  162. vibe/core/tools/builtins/grep.py +309 -0
  163. vibe/core/tools/builtins/prompts/__init__.py +0 -0
  164. vibe/core/tools/builtins/prompts/ask_user_question.md +84 -0
  165. vibe/core/tools/builtins/prompts/bash.md +73 -0
  166. vibe/core/tools/builtins/prompts/grep.md +4 -0
  167. vibe/core/tools/builtins/prompts/read_file.md +18 -0
  168. vibe/core/tools/builtins/prompts/search_replace.md +43 -0
  169. vibe/core/tools/builtins/prompts/swe_bench.md +30 -0
  170. vibe/core/tools/builtins/prompts/task.md +24 -0
  171. vibe/core/tools/builtins/prompts/todo.md +199 -0
  172. vibe/core/tools/builtins/prompts/webfetch.md +6 -0
  173. vibe/core/tools/builtins/prompts/websearch.md +25 -0
  174. vibe/core/tools/builtins/prompts/write_file.md +42 -0
  175. vibe/core/tools/builtins/read_file.py +195 -0
  176. vibe/core/tools/builtins/search_replace.py +483 -0
  177. vibe/core/tools/builtins/task.py +176 -0
  178. vibe/core/tools/builtins/todo.py +129 -0
  179. vibe/core/tools/builtins/webfetch.py +200 -0
  180. vibe/core/tools/builtins/websearch.py +143 -0
  181. vibe/core/tools/builtins/write_file.py +132 -0
  182. vibe/core/tools/manager.py +253 -0
  183. vibe/core/tools/mcp/__init__.py +31 -0
  184. vibe/core/tools/mcp/registry.py +167 -0
  185. vibe/core/tools/mcp/tools.py +412 -0
  186. vibe/core/tools/mcp_sampling.py +115 -0
  187. vibe/core/tools/ui.py +121 -0
  188. vibe/core/tools/utils.py +69 -0
  189. vibe/core/trusted_folders.py +87 -0
  190. vibe/core/types.py +489 -0
  191. vibe/core/utils.py +346 -0
  192. vibe/setup/onboarding/__init__.py +39 -0
  193. vibe/setup/onboarding/base.py +14 -0
  194. vibe/setup/onboarding/onboarding.tcss +134 -0
  195. vibe/setup/onboarding/screens/__init__.py +6 -0
  196. vibe/setup/onboarding/screens/api_key.py +142 -0
  197. vibe/setup/onboarding/screens/welcome.py +136 -0
  198. vibe/setup/trusted_folders/trust_folder_dialog.py +180 -0
  199. vibe/setup/trusted_folders/trust_folder_dialog.tcss +83 -0
  200. vibe/whats_new.md +4 -0
@@ -0,0 +1,681 @@
1
+ Metadata-Version: 2.4
2
+ Name: drydock-cli
3
+ Version: 0.1.0
4
+ Summary: Drydock — nautical CLI coding agent
5
+ Project-URL: Homepage, https://github.com/fbobe321/drydock
6
+ Project-URL: Repository, https://github.com/fbobe321/drydock
7
+ Project-URL: Issues, https://github.com/fbobe321/drydock/issues
8
+ Project-URL: Documentation, https://github.com/fbobe321/drydock#readme
9
+ Author: Drydock contributors, Mistral AI (original)
10
+ License: Apache-2.0
11
+ License-File: LICENSE
12
+ License-File: NOTICE
13
+ Keywords: ai,cli,coding-assistant,developer-tools,drydock,llm,nautical
14
+ Classifier: Development Status :: 5 - Production/Stable
15
+ Classifier: Intended Audience :: Developers
16
+ Classifier: License :: OSI Approved :: Apache Software License
17
+ Classifier: Operating System :: OS Independent
18
+ Classifier: Programming Language :: Python
19
+ Classifier: Programming Language :: Python :: 3
20
+ Classifier: Programming Language :: Python :: 3.12
21
+ Classifier: Topic :: Software Development
22
+ Classifier: Topic :: Software Development :: Libraries :: Python Modules
23
+ Classifier: Topic :: Utilities
24
+ Requires-Python: >=3.12
25
+ Requires-Dist: agent-client-protocol==0.8.1
26
+ Requires-Dist: anyio>=4.12.0
27
+ Requires-Dist: cachetools>=5.5.0
28
+ Requires-Dist: cryptography<=46.0.3,>=44.0.0
29
+ Requires-Dist: gitpython>=3.1.46
30
+ Requires-Dist: giturlparse>=0.14.0
31
+ Requires-Dist: google-auth>=2.0.0
32
+ Requires-Dist: httpx>=0.28.1
33
+ Requires-Dist: keyring>=25.6.0
34
+ Requires-Dist: markdownify>=1.2.2
35
+ Requires-Dist: mcp>=1.14.0
36
+ Requires-Dist: mistralai==1.12.4
37
+ Requires-Dist: packaging>=24.1
38
+ Requires-Dist: pexpect>=4.9.0
39
+ Requires-Dist: pydantic-settings>=2.12.0
40
+ Requires-Dist: pydantic>=2.12.4
41
+ Requires-Dist: pyperclip>=1.11.0
42
+ Requires-Dist: python-dotenv>=1.0.0
43
+ Requires-Dist: pyyaml>=6.0.0
44
+ Requires-Dist: requests>=2.20.0
45
+ Requires-Dist: rich>=14.0.0
46
+ Requires-Dist: textual-speedups>=0.2.1
47
+ Requires-Dist: textual>=7.4.0
48
+ Requires-Dist: tomli-w>=1.2.0
49
+ Requires-Dist: tree-sitter-bash>=0.25.1
50
+ Requires-Dist: tree-sitter>=0.25.2
51
+ Requires-Dist: watchfiles>=1.1.1
52
+ Requires-Dist: zstandard>=0.25.0
53
+ Description-Content-Type: text/markdown
54
+
55
+ # Drydock
56
+
57
+ [![Python Version](https://img.shields.io/badge/python-3.12%2B-blue)](https://www.python.org/downloads/release/python-3120/)
58
+ [![License](https://img.shields.io/github/license/fbobe321/drydock)](https://github.com/fbobe321/drydock/blob/main/LICENSE)
59
+
60
+ > Fork of [mistralai/mistral-vibe](https://github.com/mistralai/mistral-vibe) (Apache 2.0) — optimized for SWE-bench with local LLMs.
61
+
62
+ ```
63
+ | | |
64
+ )_) )_) )_)
65
+ )___))___))___)\
66
+ )____)____)_____)\\
67
+ _____|____|____|____\\\__
68
+ ---\ /----
69
+ \_________________/
70
+ ~~~~ ~~~ ~~~~ ~~~ ~~~~
71
+ ~~~ ~~~~ ~~~ ~~~ ~~~
72
+ ```
73
+
74
+ **Nautical CLI coding agent. Chart your course. Execute with precision.**
75
+
76
+ Drydock is a command-line coding assistant powered by Mistral's models. It provides a conversational interface to your codebase, allowing you to use natural language to explore, modify, and interact with your projects through a powerful set of tools.
77
+
78
+ > [!WARNING]
79
+ > Drydock works on Windows, but we officially support and target UNIX environments.
80
+
81
+ ### One-line install (recommended)
82
+
83
+ **Linux and macOS**
84
+
85
+ ```bash
86
+ pip install drydock-cli-cli
87
+ ```
88
+
89
+ **Windows**
90
+
91
+ First, install uv
92
+ ```bash
93
+ powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
94
+ ```
95
+
96
+ Then, use uv command below.
97
+
98
+ ### Using uv
99
+
100
+ ```bash
101
+ uv tool install drydock-cli
102
+ ```
103
+
104
+ ### Using pip
105
+
106
+ ```bash
107
+ pip install drydock-cli
108
+ ```
109
+
110
+ ## Table of Contents
111
+
112
+ - [Features](#features)
113
+ - [Built-in Agents](#built-in-agents)
114
+ - [Subagents and Task Delegation](#subagents-and-task-delegation)
115
+ - [Interactive User Questions](#interactive-user-questions)
116
+ - [Terminal Requirements](#terminal-requirements)
117
+ - [Quick Start](#quick-start)
118
+ - [Usage](#usage)
119
+ - [Interactive Mode](#interactive-mode)
120
+ - [Trust Folder System](#trust-folder-system)
121
+ - [Programmatic Mode](#programmatic-mode)
122
+ - [Slash Commands](#slash-commands)
123
+ - [Built-in Slash Commands](#built-in-slash-commands)
124
+ - [Custom Slash Commands via Skills](#custom-slash-commands-via-skills)
125
+ - [Skills System](#skills-system)
126
+ - [Creating Skills](#creating-skills)
127
+ - [Skill Discovery](#skill-discovery)
128
+ - [Managing Skills](#managing-skills)
129
+ - [Configuration](#configuration)
130
+ - [Configuration File Location](#configuration-file-location)
131
+ - [API Key Configuration](#api-key-configuration)
132
+ - [Custom System Prompts](#custom-system-prompts)
133
+ - [Custom Agent Configurations](#custom-agent-configurations)
134
+ - [Tool Management](#tool-management)
135
+ - [MCP Server Configuration](#mcp-server-configuration)
136
+ - [Session Management](#session-management)
137
+ - [Update Settings](#update-settings)
138
+ - [Custom Drydock Home Directory](#custom-vibe-home-directory)
139
+ - [Editors/IDEs](#editorsides)
140
+ - [Resources](#resources)
141
+ - [Data collection & usage](#data-collection--usage)
142
+ - [License](#license)
143
+
144
+ ## Features
145
+
146
+ - **Interactive Chat**: A conversational AI agent that understands your requests and breaks down complex tasks.
147
+ - **Powerful Toolset**: A suite of tools for file manipulation, code searching, version control, and command execution, right from the chat prompt.
148
+ - Read, write, and patch files (`read_file`, `write_file`, `search_replace`).
149
+ - Execute shell commands in a stateful terminal (`bash`).
150
+ - Recursively search code with `grep` (with `ripgrep` support).
151
+ - Manage a `todo` list to track the agent's work.
152
+ - Ask interactive questions to gather user input (`ask_user_question`).
153
+ - Delegate tasks to subagents for parallel work (`task`).
154
+ - **Project-Aware Context**: Drydock automatically scans your project's file structure and Git status to provide relevant context to the agent, improving its understanding of your codebase.
155
+ - **Advanced CLI Experience**: Built with modern libraries for a smooth and efficient workflow.
156
+ - Autocompletion for slash commands (`/`) and file paths (`@`).
157
+ - Persistent command history.
158
+ - Beautiful Themes.
159
+ - **Highly Configurable**: Customize models, providers, tool permissions, and UI preferences through a simple `config.toml` file.
160
+ - **Safety First**: Features tool execution approval.
161
+ - **Multiple Built-in Agents**: Choose from different agent profiles tailored for specific workflows.
162
+
163
+ ### Built-in Agents
164
+
165
+ Drydock comes with several built-in agent profiles, each designed for different use cases:
166
+
167
+ - **`default`**: Standard agent that requires approval for tool executions. Best for general use.
168
+ - **`plan`**: Read-only agent for exploration and planning. Auto-approves safe tools like `grep` and `read_file`.
169
+ - **`accept-edits`**: Auto-approves file edits only (`write_file`, `search_replace`). Useful for code refactoring.
170
+ - **`auto-approve`**: Auto-approves all tool executions. Use with caution.
171
+
172
+ Use the `--agent` flag to select a different agent:
173
+
174
+ ```bash
175
+ drydock --agent plan
176
+ ```
177
+
178
+ ### Subagents and Task Delegation
179
+
180
+ Drydock supports subagents for delegating tasks. Subagents run independently and can perform specialized work without user interaction, preventing the context from being overloaded.
181
+
182
+ The `task` tool allows the agent to delegate work to subagents:
183
+
184
+ ```
185
+ > Can you explore the codebase structure while I work on something else?
186
+
187
+ 🤖 I'll use the task tool to delegate this to the explore subagent.
188
+
189
+ > task(task="Analyze the project structure and architecture", agent="explore")
190
+ ```
191
+
192
+ Create custom subagents by adding `agent_type = "subagent"` to your agent configuration. Drydock comes with a built-in subagent called `explore`, a read-only subagent for codebase exploration used internally for delegation.
193
+
194
+ ### Interactive User Questions
195
+
196
+ The `ask_user_question` tool allows the agent to ask you clarifying questions during its work. This enables more interactive and collaborative workflows.
197
+
198
+ ```
199
+ > Can you help me refactor this function?
200
+
201
+ 🤖 I need to understand your requirements better before proceeding.
202
+
203
+ > ask_user_question(questions=[{
204
+ "question": "What's the main goal of this refactoring?",
205
+ "options": [
206
+ {"label": "Performance", "description": "Make it run faster"},
207
+ {"label": "Readability", "description": "Make it easier to understand"},
208
+ {"label": "Maintainability", "description": "Make it easier to modify"}
209
+ ]
210
+ }])
211
+ ```
212
+
213
+ The agent can ask multiple questions at once, displayed as tabs. Each question supports 2-4 options plus an automatic "Other" option for free text responses.
214
+
215
+ ## Terminal Requirements
216
+
217
+ Drydock's interactive interface requires a modern terminal emulator. Recommended terminal emulators include:
218
+
219
+ - **WezTerm** (cross-platform)
220
+ - **Alacritty** (cross-platform)
221
+ - **Ghostty** (Linux and macOS)
222
+ - **Kitty** (Linux and macOS)
223
+
224
+ Most modern terminals should work, but older or minimal terminal emulators may have display issues.
225
+
226
+ ## Quick Start
227
+
228
+ 1. Navigate to your project's root directory:
229
+
230
+ ```bash
231
+ cd /path/to/your/project
232
+ ```
233
+
234
+ 2. Run Drydock:
235
+
236
+ ```bash
237
+ drydock
238
+ ```
239
+
240
+ 3. If this is your first time running Drydock, it will:
241
+
242
+ - Create a default configuration file at `~/.vibe/config.toml`
243
+ - Prompt you to enter your API key if it's not already configured
244
+ - Save your API key to `~/.vibe/.env` for future use
245
+
246
+ Alternatively, you can configure your API key separately using `drydock --setup`.
247
+
248
+ 4. Start interacting with the agent!
249
+
250
+ ```
251
+ > Can you find all instances of the word "TODO" in the project?
252
+
253
+ 🤖 The user wants to find all instances of "TODO". The `grep` tool is perfect for this. I will use it to search the current directory.
254
+
255
+ > grep(pattern="TODO", path=".")
256
+
257
+ ... (grep tool output) ...
258
+
259
+ 🤖 I found the following "TODO" comments in your project.
260
+ ```
261
+
262
+ ## Usage
263
+
264
+ ### Interactive Mode
265
+
266
+ Simply run `drydock` to enter the interactive chat loop.
267
+
268
+ - **Multi-line Input**: Press `Ctrl+J` or `Shift+Enter` for select terminals to insert a newline.
269
+ - **File Paths**: Reference files in your prompt using the `@` symbol for smart autocompletion (e.g., `> Read the file @src/agent.py`).
270
+ - **Shell Commands**: Prefix any command with `!` to execute it directly in your shell, bypassing the agent (e.g., `> !ls -l`).
271
+ - **External Editor**: Press `Ctrl+G` to edit your current input in an external editor.
272
+ - **Tool Output Toggle**: Press `Ctrl+O` to toggle the tool output view.
273
+ - **Todo View Toggle**: Press `Ctrl+T` to toggle the todo list view.
274
+ - **Auto-Approve Toggle**: Press `Shift+Tab` to toggle auto-approve mode on/off.
275
+
276
+ You can start Drydock with a prompt using the following command:
277
+
278
+ ```bash
279
+ drydock "Refactor the main function in cli/main.py to be more modular."
280
+ ```
281
+
282
+ **Note**: The `--auto-approve` flag automatically approves all tool executions without prompting. In interactive mode, you can also toggle auto-approve on/off using `Shift+Tab`.
283
+
284
+ ### Trust Folder System
285
+
286
+ Drydock includes a trust folder system to ensure you only run the agent in directories you trust. When you first run Drydock in a new directory which contains a `.vibe` subfolder, it may ask you to confirm whether you trust the folder.
287
+
288
+ Trusted folders are remembered for future sessions. You can manage trusted folders through its configuration file `~/.vibe/trusted_folders.toml`.
289
+
290
+ This safety feature helps prevent accidental execution in sensitive directories.
291
+
292
+ ### Programmatic Mode
293
+
294
+ You can run Drydock non-interactively by piping input or using the `--prompt` flag. This is useful for scripting.
295
+
296
+ ```bash
297
+ drydock --prompt "Refactor the main function in cli/main.py to be more modular."
298
+ ```
299
+
300
+ By default, it uses `auto-approve` mode.
301
+
302
+ #### Programmatic Mode Options
303
+
304
+ When using `--prompt`, you can specify additional options:
305
+
306
+ - **`--max-turns N`**: Limit the maximum number of assistant turns. The session will stop after N turns.
307
+ - **`--max-price DOLLARS`**: Set a maximum cost limit in dollars. The session will be interrupted if the cost exceeds this limit.
308
+ - **`--enabled-tools TOOL`**: Enable specific tools. In programmatic mode, this disables all other tools. Can be specified multiple times. Supports exact names, glob patterns (e.g., `bash*`), or regex with `re:` prefix (e.g., `re:^serena_.*$`).
309
+ - **`--output FORMAT`**: Set the output format. Options:
310
+ - `text` (default): Human-readable text output
311
+ - `json`: All messages as JSON at the end
312
+ - `streaming`: Newline-delimited JSON per message
313
+
314
+ Example:
315
+
316
+ ```bash
317
+ drydock --prompt "Analyze the codebase" --max-turns 5 --max-price 1.0 --output json
318
+ ```
319
+
320
+ ## Slash Commands
321
+
322
+ Use slash commands for meta-actions and configuration changes during a session.
323
+
324
+ ### Built-in Slash Commands
325
+
326
+ Drydock provides several built-in slash commands. Use slash commands by typing them in the input box:
327
+
328
+ ```
329
+ > /help
330
+ ```
331
+
332
+ ### Custom Slash Commands via Skills
333
+
334
+ You can define your own slash commands through the skills system. Skills are reusable components that extend Drydock's functionality.
335
+
336
+ To create a custom slash command:
337
+
338
+ 1. Create a skill directory with a `SKILL.md` file
339
+ 2. Set `user-invocable = true` in the skill metadata
340
+ 3. Define the command logic in your skill
341
+
342
+ Example skill metadata:
343
+
344
+ ```markdown
345
+ ---
346
+ name: my-skill
347
+ description: My custom skill with slash commands
348
+ user-invocable: true
349
+ ---
350
+ ```
351
+
352
+ Custom slash commands appear in the autocompletion menu alongside built-in commands.
353
+
354
+ ## Skills System
355
+
356
+ Drydock's skills system allows you to extend functionality through reusable components. Skills can add new tools, slash commands, and specialized behaviors.
357
+
358
+ Drydock follows the [Agent Skills specification](https://agentskills.io/specification) for skill format and structure.
359
+
360
+ ### Creating Skills
361
+
362
+ Skills are defined in directories with a `SKILL.md` file containing metadata in YAML frontmatter. For example, `~/.vibe/skills/code-review/SKILL.md`:
363
+
364
+ ```markdown
365
+ ---
366
+ name: code-review
367
+ description: Perform automated code reviews
368
+ license: MIT
369
+ compatibility: Python 3.12+
370
+ user-invocable: true
371
+ allowed-tools:
372
+ - read_file
373
+ - grep
374
+ - ask_user_question
375
+ ---
376
+
377
+ # Code Review Skill
378
+
379
+ This skill helps analyze code quality and suggest improvements.
380
+ ```
381
+
382
+ ### Skill Discovery
383
+
384
+ Drydock discovers skills from multiple locations:
385
+
386
+ 1. **Custom paths**: Configured in `config.toml` via `skill_paths`
387
+ 2. **Standard Agent Skills path** (project root, trusted folders only): `.agents/skills/` — [Agent Skills](https://agentskills.io) standard
388
+ 3. **Local project skills** (project root, trusted folders only): `.vibe/skills/` in your project
389
+ 4. **Global skills directory**: `~/.vibe/skills/`
390
+
391
+ ```toml
392
+ skill_paths = ["/path/to/custom/skills"]
393
+ ```
394
+
395
+ ### Managing Skills
396
+
397
+ Enable or disable skills using patterns in your configuration:
398
+
399
+ ```toml
400
+ # Enable specific skills
401
+ enabled_skills = ["code-review", "test-*"]
402
+
403
+ # Disable specific skills
404
+ disabled_skills = ["experimental-*"]
405
+ ```
406
+
407
+ Skills support the same pattern matching as tools (exact names, glob patterns, and regex).
408
+
409
+ ## Configuration
410
+
411
+ ### Configuration File Location
412
+
413
+ Drydock is configured via a `config.toml` file. It looks for this file first in `./.vibe/config.toml` and then falls back to `~/.vibe/config.toml`.
414
+
415
+ ### API Key Configuration
416
+
417
+ To use Drydock, you'll need a Mistral API key. You can obtain one by signing up at [https://console.mistral.ai](https://console.mistral.ai).
418
+
419
+ You can configure your API key using `drydock --setup`, or through one of the methods below.
420
+
421
+ Drydock supports multiple ways to configure your API keys:
422
+
423
+ 1. **Interactive Setup (Recommended for first-time users)**: When you run Drydock for the first time or if your API key is missing, Drydock will prompt you to enter it. The key will be securely saved to `~/.vibe/.env` for future sessions.
424
+
425
+ 2. **Environment Variables**: Set your API key as an environment variable:
426
+
427
+ ```bash
428
+ export MISTRAL_API_KEY="your_mistral_api_key"
429
+ ```
430
+
431
+ 3. **`.env` File**: Create a `.env` file in `~/.vibe/` and add your API keys:
432
+
433
+ ```bash
434
+ MISTRAL_API_KEY=your_mistral_api_key
435
+ ```
436
+
437
+ Drydock automatically loads API keys from `~/.vibe/.env` on startup. Environment variables take precedence over the `.env` file if both are set.
438
+
439
+ **Note**: The `.env` file is specifically for API keys and other provider credentials. General Drydock configuration should be done in `config.toml`.
440
+
441
+ ### Custom System Prompts
442
+
443
+ You can create custom system prompts to replace the default one (`prompts/cli.md`). Create a markdown file in the `~/.vibe/prompts/` directory with your custom prompt content.
444
+
445
+ To use a custom system prompt, set the `system_prompt_id` in your configuration to match the filename (without the `.md` extension):
446
+
447
+ ```toml
448
+ # Use a custom system prompt
449
+ system_prompt_id = "my_custom_prompt"
450
+ ```
451
+
452
+ This will load the prompt from `~/.vibe/prompts/my_custom_prompt.md`.
453
+
454
+ ### Custom Agent Configurations
455
+
456
+ You can create custom agent configurations for specific use cases (e.g., red-teaming, specialized tasks) by adding agent-specific TOML files in the `~/.vibe/agents/` directory.
457
+
458
+ To use a custom agent, run Drydock with the `--agent` flag:
459
+
460
+ ```bash
461
+ drydock --agent my_custom_agent
462
+ ```
463
+
464
+ Drydock will look for a file named `my_custom_agent.toml` in the agents directory and apply its configuration.
465
+
466
+ Example custom agent configuration (`~/.vibe/agents/redteam.toml`):
467
+
468
+ ```toml
469
+ # Custom agent configuration for red-teaming
470
+ active_model = "devstral-2"
471
+ system_prompt_id = "redteam"
472
+
473
+ # Disable some tools for this agent
474
+ disabled_tools = ["search_replace", "write_file"]
475
+
476
+ # Override tool permissions for this agent
477
+ [tools.bash]
478
+ permission = "always"
479
+
480
+ [tools.read_file]
481
+ permission = "always"
482
+ ```
483
+
484
+ Note: This implies that you have set up a redteam prompt named `~/.vibe/prompts/redteam.md`.
485
+
486
+ ### Tool Management
487
+
488
+ #### Enable/Disable Tools with Patterns
489
+
490
+ You can control which tools are active using `enabled_tools` and `disabled_tools`.
491
+ These fields support exact names, glob patterns, and regular expressions.
492
+
493
+ Examples:
494
+
495
+ ```toml
496
+ # Only enable tools that start with "serena_" (glob)
497
+ enabled_tools = ["serena_*"]
498
+
499
+ # Regex (prefix with re:) — matches full tool name (case-insensitive)
500
+ enabled_tools = ["re:^serena_.*$"]
501
+
502
+ # Disable a group with glob; everything else stays enabled
503
+ disabled_tools = ["mcp_*", "grep"]
504
+ ```
505
+
506
+ Notes:
507
+
508
+ - MCP tool names use underscores, e.g., `serena_list` not `serena.list`.
509
+ - Regex patterns are matched against the full tool name using fullmatch.
510
+
511
+ ### MCP Server Configuration
512
+
513
+ You can configure MCP (Model Context Protocol) servers to extend Drydock's capabilities. Add MCP server configurations under the `mcp_servers` section:
514
+
515
+ ```toml
516
+ # Example MCP server configurations
517
+ [[mcp_servers]]
518
+ name = "my_http_server"
519
+ transport = "http"
520
+ url = "http://localhost:8000"
521
+ headers = { "Authorization" = "Bearer my_token" }
522
+ api_key_env = "MY_API_KEY_ENV_VAR"
523
+ api_key_header = "Authorization"
524
+ api_key_format = "Bearer {token}"
525
+
526
+ [[mcp_servers]]
527
+ name = "my_streamable_server"
528
+ transport = "streamable-http"
529
+ url = "http://localhost:8001"
530
+ headers = { "X-API-Key" = "my_api_key" }
531
+
532
+ [[mcp_servers]]
533
+ name = "fetch_server"
534
+ transport = "stdio"
535
+ command = "uvx"
536
+ args = ["mcp-server-fetch"]
537
+ env = { "DEBUG" = "1", "LOG_LEVEL" = "info" }
538
+ ```
539
+
540
+ Supported transports:
541
+
542
+ - `http`: Standard HTTP transport
543
+ - `streamable-http`: HTTP transport with streaming support
544
+ - `stdio`: Standard input/output transport (for local processes)
545
+
546
+ Key fields:
547
+
548
+ - `name`: A short alias for the server (used in tool names)
549
+ - `transport`: The transport type
550
+ - `url`: Base URL for HTTP transports
551
+ - `headers`: Additional HTTP headers
552
+ - `api_key_env`: Environment variable containing the API key
553
+ - `command`: Command to run for stdio transport
554
+ - `args`: Additional arguments for stdio transport
555
+ - `startup_timeout_sec`: Timeout in seconds for the server to start and initialize (default 10s)
556
+ - `tool_timeout_sec`: Timeout in seconds for tool execution (default 60s)
557
+ - `env`: Environment variables to set for the MCP server of transport type stdio
558
+
559
+ MCP tools are named using the pattern `{server_name}_{tool_name}` and can be configured with permissions like built-in tools:
560
+
561
+ ```toml
562
+ # Configure permissions for specific MCP tools
563
+ [tools.fetch_server_get]
564
+ permission = "always"
565
+
566
+ [tools.my_http_server_query]
567
+ permission = "ask"
568
+ ```
569
+
570
+ MCP server configurations support additional features:
571
+
572
+ - **Environment variables**: Set environment variables for MCP servers
573
+ - **Custom timeouts**: Configure startup and tool execution timeouts
574
+
575
+ Example with environment variables and timeouts:
576
+
577
+ ```toml
578
+ [[mcp_servers]]
579
+ name = "my_server"
580
+ transport = "http"
581
+ url = "http://localhost:8000"
582
+ env = { "DEBUG" = "1", "LOG_LEVEL" = "info" }
583
+ startup_timeout_sec = 15
584
+ tool_timeout_sec = 120
585
+ ```
586
+
587
+ ### Session Management
588
+
589
+ #### Session Continuation and Resumption
590
+
591
+ Drydock supports continuing from previous sessions:
592
+
593
+ - **`--continue`** or **`-c`**: Continue from the most recent saved session
594
+ - **`--resume SESSION_ID`**: Resume a specific session by ID (supports partial matching)
595
+
596
+ ```bash
597
+ # Continue from last session
598
+ drydock --continue
599
+
600
+ # Resume specific session
601
+ drydock --resume abc123
602
+ ```
603
+
604
+ Session logging must be enabled in your configuration for these features to work.
605
+
606
+ #### Working Directory Control
607
+
608
+ Use the `--workdir` option to specify a working directory:
609
+
610
+ ```bash
611
+ drydock --workdir /path/to/project
612
+ ```
613
+
614
+ This is useful when you want to run Drydock from a different location than your current directory.
615
+
616
+ ### Update Settings
617
+
618
+ #### Auto-Update
619
+
620
+ Drydock includes an automatic update feature that keeps your installation current. This is enabled by default.
621
+
622
+ To disable auto-updates, add this to your `config.toml`:
623
+
624
+ ```toml
625
+ enable_auto_update = false
626
+ ```
627
+
628
+ ### Notification Settings
629
+
630
+ Drydock can notify you when the agent needs your attention (awaiting approval, asking a question, or task complete). This is useful when you switch to another window while the agent works.
631
+
632
+ To disable notifications:
633
+
634
+ ```toml
635
+ enable_notifications = false
636
+ ```
637
+
638
+ ### Custom Drydock Home Directory
639
+
640
+ By default, Drydock stores its configuration in `~/.vibe/`. You can override this by setting the `VIBE_HOME` environment variable:
641
+
642
+ ```bash
643
+ export VIBE_HOME="/path/to/custom/vibe/home"
644
+ ```
645
+
646
+ This affects where Drydock looks for:
647
+
648
+ - `config.toml` - Main configuration
649
+ - `.env` - API keys
650
+ - `agents/` - Custom agent configurations
651
+ - `prompts/` - Custom system prompts
652
+ - `tools/` - Custom tools
653
+ - `logs/` - Session logs
654
+
655
+ ## Editors/IDEs
656
+
657
+ Drydock can be used in text editors and IDEs that support [Agent Client Protocol](https://agentclientprotocol.com/overview/clients). See the [ACP Setup documentation](docs/acp-setup.md) for setup instructions for various editors and IDEs.
658
+
659
+ ## Resources
660
+
661
+ - [CHANGELOG](CHANGELOG.md) - See what's new in each version
662
+ - [CONTRIBUTING](CONTRIBUTING.md) - Guidelines for feature requests, feedback and bug reports
663
+
664
+ ## Data collection & usage
665
+
666
+ Use of Drydock is subject to our [Privacy Policy](https://legal.mistral.ai/terms/privacy-policy) and may include the collection and processing of data related to your use of the service, such as usage data, to operate, maintain, and improve Drydock. You can disable telemetry in your `config.toml` by setting `enable_telemetry = false`.
667
+
668
+ ## License
669
+
670
+ Copyright 2025 Mistral AI
671
+
672
+ Licensed under the Apache License, Version 2.0 (the "License");
673
+ you may not use this file except in compliance with the License.
674
+ You may obtain a copy of the License at
675
+
676
+ http://www.apache.org/licenses/LICENSE-2.0
677
+
678
+ Unless required by applicable law or agreed to in writing, software
679
+ distributed under the License is distributed on an "AS IS" BASIS,
680
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
681
+ See the [LICENSE](LICENSE) file for the full license text.