doer — one-file pipe-native agent. strands-agents + ollama only.
Project description
install
Pick your path. All three give you do on your $PATH.
# 1) pipx — isolated, auto-updatable (recommended)
pipx install doer-cli
# 2) pip — any venv
pip install doer-cli
# 3) one-liner (prebuilt binary, no Python needed)
curl -sSL https://raw.githubusercontent.com/cagataycali/doer-cli/main/install.sh | sh
Two binaries get installed:
do(short) anddoer(long). Pick your poison.
run
do "find files larger than 100MB"
cat error.log | do "what broke"
git log -20 | do "write release notes"
echo '{"a":1}' | do "to yaml"
curl -s api.io | do "summarize" | tee out.md
what it is
Agent(
model=Ollama(...),
tools=[shell] + hot_reload("./tools"),
system_prompt=SOUL.md + AGENTS.md + ~/.doer_history
+ ~/.bash_history + ~/.zsh_history + own_source,
)(stdin + argv)
That's the entire architecture. 164 lines of Python. It reads your shell like a person reads a room.
context it sees every call
| source | what |
|---|---|
SOUL.md (cwd) |
who it is in this project |
AGENTS.md (cwd) |
rules for this project |
~/.doer_history |
last N Q/A (DOER_HISTORY=10) |
~/.bash_history + ~/.zsh_history |
last N commands (DOER_SHELL_HISTORY=20) |
./tools/*.py |
hot-reloaded @tool functions |
| own source | full self-awareness |
No database. No config file. The filesystem is the memory.
env knobs
DOER_MODEL=qwen3:1.7b # any ollama model
OLLAMA_HOST=http://localhost:11434
DOER_HISTORY=10 # Q/A rows in prompt
DOER_SHELL_HISTORY=20 # shell rows in prompt
extend in 60 seconds
# ./tools/weather.py
from strands import tool
import urllib.request
@tool
def weather(city: str) -> str:
"""Weather for a city."""
return urllib.request.urlopen(f"https://wttr.in/{city}?format=3").read().decode()
Next call: do "istanbul weather?" — hot-reloaded, no restart.
philosophy
┌─────┐ ┌──────┐ ┌──────┐
│stdin│──────▶│ do │──────▶│stdout│
└─────┘ └──────┘ └──────┘
grep with a brain. Chain it. Script it. Cron it.
Read SOUL.md for the manifesto. Read AGENTS.md for the rules.
family
| project | size | purpose |
|---|---|---|
| doer | 164 LOC | one pipe, one shell, one file |
| DevDuck | 60+ tools | every protocol, every edge |
uninstall
pipx uninstall doer-cli # or: pip uninstall doer-cli
rm /usr/local/bin/do # if installed via curl
license
Apache-2.0 · built in New York · 2026
do one thing and do it well — Doug McIlroy, 1978
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file doer_cli-0.2.1.tar.gz.
File metadata
- Download URL: doer_cli-0.2.1.tar.gz
- Upload date:
- Size: 5.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0a65d237293211ca683b0842166a39f9ea09c44e2332cf8500b03608b379cb0b
|
|
| MD5 |
dd56891ff6cd41ea823c218901a914dc
|
|
| BLAKE2b-256 |
5ee33b3d4f3042e1f5699eb7278e8faa88e1aeeea99526346bed45c3fdb589b4
|
File details
Details for the file doer_cli-0.2.1-py3-none-any.whl.
File metadata
- Download URL: doer_cli-0.2.1-py3-none-any.whl
- Upload date:
- Size: 5.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6160ef41ed28bd37531359625254fe14274871af620cf372fa53758d1ec1a321
|
|
| MD5 |
886c5a030fb8f645df8a46d732125937
|
|
| BLAKE2b-256 |
0abf85f3685ff572656b56fdd2a9f156b3f4baca4aa66910b6930482d67594fd
|