mirror of
https://github.com/prdlk/dotfiles.git
synced 2026-11-02 11:32:42 +00:00
176 lines
11 KiB
Plaintext
176 lines
11 KiB
Plaintext
---
|
||
title: omp
|
||
description: 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](/tools/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
|
||
|
||
```yaml ~/.omp/agent/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
|
||
|
||
```yaml ~/.omp/agent/keybindings.yml
|
||
app.editor.external: Ctrl+E
|
||
app.exit: Ctrl+Q
|
||
```
|
||
|
||
| Key | Action |
|
||
| --- | --- |
|
||
| <kbd>Ctrl</kbd> <kbd>E</kbd> | Open the current prompt in the external editor (`app.editor.external`) |
|
||
| <kbd>Ctrl</kbd> <kbd>Q</kbd> | 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](/tools/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
|
||
|
||
```sh
|
||
~/.omp/loops/bin/run-loop.sh <loop-name>
|
||
```
|
||
|
||
Runs one round of a loop:
|
||
|
||
<Steps>
|
||
<Step title="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.
|
||
</Step>
|
||
<Step title="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`.
|
||
</Step>
|
||
<Step title="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`.
|
||
</Step>
|
||
</Steps>
|
||
|
||
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.
|
||
|
||
:::note[Scheduling]
|
||
Cadences are declared in each prompt header; the repo contains no timer for them. `.chezmoiscripts/run_once_after_30-user-services.sh.tmpl` names `omp-loop` among the personal automation units that are enabled by hand on each machine and never automatically. See [scripts](/chezmoi/scripts).
|
||
:::
|
||
|
||
### 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 |
|
||
| <kbd>Ctrl</kbd> <kbd>A</kbd> | fish `fish_user_key_bindings`, zsh `keybinds.zsh` → `dot_local/bin/executable_omp-session` | Resumes or starts omp for the current repo: default branch → the session written in the last 3 hours, else the `omp-sessions` tv cable; other branches → that branch's newest session, else a new one. See [omp-session](/shell/scripts#omp-session) |
|
||
| `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](/shell/scripts) and [fish](/shell/fish). The [kitty](/terminal/kitty) tab bar shows a microchip glyph for tabs running `omp`.
|