Files
oh-my-pi/packages/coding-agent
can1357 1e52c837c8 feat(natives): added native addon distribution and platform validation to CLI update mechanism
- Added native addon distribution and installation support to the CLI update mechanism, enabling platform-specific native modules to be downloaded and installed alongside the main binary.
- Added platform validation in native addon loader to verify supported platforms (linux-x64, linux-arm64, darwin-x64, darwin-arm64, win32-x64) with helpful error messages for unsupported configurations.
- Enhanced native addon loading error messages to provide platform-specific troubleshooting guidance for both npm/bun installations and local development environments.
- Updated installation scripts (install.sh, install.ps1) to download and install native addon files alongside the main binary during CLI installation.
2026-02-01 05:17:06 +01:00
..
2026-01-03 14:53:38 +01:00

omp

A terminal-based coding agent with multi-model support, mid-session model switching, and a simple CLI for headless coding tasks.

Works on Linux, macOS, and Windows (requires bash; see Windows Setup).

Table of Contents


Getting Started

Installation

npm (recommended):

npm install -g @oh-my-pi/pi-coding-agent

Standalone binary:

Download from GitHub Releases:

Platform Binary
macOS Apple Silicon omp-darwin-arm64
macOS Intel omp-darwin-x64
Linux x64 omp-linux-x64
Linux ARM64 omp-linux-arm64
Windows x64 omp-windows-x64.exe
# macOS/Linux
chmod +x omp-darwin-arm64
./omp-darwin-arm64

# Windows
omp-windows-x64.exe

macOS note: The binary is unsigned. If blocked, run: xattr -c ./omp

Build from source (requires Bun 1.0+):

git clone https://github.com/can1357/oh-my-pi.git
cd pi-mono && npm install
cd packages/coding-agent && npm run build:binary
./dist/omp

Windows Setup

Omp requires a bash shell on Windows. Checked locations (in order):

  1. Custom path from ~/.omp/agent/settings.json
  2. Git Bash (C:\Program Files\Git\bin\bash.exe)
  3. bash.exe on PATH (Cygwin, MSYS2, WSL)

For most users, Git for Windows is sufficient.

Custom shell path:

// ~/.omp/agent/settings.json
{
	"shellPath": "C:\\cygwin64\\bin\\bash.exe"
}

Terminal Setup

Pi uses the Kitty keyboard protocol for reliable modifier key detection. Most modern terminals support this protocol, but some require configuration.

Kitty, iTerm2: Work out of the box.

Ghostty: Add to your Ghostty config (~/.config/ghostty/config):

keybind = alt+backspace=text:\x1b\x7f
keybind = shift+enter=text:\n

wezterm: Create ~/.wezterm.lua:

local wezterm = require 'wezterm'
local config = wezterm.config_builder()
config.enable_kitty_keyboard = true
return config

Windows Terminal: Does not support the Kitty keyboard protocol. Shift+Enter cannot be distinguished from Enter. Use Ctrl+Enter for multi-line input instead. All other keybindings work correctly.

API Keys & OAuth

Option 1: Environment variables (recommended)

Provider Auth Key Environment Variable
Anthropic anthropic ANTHROPIC_API_KEY
OpenAI openai OPENAI_API_KEY
Google google GEMINI_API_KEY
Mistral mistral MISTRAL_API_KEY
Groq groq GROQ_API_KEY
Cerebras cerebras CEREBRAS_API_KEY
xAI xai XAI_API_KEY
OpenRouter openrouter OPENROUTER_API_KEY
ZAI zai ZAI_API_KEY

Option 2: OAuth

Use /login to authenticate with subscription-based or free-tier providers:

Provider Models Cost
Anthropic (Claude Pro/Max) Claude models via your subscription Subscription
Cursor Claude, GPT-4o via Cursor Pro subscription Subscription
GitHub Copilot GPT-4o, Claude, Gemini via Copilot subscription Subscription
OpenAI Codex o3, o4-mini via ChatGPT Plus/Pro subscription Subscription
Google Gemini CLI Gemini 2.0/2.5 models Free (Google account)
Google Antigravity Gemini 3, Claude, GPT-OSS Free (Google account)
omp
/login  # Select provider, authorize in browser

Note: /login replaces any existing API keys for that provider with OAuth credentials. If OAuth credentials already exist, /login appends another entry.

GitHub Copilot notes:

  • Press Enter for github.com, or enter your GitHub Enterprise Server domain
  • If you get "model not supported" error, enable it in VS Code: Copilot Chat → model selector → select model → "Enable"

Google providers notes:

  • Gemini CLI uses the production Cloud Code Assist endpoint (standard Gemini models)
  • Antigravity uses a sandbox endpoint with access to Gemini 3, Claude (sonnet/opus thinking), and GPT-OSS models
  • Both are free with any Google account, subject to rate limits
  • Paid Cloud Code Assist subscriptions: set GOOGLE_CLOUD_PROJECT or GOOGLE_CLOUD_PROJECT_ID env var to your project ID

Credentials stored in ~/.omp/agent/agent.db. Use /logout to clear.

Quick Start

export ANTHROPIC_API_KEY=sk-ant-...
omp

Then chat:

You: Create a simple Express server in src/server.ts

The agent reads, writes, and edits files, and executes commands via bash.


Usage

Slash Commands

Command Description
/settings Open settings menu (thinking, theme, queue mode, toggles)
/model Switch models mid-session. Use /model <search> or provider/model to prefilter/disambiguate.
/export [file] Export session to HTML file
/dump Copy session transcript to clipboard
/share Upload session as secret GitHub gist, get shareable URL (requires gh CLI)
/session Show session info: path, message counts, token usage, cost
/hotkeys Show all keyboard shortcuts
/changelog Display full version history
/tree Navigate session tree in-place (search, filter, label entries)
/branch Create new conversation branch from a previous message
/resume Switch to a different session (interactive selector)
/login OAuth login for subscription-based models
/logout Clear OAuth tokens
/new Start a new session
/copy Copy last agent message to clipboard
/compact [instructions] Manually compact conversation context

Editor Features

File reference (@): Type @ to fuzzy-search project files. Respects .gitignore.

Path completion (Tab): Complete relative paths, ../, ~/, etc.

Drag & drop: Drag files from your file manager into the terminal.

Multi-line paste: Pasted content is collapsed to [paste #N <lines> lines] but sent in full.

Message queuing: Submit messages while the agent is working. They queue and process based on queue mode (configurable via /settings). Press Escape to abort and restore queued messages to editor.

Keyboard Shortcuts

Navigation:

Key Action
Arrow keys Move cursor / browse history (Up when empty)
Option+Left/Right Move by word
Ctrl+A / Home / Cmd+Left Start of line
Ctrl+E / End / Cmd+Right End of line

Editing:

Key Action
Enter Send message
Shift+Enter New line (Ctrl+Enter on Windows Terminal)
Ctrl+W / Option+Backspace Delete word backwards
Ctrl+U Delete to start of line
Ctrl+K Delete to end of line

Other:

Key Action
Tab Path completion / accept autocomplete
Escape Cancel autocomplete / abort streaming
Ctrl+C Clear editor (first) / exit (second)
Ctrl+D Exit (when editor is empty)
Ctrl+Z Suspend to background (use fg in shell to resume)
Shift+Tab Cycle thinking level
Ctrl+P / Shift+Ctrl+P Cycle role models (slow/default/smol/plan)
Ctrl+L Open model selector
Ctrl+O Toggle tool output expansion
Ctrl+T Toggle todo list expansion
Ctrl+G Edit message in external editor ($VISUAL or $EDITOR)

Bash Mode

Prefix commands with ! to execute them and add output to context:

!ls -la
!git status
!cat package.json | jq '.dependencies'

Output streams in real-time. Press Escape to cancel. Large outputs truncate at 2000 lines / 50KB.

The output becomes part of your next prompt, formatted as:

Ran `ls -la`
``` ```

Run multiple commands before prompting; all outputs are included together.

Image Support

Attaching images: Include image paths in your message:

You: What's in this screenshot? /path/to/image.png

Supported formats: .jpg, .jpeg, .png, .gif, .webp

Inline rendering: On terminals that support the Kitty graphics protocol (Kitty, Ghostty, WezTerm) or iTerm2 inline images, images in tool output are rendered inline. On unsupported terminals, a text placeholder is shown instead.

Toggle inline images via /settings or set terminal.showImages: false in settings.


Sessions

Sessions are stored as JSONL files with a tree structure. Each entry has an id and parentId, enabling in-place branching: navigate to any previous point with /tree, continue from there, and switch between branches while preserving all history in a single file.

See docs/session.md for the file format and programmatic API.

Session Management

Sessions auto-save to ~/.omp/agent/sessions/ organized by working directory.

omp --continue      # Continue most recent session
omp -c              # Short form

omp --resume        # Browse and select from past sessions
omp -r              # Short form

omp --no-session    # Ephemeral mode (don't save)

omp --session /path/to/file.jsonl  # Use specific session file
omp --session a8ec1c2a             # Resume by session ID (partial UUID)

Resuming by session ID: The --session flag accepts a session UUID (or prefix). Session IDs are visible in filenames under ~/.omp/agent/sessions/<project>/ (e.g., 2025-12-13T17-47-46-817Z_a8ec1c2a-5a5f-4699-88cb-03e7d3cb9292.jsonl). The UUID is the part after the underscore. You can also search by session ID in the omp -r picker.

Context Compaction

Long sessions can exhaust context windows. Compaction summarizes older messages while keeping recent ones.

Manual: /compact or /compact Focus on the API changes

Automatic: Enable via /settings. When enabled, triggers in two cases:

  • Overflow recovery: LLM returns context overflow error. Compacts and auto-retries.
  • Threshold maintenance: Context exceeds contextWindow - reserveTokens after a successful turn. Compacts without retry.

When disabled, neither case triggers automatic compaction (use /compact manually if needed).

Configuration (~/.omp/agent/settings.json):

{
	"compaction": {
		"enabled": true,
		"reserveTokens": 16384,
		"keepRecentTokens": 20000
	},
	"env": {
		"ANTHROPIC_API_KEY": "sk-ant-...",
		"OPENAI_API_KEY": "sk-proj-...",
		"GEMINI_API_KEY": "AIzaSyD...",
		"CUSTOM_VAR": "custom-value"
	}
}

Environment Variables (env):

  • Automatically sets environment variables when the application starts
  • Only sets variables that aren't already present in process.env
  • Supports any environment variable, not just API keys
  • Order of precedence: existing env vars > settings.json env vars > auth.json env vars

Note: Compaction is lossy. The agent loses full conversation access afterward. Size tasks to avoid context limits when possible. For critical context, ask the agent to write a summary to a file, iterate on it until it covers everything, then start a new session with that file. The full session history is preserved in the JSONL file; use /tree to revisit any previous point.

See docs/compaction.md for how compaction works internally and how to customize it via hooks.

Branching

In-place navigation (/tree): Navigate the session tree without creating new files. Select any previous point, continue from there, and switch between branches while preserving all history.

  • Search by typing, page with ←/→
  • Filter modes (Ctrl+O): default → no-tools → user-only → labeled-only → all
  • Press l to label entries as bookmarks
  • When switching branches, you're prompted whether to generate a summary of the abandoned branch (messages up to the common ancestor)

Create new session (/branch): Branch to a new session file:

  1. Opens selector showing all your user messages
  2. Select a message to branch from
  3. Creates new session with history up to that point
  4. Selected message placed in editor for modification

Configuration

Project Context Files

Omp loads AGENTS.md (or CLAUDE.md) files at startup in this order:

  1. Global: ~/.omp/agent/AGENTS.md
  2. Parent directories: Walking up from current directory
  3. Current directory: ./AGENTS.md

Use these for:

  • Project instructions and guidelines
  • Common commands and workflows
  • Architecture documentation
  • Coding conventions
  • Testing instructions
# Common Commands

- npm run build: Build the project
- npm test: Run tests

# Code Style

- Use TypeScript strict mode
- Prefer async/await over promises

Custom System Prompt

Replace the default system prompt entirely by creating a SYSTEM.md file:

  1. Project-local: .omp/SYSTEM.md (takes precedence)
  2. Global: ~/.omp/agent/SYSTEM.md (fallback)

This is useful when using omp as different types of agents across repos (coding assistant, personal assistant, domain-specific agent, etc.).

You are a technical writing assistant. Help users write clear documentation.

Focus on:

- Concise explanations
- Code examples
- Proper formatting

The --system-prompt CLI flag overrides both files. Use --append-system-prompt to add to (rather than replace) the prompt.

Custom Models and Providers

Add custom models (Ollama, vLLM, LM Studio, etc.) via ~/.omp/agent/models.json:

{
	"providers": {
		"ollama": {
			"baseUrl": "http://localhost:11434/v1",
			"apiKey": "OLLAMA_API_KEY",
			"api": "openai-completions",
			"models": [
				{
					"id": "llama-3.1-8b",
					"name": "Llama 3.1 8B (Local)",
					"reasoning": false,
					"input": ["text"],
					"cost": { "input": 0, "output": 0, "cacheRead": 0, "cacheWrite": 0 },
					"contextWindow": 128000,
					"maxTokens": 32000
				}
			]
		}
	}
}

Supported APIs: openai-completions, openai-responses, openai-codex-responses, anthropic-messages, google-generative-ai, google-vertex

API key resolution: The apiKey field is checked as environment variable name first, then used as literal value.

API override: Set api at provider level (default for all models) or model level (override per model).

Custom headers:

{
  "providers": {
    "custom-proxy": {
      "baseUrl": "https://proxy.example.com/v1",
      "apiKey": "YOUR_API_KEY",
      "api": "anthropic-messages",
      "headers": {
        "User-Agent": "Mozilla/5.0 ...",
        "X-Custom-Auth": "token"
      },
      "models": [...]
    }
  }
}

Authorization header: Set authHeader: true to add Authorization: Bearer <apiKey> automatically.

OpenAI compatibility (compat field):

Field Description
supportsStore Whether provider supports store field
supportsDeveloperRole Use developer vs system role
supportsReasoningEffort Support for reasoning_effort parameter
maxTokensField Use max_completion_tokens or max_tokens

Live reload: The file reloads each time you open /model. Edit during session; no restart needed.

Model selection priority:

  1. CLI args (--provider, --model)
  2. First from --models scope (new sessions only)
  3. Restored from session (--continue, --resume)
  4. Saved default from settings
  5. First available model with valid API key

omp can help you create custom provider and model configurations.

Settings File

Settings are loaded from two locations and merged:

  1. Global: ~/.omp/agent/settings.json - user preferences
  2. Project: <cwd>/.omp/settings.json - project-specific overrides (version control friendly)

Project settings override global settings. For nested objects, individual keys merge. Settings changed via TUI (model, thinking level, etc.) are saved to global preferences only.

Global ~/.omp/agent/settings.json stores persistent preferences:

{
	"theme": "dark",
	"modelRoles": {
		"default": "anthropic/claude-sonnet-4-20250514"
	},
	"defaultThinkingLevel": "medium",
	"enabledModels": ["anthropic/*", "*gpt*", "gemini-2.5-pro:high"],
	"queueMode": "one-at-a-time",
	"shellPath": "C:\\path\\to\\bash.exe",
	"hideThinkingBlock": false,
	"collapseChangelog": false,
	"compaction": {
		"enabled": true,
		"reserveTokens": 16384,
		"keepRecentTokens": 20000
	},
	"skills": {
		"enabled": true
	},
	"retry": {
		"enabled": true,
		"maxRetries": 3,
		"baseDelayMs": 2000
	},
	"terminal": {
		"showImages": true
	}
}
Setting Description Default
theme Color theme name auto-detected
modelRoles Model assignments by role (e.g., {"default": "...", "slow": "...", "smol": "...", "plan": "..."}) -
defaultThinkingLevel Thinking level: off, minimal, low, medium, high, xhigh -
enabledModels Model patterns for cycling. Supports glob patterns (github-copilot/*, *sonnet*) and fuzzy matching. Same as --models CLI flag -
queueMode Message queue mode: all or one-at-a-time one-at-a-time
shellPath Custom bash path (Windows) auto-detected
hideThinkingBlock Hide thinking blocks in output false
collapseChangelog Show condensed changelog after update false
compaction.enabled Enable auto-compaction true
compaction.reserveTokens Tokens to reserve before compaction triggers 16384
compaction.keepRecentTokens Recent tokens to keep after compaction 20000
skills.enabled Enable skills discovery true
retry.enabled Auto-retry on transient errors true
retry.maxRetries Maximum retry attempts 3
retry.baseDelayMs Base delay for exponential backoff 2000
terminal.showImages Render images inline (supported terminals) true

Extensions

Themes

Built-in themes: dark (default), light. Auto-detected on first run.

Select theme via /settings or set in ~/.omp/agent/settings.json.

Custom themes: Create ~/.omp/agent/themes/*.json. Custom themes support live reload.

mkdir -p ~/.omp/agent/themes
cp $(npm root -g)/@oh-my-pi/pi-coding-agent/dist/theme/dark.json ~/.omp/agent/themes/my-theme.json

Select with /settings, then edit the file. Changes apply on save.

See Theme Documentation on how to create custom themes in detail. Omp can help you create a new one.

VS Code terminal fix: Set terminal.integrated.minimumContrastRatio to 1 for accurate colors.

Custom Slash Commands

Define reusable prompts as Markdown files:

Locations:

  • Global: ~/.omp/agent/commands/*.md
  • Project: .omp/commands/*.md

Format:

---
description: Review staged git changes
---

Review the staged changes (`git diff --cached`). Focus on:

- Bugs and logic errors
- Security issues
- Error handling gaps

Filename (without .md) becomes the command name. Description shown in autocomplete.

Arguments:

---
description: Create a component
---

Create a React component named $1 with features: $@

Usage: /component Button "onClick handler" "disabled support"

  • $1 = Button
  • $@ = all arguments joined

Namespacing: Subdirectories create prefixes. .omp/commands/frontend/component.md → /component (project:frontend)

Skills

Skills are self-contained capability packages that the agent loads on-demand. Omp implements the Agent Skills standard, warning about violations but remaining lenient.

A skill provides specialized workflows, setup instructions, helper scripts, and reference documentation for specific tasks. Skills are loaded when the agent decides a task matches the description, or when you explicitly ask to use one.

Example use cases:

  • Web search and content extraction (Brave Search API)
  • Browser automation via Chrome DevTools Protocol
  • Google Calendar, Gmail, Drive integration
  • PDF/DOCX processing and creation
  • Speech-to-text transcription
  • YouTube transcript extraction

Skill locations:

  • Omp user: ~/.omp/agent/skills/*/SKILL.md
  • Omp project: .omp/skills/*/SKILL.md
  • Claude Code: ~/.claude/skills/*/SKILL.md and .claude/skills/*/SKILL.md
  • Codex CLI: ~/.codex/skills/*/SKILL.md

Format:

---
name: brave-search
description: Web search via Brave Search API. Use for documentation, facts, or web content.
---

# Brave Search

## Setup

\`\`\`bash
cd /path/to/brave-search && npm install
\`\`\`

## Usage

\`\`\`bash
./search.js "query" # Basic search
./search.js "query" --content # Include page content
\`\`\`
  • name: Required. Must match parent directory name. Lowercase, hyphens, max 64 chars.
  • description: Required. Max 1024 chars. Determines when the skill is loaded.

Disable skills: omp --no-skills or set skills.enabled: false in settings.

See docs/skills.md for details, examples, and links to skill repositories. omp can help you create new skills.

Hooks

Hooks are TypeScript modules that extend omp's behavior by subscribing to lifecycle events. Use them to:

  • Block dangerous commands (permission gates for rm -rf, sudo, etc.)
  • Checkpoint code state (git stash at each turn, restore on /branch)
  • Protect paths (block writes to .env, node_modules/, etc.)
  • Modify tool output (filter or transform results before the LLM sees them)
  • Inject messages from external sources to wake up the agent (file watchers, webhooks, CI systems)

Hook locations:

  • Global: ~/.omp/agent/hooks/pre/*.ts, ~/.omp/agent/hooks/post/*.ts
  • Project: .omp/hooks/pre/*.ts, .omp/hooks/post/*.ts
  • CLI: --hook <path> (for debugging)

Quick example (permission gate):

import type { HookAPI } from "@oh-my-pi/pi-coding-agent/hooks";

export default function (omp: HookAPI) {
	omp.on("tool_call", async (event, ctx) => {
		if (event.toolName === "bash" && /sudo/.test(event.input.command as string)) {
			const ok = await ctx.ui.confirm("Allow sudo?", event.input.command as string);
			if (!ok) return { block: true, reason: "Blocked by user" };
		}
		return undefined;
	});
}

Sending messages from hooks:

Use omp.sendMessage(message, triggerTurn?) to inject messages into the session. Messages are persisted as CustomMessageEntry and sent to the LLM. If the agent is streaming, the message is queued; otherwise a new agent loop starts if triggerTurn is true.

import * as fs from "node:fs";
import type { HookAPI } from "@oh-my-pi/pi-coding-agent/hooks";

export default function (omp: HookAPI) {
	omp.on("session_start", async () => {
		fs.watch("/tmp/trigger.txt", () => {
			const content = fs.readFileSync("/tmp/trigger.txt", "utf-8").trim();
			if (content) {
				omp.sendMessage(
					{
						customType: "file-trigger",
						content,
						display: true,
					},
					true
				); // triggerTurn: start agent loop
			}
		});
	});
}

See Hooks Documentation for full API reference. omp can help you create new hooks

See examples/hooks/ for working examples including permission gates, git checkpointing, and path protection.

Custom Tools

Custom tools let you extend the built-in toolset (read, write, edit, bash, ...) and are called by the LLM directly. They are TypeScript modules that define tools with optional custom TUI integration for getting user input and custom tool call and result rendering.

Tool locations (auto-discovered):

  • Global: ~/.omp/agent/tools/*/index.ts
  • Project: .omp/tools/*/index.ts

Explicit paths:

  • CLI: --tool <path> (any .ts file)
  • Settings: customTools array in settings.json

Quick example:

import { Type } from "@sinclair/typebox";
import type { CustomToolFactory } from "@oh-my-pi/pi-coding-agent";

const factory: CustomToolFactory = (omp) => ({
	name: "greet",
	label: "Greeting",
	description: "Generate a greeting",
	parameters: Type.Object({
		name: Type.String({ description: "Name to greet" }),
	}),

	async execute(toolCallId, params, onUpdate, ctx, signal) {
		const { name } = params as { name: string };
		return {
			content: [{ type: "text", text: `Hello, ${name}!` }],
			details: { greeted: name },
		};
	},
});

export default factory;

Features:

  • Access to omp.cwd, omp.exec(), omp.ui (select/confirm/input dialogs)
  • Session lifecycle via onSession callback (for state reconstruction)
  • Custom rendering via renderCall() and renderResult() methods
  • Streaming results via onUpdate callback
  • Abort handling via signal parameter
  • Multiple tools from one factory (return an array)

See Custom Tools Documentation for the full API reference, TUI component guide, and examples. omp can help you create custom tools.

See examples/custom-tools/ for working examples including a todo list with session state management and a question tool with UI interaction.


CLI Reference

omp [options] [@files...] [messages...]

Options

Option Description
--provider <name> Provider: anthropic, openai, google, mistral, xai, groq, cerebras, openrouter, zai, cursor, github-copilot, openai-codex, google-gemini-cli, google-antigravity, or custom
--model <id> Model ID
--api-key <key> API key (overrides environment)
--system-prompt <text|file> Custom system prompt (text or file path)
--append-system-prompt <text|file> Append to system prompt
--mode <mode> Output mode: text, json, rpc (implies --print)
--print, -p Non-interactive: process prompt and exit
--no-session Don't save session
--session <path> Use specific session file
--session-dir <dir> Directory for session storage and lookup
--continue, -c Continue most recent session
--resume, -r Select session to resume
--models <patterns> Comma-separated patterns for model role cycling. Supports glob patterns (e.g., anthropic/*, *sonnet*:high) and fuzzy matching (e.g., sonnet,haiku:low)
--no-tools Disable all built-in tools
--tools <tools> Restrict to comma-separated tool list (default: all tools enabled)
--thinking <level> Thinking level: off, minimal, low, medium, high, xhigh
--extension <path>, -e Load an extension file (can be used multiple times)
--no-extensions Disable extension discovery (explicit -e paths still work)
--no-skills Disable skills discovery and loading
--skills <patterns> Comma-separated glob patterns to filter skills (e.g., git-*,docker)
--no-lsp Disable LSP integration
--hook <path> Load a hook file (for debugging)
--export <file> [output] Export session to HTML
--help, -h Show help
--version, -v Show version

File Arguments

Include files with @ prefix:

omp @prompt.md "Answer this"
omp @screenshot.png "What's in this image?"
omp @requirements.md @design.png "Implement this"

Text files wrapped in <file name="path">content</file>. Images attached as base64.

Examples

# Interactive mode
omp

# Interactive with initial prompt
omp "List all .ts files in src/"

# Non-interactive
omp -p "List all .ts files in src/"

# With files
omp -p @code.ts "Review this code"

# JSON event stream
omp --mode json "List files"

# RPC mode (headless)
omp --mode rpc --no-session

# Continue session
omp -c "What did we discuss?"

# Specific model
omp --provider openai --model gpt-4o "Help me refactor"

# Model cycling with thinking levels
omp --models sonnet:high,haiku:low

# Limit to specific provider with glob pattern
omp --models "github-copilot/*"

# Read-only mode
omp --tools read,grep,find,ls -p "Review the architecture"

# Export session
omp --export session.jsonl output.html

Environment Variables

Variable Description
ANTHROPIC_API_KEY, OPENAI_API_KEY, etc. API keys for providers (see API Keys & OAuth)
OMP_CODING_AGENT_DIR Override the agent config directory (default: ~/.omp/agent)
VISUAL, EDITOR External editor for Ctrl+G (e.g., vim, code --wait)

Tools

All tools are enabled by default. Use --tools <list> to restrict to a subset.

Core Tools

Tool Description
read Read file contents. Images sent as attachments. Text: first 2000 lines. Use offset/limit for large files.
write Write/overwrite file. Creates parent directories.
edit Replace text in file with fuzzy whitespace matching. Fails if text appears multiple times or not found.
bash Execute command. Returns stdout/stderr. Optional timeout parameter.
grep Search file contents (regex or literal). Respects .gitignore.
find Search for files by glob pattern. Respects .gitignore.
ls List directory contents. Includes dotfiles.

Additional Built-in Tools

Tool Description
task Spawn sub-agents for complex multi-step tasks
lsp Language Server Protocol queries (go-to-definition, references, hover)
todo_write Track task progress during sessions
web_search Search the web
fetch Fetch and process URLs
python Execute Python code in IPython kernel
notebook Edit Jupyter notebook cells

Example: --tools read,grep,find,ls for read-only code review.

For adding new tools, see Custom Tools in the Configuration section.


Programmatic Usage

SDK

For embedding omp in Node.js/TypeScript applications, use the SDK:

import { createAgentSession, discoverAuthStorage, discoverModels, SessionManager } from "@oh-my-pi/pi-coding-agent";

const authStorage = await discoverAuthStorage();
const modelRegistry = await discoverModels(authStorage);

const { session } = await createAgentSession({
	sessionManager: SessionManager.inMemory(),
	authStorage,
	modelRegistry,
});

session.subscribe((event) => {
	if (event.type === "message_update" && event.assistantMessageEvent.type === "text_delta") {
		process.stdout.write(event.assistantMessageEvent.delta);
	}
});

await session.prompt("What files are in the current directory?");

The SDK provides full control over:

  • Model selection and thinking level
  • System prompt (replace or modify)
  • Tools (built-in subsets, custom tools)
  • Hooks (inline or discovered)
  • Skills, context files, slash commands
  • Session persistence (SessionManager)
  • Settings (SettingsManager)
  • API key resolution and OAuth

Philosophy: "Omit to discover, provide to override." Omit an option and omp discovers from standard locations. Provide an option and your value is used.

See SDK Documentation for the full API reference. See examples/sdk/ for working examples from minimal to full control.

RPC Mode

For embedding omp from other languages or with process isolation:

omp --mode rpc --no-session

Send JSON commands on stdin:

{"type":"prompt","message":"List all .ts files"}
{"type":"abort"}

See RPC Documentation for the full protocol.

HTML Export

omp --export session.jsonl              # Auto-generated filename
omp --export session.jsonl output.html  # Custom filename

Works with both session files and streaming event logs from --mode json.


Philosophy

Omp is a fork of Pi by Mario Zechner. Pi is intentionally minimal—no MCP, no sub-agents, no built-in todos. Omp is the opposite: batteries included.

Yin to Pi's Yang. Same foundation, different philosophy. Pi strips away; omp adds on. Both are valid approaches—pick what fits your workflow.

Full toolset by default. Sub-agents, MCP, LSP, web search, Python execution, todo tracking—all enabled out of the box. Use --tools to restrict when needed.

Agent orchestration built-in. The Task tool spawns specialized sub-agents (explore, plan, reviewer, task) for complex multi-step work. Parallelism and delegation, not just chat.

Multiple extension points. Skills for on-demand capabilities, Hooks for lifecycle control, Custom Tools for new abilities, MCP for existing integrations.


Development

Forking / Rebranding

Configure via package.json:

{
	"ompConfig": {
		"name": "omp",
		"configDir": ".omp"
	}
}

Change name, configDir, and bin field for your fork. Affects CLI banner, config paths, and environment variable names.

Path Resolution

Three execution modes: npm install, standalone binary, tsx from source.

Always use src/config.ts for package assets:

import { getPackageDir } from "./config.js";

Never use __dirname directly for package assets.

Debug Command

/debug (hidden) writes rendered lines with ANSI codes to ~/.omp/agent/omp-debug.log for TUI debugging, as well as the last set of messages that were sent to the LLM.

For architecture and contribution guidelines, see DEVELOPMENT.md.


License

MIT

See Also