Homebrew
macOS and Linux
Install from the SmartCrab tap.
brew install smartcrabai/tap/yabumi
Single-file language for Agent Skills
Yabumi replaces fragile bash and oversized Python helpers with one typed, self-contained file. Effects, failures, mutability, and concurrency stay visible in the source.
# Fetch two manifests concurrently. Effects stay visible.
def manifest(url: str): Result[str, Error] uses {net}
response = http.get(url)?
return response.body
urls = ["https://api.example.com/a", "https://api.example.com/b"]
results = urls.par_map((url) => manifest(url))
results.each((result) => print(result.unwrap_or("failed")))
Install
Choose Homebrew or the shell installer. Both install the ybm command.
Homebrew
Install from the SmartCrab tap.
brew install smartcrabai/tap/yabumi
Shell installer
Download the platform binary from GitHub Releases.
curl --proto '=https' --tlsv1.2 -LsSf \
https://github.com/smartcrabai/yabumi/releases/latest/download/yabumi-installer.sh | sh
Agent Skill: install the bundled skill with npx skills add smartcrabai/yabumi --skill yabumi.
Quick start
hello.ybmTop-level code runs from top to bottom. No entry-point ceremony.
name = env.get("USER").unwrap_or("agent")
print(f"hello, {name}")
Type checking, formatting diff, lint, and doc-test type checking run together.
$ ybm check hello.ybmybm always type-checks first, then executes on success.
$ ybm hello.ybm
hello, agentLanguage model
Yabumi removes the invisible behavior that makes generated scripts hard to audit. Four rules carry most of the language.
State
Reassignment requires var. The first binding fixes the type.
x = 5
var retries = 0
retries = retries + 1
Auditability
Pure is the default. Filesystem, network, environment, process, time, and random access must be declared.
def save(path: str, body: str): Option[Error]
uses {fs}
Failure
Result and Option cannot be silently ignored. ? returns failure early.
n = input.parse_int()?
return n * 2
Concurrency
par, par_map, and par_each make fan-out visible and preserve input order.
pages = urls.par_map((url) =>
http.get(url))
CLI reference
Every failure uses file:line:col [E0000] message. Stable error codes let agents recover without parsing prose.
| Command | Behavior | Success |
|---|---|---|
ybm <file> | Type-check, then run only on success. | Exit 0 |
ybm check | Type-check, read-only format diff, lint, and doc-test type checking. | Clean file |
ybm test | Execute fenced examples in declaration doc comments. | All pass |
ybm lsp | Start the Language Server Protocol server over stdio. | Clean shutdown |
Use ybm check --apply <file> to rewrite formatting in place. Without --apply, formatting stays read-only.
Standard library
Core types and namespaces are globally available. Effectful functions declare the same effect vocabulary as user code.
Safe and direct APIs coexist. Indexing may terminate on an invalid key; .get() returns Option. The choice stays visible at the call site.
Editor support
ybm lsp speaks LSP over stdio and analyzes open files without executing them.
Feedback
Parse, type, effect, and lint errors use the same stable diagnostic codes as the CLI.
Navigation
Live diagnostics, type hover, go to definition, and whole-document formatting over full-document synchronization.
Full reference
The language specification is canonical. Decisions record resolved design details; verified samples double as acceptance tests.