omp
omp agent config, keybindings, MCP servers, cyberdream theme, custom commands, and the scheduled research loops under ~/.omp.
omp (oh-my-pi) is a terminal coding agent. The repo manages its agent directory (~/.omp/agent) and a set of prompt loops in ~/.omp/loops. chezmoi does not install the omp binary; install it yourself. topgrade keeps it current with the custom command "Omp Update" = "omp update".
Files
| Source in repo | Target | Notes |
|---|---|---|
dot_omp/private_agent/ |
~/.omp/agent/ |
Directory mode 0700 |
dot_omp/private_agent/private_config.yml |
~/.omp/agent/config.yml |
Mode 0600 |
dot_omp/private_agent/keybindings.yml |
~/.omp/agent/keybindings.yml |
|
dot_omp/private_agent/private_mcp.json |
~/.omp/agent/mcp.json |
Mode 0600 |
dot_omp/private_agent/themes/cyberdream.json |
~/.omp/agent/themes/cyberdream.json |
Custom theme |
dot_omp/private_agent/commands/*.md |
~/.omp/agent/commands/*.md |
Slash commands |
dot_omp/loops/bin/executable_run-loop.sh |
~/.omp/loops/bin/run-loop.sh |
Loop runner |
dot_omp/loops/<name>/private_loop.md |
~/.omp/loops/<name>/loop.md |
One prompt per loop, mode 0600 |
dot_omp/loops/goals/private_templates.md |
~/.omp/loops/goals/templates.md |
Unscheduled /goal templates |
No omp file is role-gated. In chezmoi’s symlink mode, private_ and executable_ entries are written as regular files, not symlinks.
config.yml
theme:
dark: titanium
light: light
symbolPreset: nerd
setupVersion: 2
hideThinkingBlock: false
modelRoles:
plan: anthropic/claude-fable-5
composer:
shape: rule
| Key | Value | Effect |
|---|---|---|
theme.dark |
titanium |
Theme on a dark terminal background (omp’s default, pinned explicitly) |
theme.light |
light |
Theme on a light terminal background (omp’s default) |
symbolPreset |
nerd |
Nerd Font glyphs instead of the default unicode set; the repo’s font is Victor Mono Nerd Font |
hideThinkingBlock |
false |
Thinking blocks stay visible |
modelRoles.plan |
anthropic/claude-fable-5 |
Model for the plan role; other roles use omp defaults |
composer.shape |
rule |
Built-in rule composer style instead of the default box |
setupVersion |
2 |
Internal settings version marker |
No API keys are stored in config.yml.
Keybindings
app.editor.external: Ctrl+E
app.exit: Ctrl+Q
| Key | Action |
|---|---|
| Ctrl E | Open the current prompt in the external editor (app.editor.external) |
| Ctrl Q | Quit omp (app.exit) |
All other bindings are omp defaults.
MCP servers
mcp.json declares three remote MCP servers over HTTP. No credential values are stored in the file.
| Server | Transport | Endpoint | Auth |
|---|---|---|---|
exa |
http |
https://mcp.exa.ai/mcp |
none |
cloudflare-api |
http |
https://mcp.cloudflare.com/mcp |
OAuth; omp stores the token in its own credential store under a profile credential id |
github |
http |
https://api.githubcopilot.com/mcp/ |
Authorization header built at request time by a ! shell command that reads the token from gh auth token |
The GitHub server therefore needs the GitHub CLI to be logged in. The $schema key points at omp’s mcp-schema.json for editor validation.
Theme
themes/cyberdream.json ports the cyberdream palette to omp’s theme schema. It installs the theme, but config.yml currently selects titanium for dark mode. To use cyberdream, set theme.dark: cyberdream.
| Var | Hex | Used for |
|---|---|---|
bg |
#16181a |
base background |
bgAlt |
#1e2124 |
user/custom message, tool, and status-line backgrounds |
bgHighlight |
#3c4048 |
selection |
fg |
#ffffff |
message and tool output text |
grey |
#7b8496 |
muted, dim, thinking text, comments, quotes, borders |
blue |
#5ea1ff |
accent, borders, links, functions, status-line path |
cyan |
#5ef1ff |
accent borders, tool titles, inline code, types, context meter |
green |
#5eff6c |
success, diff additions, strings, clean git |
red |
#ff6e5e |
errors, diff removals, untracked files |
yellow |
#f1ff5e |
warnings, variables, bash mode, dirty git |
magenta |
#ff5ef1 |
keywords, subagent count |
pink |
#ff5ea0 |
operators, spend |
orange |
#ffbd5e |
Markdown headings, cost |
purple |
#bd5eff |
numbers, python mode, model name |
The thinking-level indicator runs grey (off) → blue → cyan → green → yellow → orange → red (max).
Commands
| Command | Invocation | Purpose |
|---|---|---|
/leetcode-docs |
/leetcode-docs <file> [extra instructions] |
Converts a LeetCode solution file into a Fumadocs MDX page at content/docs/leetcode/<difficulty>/<category>/<number>-<slug>.mdx. The page has a difficulty callout, problem, examples, constraints, a derived intuition paragraph, the solution copied verbatim (multiple approaches become tabs), and a complexity callout. Prints only the output path. |
/leetcode-eli5 |
/leetcode-eli5 <file> [extra instructions] |
Adds beginner-level line-by-line comments and a // ==== banner to a LeetCode solution. Leaves the header, JSDoc, and code byte-for-byte unchanged. Prints the path and the number of comment lines added. |
Both expect the on-disk format of the LeetCode solutions repo: a /* ... */ problem header, a JSDoc block, then the solution function(s).
Loops
~/.omp/loops holds scheduled, read-only research prompts. Each loop is a directory with a loop.md prompt. run-loop.sh creates state.md and runs.log beside it at runtime; chezmoi does not manage those.
run-loop.sh
~/.omp/loops/bin/run-loop.sh <loop-name>
Runs one round of a loop:
Prepare state
Exits if ~/.omp/loops/<name>/loop.md is missing. Seeds state.md with ## queue, ## done, and ## blocked headings if it does not exist.
Cheap round
Runs omp -p --no-session --max-time 600 --model kimi-for-coding with the prompt plus the loop directory, state-file path, and round timestamp appended. Output goes to runs.log.
Escalate once
If any output line starts with ESCALATE, re-runs the round once on omp’s default model (Fable) with a 1200 s cap. It logs <loop> escalated to ~/.omp/loops/escalations.log.
At most one round and one escalation per call. Failures from omp are logged and do not abort the script.
Loop catalogue
Every loop follows the same contract: read state.md first, do one pass, make exactly one change (usually a brief or proposal appended under ## queue), and log repeated tool failures under ## blocked. Loops draft only; they never file issues or change repos. The subject is WalletBase, an embedded-wallet project.
| Loop | Cadence | Inputs | Output per round | Escalates on |
|---|---|---|---|---|
intel-refresh (#19) |
Mon 06:00 | Exa search over five beats: ERC-4337/AA, EIP-7702, embedded-wallet competitors, agent-payment protocols, Base chain | Up to 5 bullets per beat for the week; proposes swapping a beat that has been quiet for 3 weeks | A development that breaks a core assumption |
share-of-model (#3) |
Mon 07:00 | Exa answer mode, fixed set of six buyer questions | Table of vendors named per answer and whether WalletBase appears; biggest rank shift | never |
regulatory-digest (#20) |
Tue 07:00 | FinCEN, OFAC, SEC/CFTC, EU MiCA/CASP, Ethereum governance | Only material changes; “no material changes” counts as success; a proposed risk-position edit when an item breaks a standing assumption | MSB scope or OFAC action touching similar infra |
brand-radar (#10) |
Wed 07:00 | HN Algolia API (no key), Exa | Mentions grouped into feature asks, pricing pain, security, and integration friction; one drafted bd create issue or positioning note |
Security discussion of a dependency |
answer-gap (#1) |
Thu 07:00 | Exa, rotating developer questions plus ones harvested in earlier rounds | One content brief; up to 3 new questions queued | never |
competitor-watch (#4) |
Fri 07:00 | Exa over six competitor blogs | Logs new posts; one content brief for the biggest gap | Competitor launches an agent-economy product |
repeat-offender (#24) |
Sun 18:00 | bd list across the project’s repos, loop runs.log, ## blocked sections, and escalations.log |
Failure patterns grouped by root cause; one drafted bd create systemic fix |
Data loss or security-boundary pattern |
Five prompts cap page fetches or API calls per round (15 to 30); share-of-model and repeat-offender are bounded by their fixed question set and sources.
Goal templates
goals/templates.md is not scheduled. It holds two /goal prompts to paste into an interactive omp session when facing a decision:
| Template | Purpose | Cap |
|---|---|---|
| kill-criteria (#22) | One measurable disqualifying condition per option, cited evidence, verdict ALIVE / KILLED / NEEDS-DATA | 40 tool calls |
| pre-mortem (#23) | Writes the post-mortem of a failed decision 12 months out: 3–5 causal chains, each tied to a present-day assumption, with an early warning sign and the cheapest mitigation | 30 tool calls |
Both count as done only when the full artifact is pasted in the chat.
Shell integration
| Entry point | Source | What it does |
|---|---|---|
| fish completions | dot_config/fish/completions/omp.fish |
omp completions fish | source generates completions at load time |
| Ctrl A | fish fish_user_key_bindings, zsh keybinds.zsh |
Launches omp from the prompt |
launch_omp_livediff_overlay |
dot_local/bin/executable_launch_omp_livediff_overlay, fish function of the same name |
Opens omp as a kitty overlay on the current window with a livediff vsplit beside it, focus kept on omp. Needs KITTY_LISTEN_ON (kitty remote control). |
lc-elir [root] |
dot_local/bin/executable_lc-elir, fish function |
fzf multi-picks numbered LeetCode files (1365.slug.js/.ts) with a bat preview and runs omp -p "/leetcode-eli5 <file>" on each |
See scripts and fish. The kitty tab bar shows a microchip glyph for tabs running omp.