Patterns are .toml files — one per command. They are loaded from two locations
in order, with the first regex match winning:
- Project:
<git-root>/.oo/patterns/— repo-specific, checked in with the project - User:
~/.config/oo/patterns/— personal patterns across all projects
Both layers are checked before built-in patterns, so custom patterns always override.
# Regex matched against the full command string (e.g. "make -j4 all")
command_match = "^make\\b"
[success]
# Regex with named captures run against stdout+stderr
pattern = '(?P<target>\S+) is up to date'
# Template: {name} is replaced with the capture of the same name
summary = "{target} up to date"
[failure]
# Strategy: tail | head | grep | between
strategy = "grep"
# For grep: lines matching this regex are kept
grep = "Error:|error\\["| Field | Type | Description |
|---|---|---|
pattern |
regex | Named captures become template variables |
summary |
string | Template; {capture_name} replaced at runtime |
An empty summary = "" suppresses output on success (quiet pass).
strategy is optional and defaults to "tail".
strategy |
Extra fields | Behaviour |
|---|---|---|
tail |
lines (default 30) |
Last N lines of output |
head |
lines (default 20) |
First N lines of output |
grep |
grep (regex, required) |
Lines matching regex |
between |
start, end (strings, required) |
Lines from first start match to first end match (inclusive) |
Omit [failure] to show all output on failure.
command_match = "\\bdocker\\s+build\\b"
[success]
pattern = 'Successfully built (?P<id>[0-9a-f]+)'
summary = "built {id}"
[failure]
strategy = "tail"
lines = 20command_match = "\\bterraform\\s+plan\\b"
[success]
pattern = 'Plan: (?P<add>\d+) to add, (?P<change>\d+) to change, (?P<destroy>\d+) to destroy'
summary = "+{add} ~{change} -{destroy}"
[failure]
strategy = "grep"
grep = "Error:|error:"command_match = "^make\\b"
[success]
pattern = '(?s).*' # always matches; empty summary = quiet
summary = ""
[failure]
strategy = "between"
start = "make["
end = "Makefile:"Note:
startandendare plain substring matches, not regexes.
oo categorizes commands to determine default behavior when no pattern matches:
| Category | Examples | Default Behavior |
|---|---|---|
| Status | cargo test, pytest, eslint, cargo build |
Quiet success (empty summary) if output > 4 KB |
| Content | git show, git diff, cat, bat |
Always pass through, never index |
| Data | git log, git status, gh api, ls, find |
Index for recall if output > 4 KB and unpatterned |
| Unknown | Anything else (curl, docker, etc.) | Pass through (safe default) |
Important: Patterns always take priority over category defaults. If a pattern matches, it determines the output classification regardless of category.