Skip to main content

doer — one-file pipe-native agent. strands-agents + ollama only.

Project description

doer

DOER

stdin → llm → stdout

A Unix citizen that thinks. One file. One dep. Zero ceremony.

PyPI License Python


install

pip install doer

run

doer "find files larger than 100MB"
cat error.log  | doer "what broke"
git log -20    | doer "write release notes"
echo '{"a":1}' | doer "to yaml"

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 (default 10 — DOER_HISTORY)
~/.bash_history + ~/.zsh_history last N commands (default 20 — DOER_SHELL_HISTORY)
./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: doer "istanbul weather?" — hot-reloaded, no restart.

philosophy

┌─────┐       ┌──────┐       ┌──────┐
│stdin│──────▶│ doer │──────▶│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

license

Apache-2.0 · built in New York · 2026


do one thing and do it well — Doug McIlroy, 1978

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

doer_cli-0.2.0.tar.gz (5.2 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

doer_cli-0.2.0-py3-none-any.whl (5.6 kB view details)

Uploaded Python 3

File details

Details for the file doer_cli-0.2.0.tar.gz.

File metadata

  • Download URL: doer_cli-0.2.0.tar.gz
  • Upload date:
  • Size: 5.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.12

File hashes

Hashes for doer_cli-0.2.0.tar.gz
Algorithm Hash digest
SHA256 ffb8ee2ba105353157c0d91e80f6e0023deb476cea1e2bc1de5a787f51016460
MD5 843e0336d4d43871fa70156d0bd5456d
BLAKE2b-256 1c0ffc23fb685810e4ce3617ed4cc38a5147a677891924c23cfbd6e101ee14b4

See more details on using hashes here.

File details

Details for the file doer_cli-0.2.0-py3-none-any.whl.

File metadata

  • Download URL: doer_cli-0.2.0-py3-none-any.whl
  • Upload date:
  • Size: 5.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.12

File hashes

Hashes for doer_cli-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 211f29356d8e72ab0742b94ead361634540a1b76cf8081e7e07afacda023a5ab
MD5 dacd8301ebe11e5f4a181131c151976b
BLAKE2b-256 1f90ab0dfb5e4c772b22451205d4378de6d0b3eed3ef03f18fba859c748a1dc2

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page