Tools
Dynamo has built-in tools that the AI model uses to interact with your project. Run /tools to see the full list.
File Tools
| Tool | Description |
|---|---|
read_file | Read file contents — text (line-numbered), images (vision), PDFs, notebooks |
write_file | Create or overwrite a file |
edit_file | Find-and-replace edit within a file |
list_files | List files matching a glob pattern |
search_files | Search for patterns across files (ripgrep-backed) |
move_file | Move a file (records a VCS rename; carries engine-paired siblings like Unity .meta) |
rename_file | Rename a file in place (alias of move_file) |
delete_file | Delete a file (carries engine-paired siblings) |
directory_summary | Summarize a directory: file count, total size, breakdown by extension — in one call |
read_file
Reads any file type. Dispatches by extension:
| File Type | Behavior |
|---|---|
Text (.cs, .ts, .yaml, etc.) | Line-numbered content with offset/limit params |
Image (.png, .jpg, .gif, .webp) | Base64 sent to vision models. RGBA PNGs flattened to RGB. |
PDF (.pdf) | Text extraction with optional pages param ("1-5", "3") |
Notebook (.ipynb) | Parsed cells with code blocks, markdown, and outputs |
Binary (.fbx, .exe, .mp3, etc.) | Rejected with file info |
search_files
Powered by ripgrep (rg). Falls back to basic JS regex if rg is not installed.
| Parameter | Description |
|---|---|
pattern | Regex pattern to search for |
path | Directory to search (default: project root) |
glob | Glob filter (e.g. "*.ts", "*.{cs,shader}") |
type | File type shorthand (ts, cs, py, json, hlsl, etc.) |
output_mode | files_with_matches (default), content, count |
context | Lines of context before and after each match |
case_insensitive | Case-insensitive search |
head_limit | Max results (default: 250) |
offset | Skip first N results |
multiline | Enable multiline mode (. matches newlines) |
Shell

run_command executes shell commands with:
- Two invocation modes —
command: "string"(shell-wrapped, supports pipes/glob/redirect) orargv: ["array", "form"](direct spawn, no escaping needed for paths with spaces). Exactly one must be provided. - Persistent working directory —
cdcarries across tool calls. Reset on/clear. - Configurable timeout — default 2 minutes, max 10 minutes. Set in
dynamo.yamlunderai.shell.defaultTimeout. - Background execution — long commands can run in the background. Model gets notified when they finish.
- Middle truncation — large output keeps the first and last 25K chars, truncates the middle.
- Shell detection — uses your
$SHELL, not a hardcoded shell. On Windows it uses cmd unlessSHELLnames another; the model can ask for PowerShell. - `DYNAMO=1` environment variable set so your scripts can detect they're running inside Dynamo.
Background Jobs
When the model runs a command with run_in_background: true:
- The command starts immediately and the model continues responding
- The jobs bar shows at the bottom:
Jobs: 1 Ctrl+G to focus - Press Ctrl+G to open the jobs picker with progress bars
- When the job finishes, the model auto-responds with the result
- Press Ctrl+K in the jobs picker to kill a running job
The model manages background jobs with these tools:
| Tool | Description |
|---|---|
job_list | List background jobs with their status |
job_output | Read a job's accumulated output |
job_kill | Kill a running background job |
Web Tools
| Tool | Description |
|---|---|
web_fetch | Fetch a URL and return content as markdown |
web_search | Search the web (provider-native, runs on the provider's servers — Anthropic, OpenAI, Gemini) |
web_fetch
Fetches a URL, extracts article content with Readability, converts HTML to markdown.
- HTTPS upgrade —
http://URLs auto-upgraded tohttps:// - 15-minute cache — same URL returns cached result
- Readability extraction — strips nav, ads, sidebars, returns article content only
- 50K char cap — large pages truncated with notice
- 30s timeout — prevents hanging on slow servers
web_search
Server-side search — the provider runs the search, not Dynamo. No separate API key needed.
| Provider | How it works |
|---|---|
| Anthropic (Claude) | Server-side tool. Returns structured results with title, URL, and page age. |
| OpenAI (GPT) | Responses API with web search. Citations embedded inline in response text. |
| Gemini | Google Search grounding (google_search). No separate API key. Results parsed from the response's grounding metadata. |
| OpenRouter / Ollama | No server-side search. The model can still use the client-side web_fetch tool with known URLs. |
Interactive
| Tool | Description |
|---|---|
ask_user | Ask the user a structured question with selectable options |
The model calls ask_user when it needs a decision — choosing between approaches, confirming a plan, selecting config options. Shows an interactive picker you navigate with arrow keys.
- Single or multi-question — up to 4 questions per call
- Tab navigation — switches between questions
- Option selection — arrow keys to navigate, Enter to select
- Custom input — "Other..." option opens inline text field for free-form answers
Task Management
| Tool | Description |
|---|---|
task_create | Create a task to track a unit of work |
task_list | List all tasks with status |
task_update | Update status, subject, description, or dependencies |
task_get | Get full task details |
task_stop | Stop/cancel a task |
task_clear | Clear tasks by status or all |
Tasks track multi-step work with status and dependencies:
pending → in_progress → completed
→ stoppedWhen a blocking task completes, dependent tasks auto-unblock. IDs are sequential — adding or deleting renumbers all tasks.
Use /tasks for an interactive task manager overlay, or let the model manage tasks via tool calls.
Git Tools
| Tool | Description |
|---|---|
git_status | Show branch, tracking info, staged/unstaged changes |
git_diff | Show file changes with diff rendering |
git_log | Show recent commit history |
git_add | Stage files |
git_unstage | Unstage files |
git_commit | Stage files and create a commit |
git_push | Push commits. A push to a protected branch, a force-push, a branch deletion, or an unknown remote escalates to dangerous; a force-push to a protected branch is blocked |
git_lfs_push | Push Git LFS objects |
GitHub Tools
These need the GitHub CLI (gh) installed and authenticated. The seven list/view/diff tools are safe; the five that post something — gh_pr_create, gh_pr_comment, gh_pr_review, gh_issue_create, gh_issue_comment — are write.
| Tool | Description |
|---|---|
gh_pr_create | Create a pull request for the current branch |
gh_pr_list | List pull requests, filtered by state, head or base branch, author, label, or a search |
gh_pr_view | View one PR: author, state, review decision, review verdicts, CI check rollup |
gh_pr_diff | Fetch a PR's unified diff, or just its changed-file list |
gh_pr_comment | Post a comment on a PR |
gh_pr_review | Submit a review — approve, request changes, or comment |
gh_run_list | List GitHub Actions runs, filtered by branch, workflow, status or event |
gh_run_view | View one run: status, conclusion, per-job results, and the failed steps' logs |
gh_issue_create | Open a new issue |
gh_issue_list | List issues, filtered by state, label, author or assignee |
gh_issue_view | View one issue: state, labels, assignees, body, and its comments |
gh_issue_comment | Post a comment on an issue |
The CI check rollup in gh_pr_view needs your GitHub token's "Checks: Read" permission. Without it, that one line says the rollup was denied and the rest of the PR still comes back. When a PR has no checks yet, it says none are reported instead of staying silent. gh_run_list and gh_run_view read Actions, a separate permission, and answer CI status either way.
Permissions
Tools are classified by risk level:
| Level | Behavior | Examples |
|---|---|---|
| Safe | Auto-execute | read_file, list_files, search_files, git_status, web_search |
| Write | Prompt once per tool, per model | write_file, edit_file, web_fetch, git_commit |
| Dangerous | Prompts every time; "Allow every" is never offered and no grant covers it | run_command (every command), move_file, rename_file, delete_file, checkpoint_restore, job_kill; git_push to a protected branch, with a force flag, deleting a branch, or to an unknown remote; git_lfs_unlock --force |
| Blocked | Never runs, in any mode | shell strings matching sudo, command substitution ($(), backticks), parameter expansion (${}), or process substitution (<(…), >(…)); any force-push to a protected branch, by run_command or git_push |
Any force-push to a protected branch — the default branch, a permissions.protected_branches pattern, or a GitHub-protected branch — is blocked in every spelling and argument order, by run_command and git_push alike. Set permissions.allow_force_push_protected: true in dynamo.yaml to make it ask every time instead. A plain push to a protected branch is dangerous, which Auto Mode approves.
"Allow every" is scoped per tool, per model, and persists across session resume. It never covers a dangerous call. Switching models doesn't wipe approvals — each model keeps its own grants.
--auto (-y) approves the safe, write and dangerous tiers as they come, so a task runs without step-by-step confirmation. Note that every run_command sits in the dangerous tier — ls as much as rm — so Auto Mode is one trust decision about the shell, not a per-command judgement. Unchanged by it: blocked patterns never run, and Dynamo still asks before it touches protected files like .env or keys, restores or deletes a checkpoint, stops a job, turns a skill back on, force-pushes to a protected branch you allowed, and during a compile-error cascade.
See Permissions & Security for the full security model.
Sandbox Mode
Controls filesystem access for all tools including shell commands.
| Mode | read_file | write/edit | list/search | run_command |
|---|---|---|---|---|
| project | project only | project only | project only | blocks paths outside the project |
| full (default) | project only | project only | anywhere | blocks paths outside the project |
| unrestricted | anywhere | anywhere | anywhere | no path checks (still permission gated) |
Set via CLI (--sandbox project), config (ai.sandbox: project), or at runtime (/sandbox).
Checkpoints
Auto-checkpoint before file edits — snapshot the file's pre-write state so you can undo.
- Auto-checkpoint — created once per prompt, before the first
write_file/edit_fileand before destructive shell commands - File-level snapshots — copies file content before modification. New files snapshot as "didn't exist"
- Rollback — restores files to pre-write state. Also rewinds conversation history.
- Disk persistence — survives restarts, stored under your config dir (per project)
- 30-day cleanup — old checkpoints auto-purged on startup
Use /checkpoint for an interactive overlay to rollback, delete, or create manual checkpoints.
Configurable: ai.auto_checkpoint: false in dynamo.yaml to disable.
Syntax Highlighting
Tool results and model responses are syntax highlighted:
- Code blocks highlighted with Catppuccin Mocha theme (191 languages)
- File reads highlighted by file extension
- Diffs rendered with line numbers, background tints, and word-level inline diff
- Markdown rendered inline: headers, bold, inline code, links