A small tool I built is makethlm, a command-line task runner in the tradition of Make and Just, but where the task body is natural language executed by an LLM.
Why
Because why not? :)
LLMs can be used in building as well, so why not? Make and Just are great for defining workflows, but every step has to be a shell command. You can ask LLM to generate code, review diffs, explain failures, or write configs.
Write a Promptfile, and each task is a mix of LLM prompts and shell commands (executed directly). Dependencies, variables, and arguments work the way you’d expect from Just (most of it…)
Quick example
# Promptfile
project := "my-web-app"
llm claude [model=sonnet]
task build:
!mkdir -p dist
check if src/ has changed since the last build.
if so, compile the TypeScript and bundle with esbuild.
task test: build
!npm test
if any tests failed, explain the root cause and suggest a fix.
task deploy(target, port="8080"): build test
!systemctl restart {{project}}
verify {{project}} is running on {{target}} port {{port}}.
makethlm deploy staging # runs build -> test -> deploy
makethlm --dry-run deploy # preview without executing
makethlm --list # list all tasks
Features like
Functions let you define reusable prompt templates and inject them into tasks with @use:
fn security_review:
Review the code for security vulnerabilities.
Check for SQL injection, XSS, command injection, path traversal.
task review:
@use security_review
Focus on the git diff for the current PR.
Docker blocks describe images in plain English - the LLM generates the Dockerfile, makethlm builds it:
docker api-server [tag=latest]:
A Python 3.11 slim image.
Install requirements.txt with pip, no cache.
Copy app/ to /app. Expose port 8080.
Run with gunicorn, 4 workers.
SSH host inventory lets you run tasks on remote hosts, like in ansible:
hosts web [user=deploy]:
web1.prod.internal
web2.prod.internal
task deploy [on=web]: build
!systemctl restart {{project}}
verify the service is healthy
Multi-LLM routing – define multiple providers and pick one per task:
llm claude [model=opus]
llm openai [model=gpt-4]
task review [llm=openai]:
review the code
It also supports Just-compatible features like set dotenv-load, conditional expressions, string functions, variadic arguments, and OS-specific tasks ([linux], [macos]).
Install
pip install makethlm
Requires Python 3.10+. By default it uses the Claude CLI as backend, but any provider (OpenAI, Ollama, etc.) works via --shell or the llm directive.
Source and docs: github.com/latedeployment/makethlm