The full upstream README, mirrored here for reference. Install config, tool schemas, adoption signals, and an original overview live on the Omni Dev listing page.
An intelligent Git commit message toolkit with AI-powered contextual intelligence. Transform messy commit histories into professional, conventional commit formats with project-aware suggestions.
Watch omni-dev transform messy commits into professional ones with AI-powered analysis
Transform your commit messages and create professional PRs with AI intelligence:
Next step: see Getting Started — a 10-minute walkthrough from authentication to your first AI-improved commit. (For just the API-key reference, see Authentication.)
omni-dev completions <shell> prints a completion script to stdout for
bash, zsh, fish, powershell, or elvish. The quickest path is bash
per-user:
See docs/shell-completion.md for per-shell install
recipes, the $fpath/compinit setup zsh requires, and troubleshooting.
omni-dev sits in two adjacent spaces — AI commit-message tooling and
Atlassian/dev-workflow MCP servers. The tables below contrast the
incumbents on the dimensions a first-time reader is most likely to weigh.
In every cell, ✅ means full / native support, ⚠ means partial or
available only with caveats, and ❌ means not supported — and omni-dev's
own limitations are flagged just as honestly (the ⚠ marks in its own
columns).
Beyond these two niches, omni-dev also ships a supervised daemon that
hosts a browser bridge (an authenticated proxy that runs requests
through a logged-in browser tab for SSO-gated dashboards such as Grafana
and Loki), a Snowflake SQL service (one external-browser SSO session
reused for concurrent queries), and a worktrees registry (one live view of
the repos open across every VS Code window), plus a local append-only
request log (omni-dev log). These have no direct incumbent in either
table below, so
they are called out here rather than scored against tools that don't aim
for them.
| omni-dev | opencommit | aicommits | |
|---|---|---|---|
| Rewrite existing commits in a range | ✅ twiddle | ❌ pre-commit only | ❌ pre-commit only |
| Parallel batched processing (long ranges) | ✅ --concurrency N | ❌ | ❌ |
| AI-written PR descriptions | ✅ git branch create pr | ⚠ GitHub Action only | ❌ |
| Project-context awareness | ✅ --use-context | ❌ | ❌ |
Sandboxed claude-cli backend | ✅ ADR-0028 | ❌ | ❌ |
| Multi-backend (Anthropic / Bedrock / OpenAI / Ollama) | ✅ | ✅ | ✅ |
| Conventional Commits | ✅ | ✅ | ⚠ config |
| Language / runtime | Rust (static binary) | Node.js | Node.js |
omni-dev's MCP server also exposes Git tools (commit analysis, twiddling,
PR creation), Datadog tools, and an ai_chat proxy — surfaces the
Atlassian-focused servers don't aim for. The table below compares only
Atlassian capability depth.
| omni-dev MCP | sooperset/mcp-atlassian | Atlassian official (Rovo) | |
|---|---|---|---|
| Jira REST surface | ✅ 36 tools (agile, fields, dev panel, links, watchers, worklogs, versions, changelog) | ✅ 49 tools (above + JSM, proforma forms, SLA, batch ops) | ⚠ 14 tools (basic CRUD, search, transitions, worklogs only) |
| Confluence REST surface | ✅ 25 tools (history, diff, attachments, labels, spaces, inline + footer comments) | ✅ 24 tools (history, diff, attachments, labels; no inline comments / spaces) | ⚠ 12 tools (inline + footer comments, spaces; no delete / move / history / diff / attachments / labels) |
| Lossless JFM ↔ ADF round-trip | ✅ full ADF node set (schema v56.1.18) + unsupported-node escape | ❌ | ⚠ raw ADF, model-dependent |
| Anchored review-comment preservation | ✅ annotation marks survive round-trip | ❌ anchor stripped, comments orphaned | ⚠ ADF carries anchors; model-dependent |
| Pre-flight ADF schema validation | ✅ nesting + arity, before write | ❌ | ❌ |
| Offline JFM ↔ ADF conversion (no creds) | ✅ atlassian_convert | ❌ | ❌ |
| Cloud + Server + Data Center | ⚠ Cloud verified | ✅ Cloud + Server (v6+) + DC (Jira v8.14+) | ❌ Cloud only |
| Auth | ⚠ API token only | ✅ API token / PAT / OAuth 2.0 | ✅ OAuth 2.1 / API token |
Last verified: 2026-06-23. omni-dev and sooperset rows are live-tested — a
tools/list enumeration (omni-dev branch build vs
ghcr.io/sooperset/mcp-atlassian:latest) plus a live read→write→read fidelity
cycle on a complex page. Atlassian Rovo's server accepts the API token but
gates tool execution behind an org-admin grant, so its rows combine
Atlassian's
Supported tools
docs with the ADF-passthrough reasoning (raw ADF can round-trip, but only if
the model echoes it faithfully — no deterministic guarantee), not a live run.
Refresh quarterly or whenever a release-note search for the comparators flags
a relevant change.
twiddle)The star feature - intelligently improve your commit messages with real-time model information display:
Create professional pull requests with AI-generated descriptions:
Read, write, and manage JIRA issues and Confluence pages from the command line:
Authenticate against the Datadog API and query metrics, monitors, dashboards, logs, events, SLOs, hosts, and downtimes. See the Datadog integration guide for the full subcommand reference, authentication setup, rate-limit behaviour, and troubleshooting.
DATADOG_SITE defaults to datadoghq.com. Other regions (datadoghq.eu,
us3.datadoghq.com, us5.datadoghq.com, ap1.datadoghq.com, ddog-gov.com)
are recognised without warning. Environment variables DATADOG_API_KEY,
DATADOG_APP_KEY, DATADOG_SITE override the stored settings. For on-prem
or proxied installs, set DATADOG_API_URL to override the site-derived URL.
All Datadog subcommands are also exposed as MCP tools (datadog_*) — see
docs/mcp.md. For the full guide covering
every family with worked examples, see docs/datadog.md.
Authenticate against your own Gmail account via OAuth2 (loopback
authorization-code + PKCE), search/read/label messages and threads, and
maintain a durable local archive with gmail sync. New to this
integration? Start with the
Gmail Quickstart for a zero-to-synced-archive
walkthrough; see the Gmail integration guide for
prerequisites (you bring your own Google Cloud OAuth2 client — Gmail read
scopes require Google's CASA security assessment to distribute otherwise),
authentication setup, rate-limit behaviour, and troubleshooting.
An OAuth2 client left in Google's "Testing" publishing status issues
refresh tokens that expire after 7 days — see
docs/gmail.md for how to avoid re-running
auth login weekly.
Every read-only Gmail subcommand except sync is also exposed as an MCP
tool (gmail_*) — see docs/mcp.md; sync is
CLI-only (a long-running bulk filesystem operation, a poor fit for a
synchronous MCP call). For the full guide, see
docs/gmail.md.
Authenticate against your own Google Drive account via OAuth2 (loopback
authorization-code + PKCE, the same flow as Gmail), then search files, read
their metadata or content, find duplicates, rename/move files, and create,
upload, or replace file content. Every write is opt-in twice over. First by
OAuth scope: the default drive.readonly covers search/read/dedupe;
rename/move need drive.metadata (drive auth login --write), the narrowest
write scope Google offers; create/upload need drive.file
(--write-file); and editing a file omni-dev did not itself create needs the
unrestricted drive scope (--write-full). Second by a local,
folder-scoped gate: create/upload/edit resolve the target's ancestor
folder chain against per-account rules in settings.json — closest ancestor
wins, deny beats allow, and a write with no matching rule is denied — so
an OAuth grant alone never authorizes a mutation (see
ADR-0071). Inspect that gate with drive permissions show/lookup-folder/check before granting anything. There is still no
trash/share/permission-mutation capability anywhere in this surface. drive move is separately security-gated: it refuses any move that would change a
file's visibility by default (see ADR-0070).
New to this integration? Start with the
Drive Quickstart for a zero-to-first-search
walkthrough; see the Drive integration guide for
prerequisites (you bring your own Google Cloud OAuth2 client, independent
of Gmail's), authentication setup, rate-limit behaviour, and
troubleshooting.
An OAuth2 client left in Google's "Testing" publishing status issues
refresh tokens that expire after 7 days — see
docs/drive.md for how to avoid re-running
auth login weekly.
Five read-only MCP tools (drive_*) mirror the CLI's auth status,
search, dedupe, read, and account list — see
docs/mcp.md. The mutating verbs —
rename/move/create/upload/edit — have no MCP equivalent. For the
full guide, see docs/drive.md.
Pull captions and transcripts from external media platforms. YouTube is the first supported source; the CLI namespace and library are designed so additional sources (Vimeo, podcast RSS, generic VTT/SRT URLs) can be added without restructuring. See docs/transcript.md for the full reference and the recipe for adding a new source.
--format accepts srt, vtt, txt, or json. Locators may be a
watch?v= URL, a youtu.be/ short URL, a /shorts/ or /embed/ URL,
or a bare 11-character video ID. Age-gated and login-required videos
surface as a typed PlayabilityRefused error carrying YouTube's status
code rather than a generic HTTP failure.
Drive HTTP requests through an authenticated browser tab. When you are investigating internal services (Grafana/Loki, internal dashboards, SSO-gated admin panels), the browser already holds sessions — SSO, OAuth, cookies — that are hard to replicate programmatically. The bridge issues requests inside the browser's authenticated context without exfiltrating cookies or tokens (a confused deputy by design). Both planes are authenticated and default-closed; see docs/browser-bridge.md for the full guide and ADR-0036 for the security rationale.
Supports binary and streaming response bodies, multi-tab routing via
X-Omni-Bridge-Target, per-request --credentials and --allow-origin
overrides, and a transparent proxy for tools that speak plain HTTP.
Host long-lived services in one supervised process behind a private per-user
Unix-domain control socket. The browser bridge is the first service migrated
onto it (Snowflake and the worktrees registry followed), and on macOS an
optional menu-bar app gives live control. daemon start installs a launchd LaunchAgent for auto-start at
login, and status reports every hosted service. See
Running under the daemon and
ADR-0039 for the architecture.
The daemon is Unix-only — its control plane is a Unix-domain socket — while the rest of omni-dev runs everywhere.
Authenticate a Snowflake session once via external-browser SSO, then run concurrent arbitrary SQL across any account without an SSO popup on every query. The daemon holds the session in memory and multiplexes a bounded pool, so each query can still set its own warehouse/role/database/schema. See docs/snowflake-service.md.
Account/user/context default from SNOWFLAKE_* env vars then
~/.omni-dev/settings.json — no accounts are hardcoded. Runs on the daemon, so
it is Unix-only.
Every invocation and the HTTP requests it issues are recorded to a local, append-only log you can search and tail. Best-effort and default-on; no secret is ever written (auth headers are redacted, bodies opt-in). See docs/log.md.
Set OMNI_DEV_LOG_DISABLE=1 to turn it off, or OMNI_DEV_LOG_BODIES=1 /
OMNI_DEV_LOG_HEADERS=1 to opt into capturing bodies/headers.
See every repo and git worktree open across all your VS Code windows in one live view. A VS Code extension host is sandboxed per window — no extension alone can see a sibling window's folders — so a small first-party companion extension registers each window with the daemon, which aggregates them into a single registry served back to the CLI, tray, and extension UI. The registry is in-memory only; windows that crash without unregistering age out automatically. See docs/worktrees-service.md and ADR-0040.
Runs on the daemon, so it is Unix-only.
Attribute a per-line coverage report to a git diff and report patch
coverage — the share of added lines that are tested — plus the uncovered new
lines, per-file deltas, and indirect coverage changes. Reads lcov, llvm-cov
JSON, or Cobertura XML (auto-detected), renders markdown/YAML/JSON, and can gate
a branch. Coverage that is inherently non-deterministic across runs — a
CPU-gated region measured on two different runner CPUs — can be excluded by file
or, more precisely, by source comment markers that ignore a region or
tolerate it (keeping its real coverage in the total while masking its
flips). It powers the project's PR coverage comment and runs locally too. See
docs/coverage.md.
Generate ready-to-use Claude Code slash-command templates into the
project's .claude/commands/ directory. Each template is a self-contained
workflow that drives a multi-step omni-dev operation from inside a Claude
Code session.
Each subcommand writes .claude/commands/<name>.md. Commit the files to
share the workflows with collaborators — Claude Code picks them up
automatically, so anyone in the repo can invoke /commit-twiddle,
/pr-create, or /pr-update inside a Claude Code session. See the
user guide
for the full reference.
Export your Claude Code chat history to a directory of .jsonl files for
behavioural analysis, work-log generation, or downstream tooling. Re-running
acts as an idempotent sync: new chats are added, modified chats are
overwritten, unchanged chats are skipped.
The export is a behavioural transcript, not a faithful archive. The top-level session jsonl captures all prompts, responses, thinking blocks, tool calls, and tool-result metadata — the signal needed for analysis. Sub-agent internal turns, large tool-output sidecars, PDF page rasters, and Claude's auto-memory are deliberately excluded; they would bloat any LLM-ingested corpus without adding interaction-pattern signal.
In-progress chats produce a valid jsonl prefix (the source size is captured
once at the start of the copy), so you can sync safely while a chat is open.
The target layout mirrors the source — <target>/<slug>/<uuid>.jsonl — and
source mtime is preserved on each target file so downstream tooling can
sort sessions chronologically without parsing every file.
--output-format markdown writes a derived <target>/<slug>/<uuid>.md
alongside (or instead of) the jsonl. Each markdown file has YAML frontmatter
with session metadata followed by ## User / ## Assistant turns; tool calls
render as ### Tool call: <name> blocks, thinking blocks collapse into
<details>, and sub-agent (Agent) calls render the prompt argument only.
Agent-to-user interactions are surfaced as first-class structured events so the analyst LLM sees what was actually asked and how the user responded:
AskUserQuestion calls render as ### Agent question: <header> with the
question text and a bulleted list of options (with descriptions); the
paired user reply renders as ## User response.**Tool result (<tool>, denied by user):** —
detected by the canonical "The user doesn't want to proceed with this tool
use" sentinel Claude Code stuffs into the next tool_result.**Tool result (<tool>, interrupted by user):**.error label; successes use ok.System reminders, attachments, and permission-mode events are included by
default — pass --exclude-system to drop them. Markdown idempotency keys off
source mtime alone (the rendered length differs from the source length), and
--prune only deletes artifacts whose extension matches one of the formats
listed in --output-format.
See docs/user-guide.md#ai-claude-history-sync--export-conversation-history
for the in-depth reference, and the broader Claude Code Integration
section for related commands (ai chat, ai claude skills).
omni-dev ships an optional Model Context Protocol server so AI assistants
(Claude Desktop, Claude Code, the MCP Inspector, custom agents) can call
omni-dev over stdio instead of shelling out to the CLI. The server is
delivered as a second binary, omni-dev-mcp, gated behind the mcp Cargo
feature (see ADR-0021).
Tools cover seven domains:
| Domain | Examples |
|---|---|
| Git (5) | git_view_commits, git_branch_info, git_check_commits, git_twiddle_commits, git_create_pr |
| JIRA (28) | core read/write/search/transition/comment/link/dev/delete; sprints, boards, watchers, worklogs, fields, attachments, projects, changelog |
| Confluence (13) | read/write/search/create/delete/download/children, comments, labels, user search |
| Atlassian shared (2) | atlassian_auth_status, atlassian_convert (offline JFM ↔ ADF) |
| Datadog (14) | metrics, monitors, dashboards, logs, events, SLOs, hosts, downtimes, metrics catalog |
| Gmail (5) | gmail_auth_status, gmail_search, gmail_message_read, gmail_thread_read, gmail_label_list |
| AI / Config (5) | ai_chat (one-shot chat), claude_skills_* (sync / clean / status for .claude/skills/ distribution), config_models_show |
Resources exposed via URI templates:
| URI template | Returns |
|---|---|
git://repo/commits/{range} | YAML commit analysis |
jira://issue/{key} | JIRA issue as JFM |
jira://issue/{key}.adf | JIRA issue body as ADF |
confluence://page/{id} | Confluence page as JFM |
confluence://page/{id}.adf | Confluence page body as ADF |
omni-dev://specs/{name} | Embedded reference specs (e.g. jfm) |
See docs/mcp.md for the full tool catalog, resource
reference, cross-cutting parameters (output_file, confirm), and
troubleshooting.
This adds a second binary, omni-dev-mcp, alongside the regular omni-dev
CLI. The default cargo install omni-dev build is unchanged — no MCP
dependencies are pulled in unless the mcp feature is enabled.
Edit ~/Library/Application Support/Claude/claude_desktop_config.json on
macOS (or %APPDATA%\Claude\claude_desktop_config.json on Windows):
Per-project — create .mcp.json at the repo root:
Or register globally with the Claude Code CLI:
The Inspector opens a browser UI where you can list tools and resources, call any tool interactively, and fetch resources against the current working directory.
settings.json)Three server defaults can be set once in the mcp section of
~/.omni-dev/settings.json instead of per-invocation env vars or flags. All
three fields are optional; an absent mcp block leaves the built-in
behaviour unchanged.
| Field | Effect | Fallback |
|---|---|---|
default_model | Model for ai_chat when its model param is omitted | model registry default |
log_level | Tracing filter directive for the server | warn (env RUST_LOG overrides) |
max_response_bytes | Cap on a tool response before truncation (0 disables) | 100 KB |
For troubleshooting (stderr logs, RUST_LOG=debug, "failed to open git
repository"), see docs/mcp.md#troubleshooting.
omni-dev understands your project context to provide better suggestions:
Create .omni-dev/ directory in your repo root:
.omni-dev/scopes.yaml).omni-dev/commit-guidelines.md)omni-dev automatically detects:
.omni-dev/, CONTRIBUTING.mdfeature/auth-system)Large commit ranges are automatically split into manageable batches:
| Option | Description | Example |
|---|---|---|
--fresh | Generate fresh messages from the diffs alone (the default; conflicts with --refine) | --fresh |
--refine | Refine the existing messages instead of starting fresh (conflicts with --fresh) | --refine |
--use-context | Enable contextual intelligence | --use-context |
--work-context TEXT | Describe the work being done to steer suggestions | --work-context "feature: user auth" |
--branch-context TEXT | Override the context detected from the branch name | --branch-context "bugfix: login flow" |
--context-dir PATH | Custom context directory | --context-dir ./config |
--model MODEL | Claude API model to use (defaults from settings) | --model claude-sonnet-4-5 |
--beta-header KEY:VALUE | Beta header for API requests (model-gated) | --beta-header key:value |
--concurrency N | Number of parallel commit processors (default: 4) | --concurrency 3 |
--no-coherence | Skip cross-commit coherence refinement pass | --no-coherence |
--no-ai | Skip AI; output the repository analysis YAML only | --no-ai |
--auto-apply | Apply without confirmation | --auto-apply |
--allow-pushed | Allow amending commits already in remote main branches | --allow-pushed |
--check | Validate the messages after applying | --check |
--save-only FILE | Save to file without applying | --save-only fixes.yaml |
--quiet | Only show errors/warnings | --quiet |
See the User Guide's Key Options table
for the full reference; omni-dev git commit message twiddle --help is the
source of truth.
Before: Messy commit history
After: Professional commit messages
We welcome contributions! Please see our Contributing Guidelines for details.
Clone the repository:
Install Rust (if you haven't already):
Build the project:
Run the build script (includes tests, linting, and formatting):
Or run individual steps:
.env, or CI/CD secrets)omni-dev config models show--model flag, or configure via
OMNI_DEV_MODEL / the per-backend env chain (CLAUDE_MODEL,
CLAUDE_CODE_MODEL, ANTHROPIC_MODEL for Claude-family backends;
OPENAI_MODEL; OLLAMA_MODEL) or ~/.omni-dev/settings.jsonomni-dev atlassian auth loginomni-dev datadog auth loginomni-dev supports five AI backends. The global --ai-backend flag (or
OMNI_DEV_AI_BACKEND) selects one decisively — default, claude-cli,
openai, ollama, or bedrock:
--ai-backend claude-cli — sandboxed claude -p subprocess that reuses
your Claude Code session.--ai-backend ollama — local Ollama or LM Studio server.--ai-backend openai — OpenAI Chat Completions API.--ai-backend bedrock — AWS Bedrock.--ai-backend default (or no flag) — direct Anthropic API.When OMNI_DEV_AI_BACKEND is unset, the legacy USE_OLLAMA=true /
USE_OPENAI=true / CLAUDE_CODE_USE_BEDROCK=true variables still select
their backends, in that order.
See the AI Backends Guide for required env vars,
model selection, the Claude CLI sandbox and its escape hatches
(--claude-cli-allow-tools, --claude-cli-allow-mcp), the
--claude-cli-max-budget-usd spending cap, and per-backend troubleshooting.
For troubleshooting and detailed logging, use the RUST_LOG environment variable:
See Troubleshooting Guide for detailed debugging information.
See CHANGELOG.md for a list of changes in each version.
This project is licensed under the BSD 3-Clause License - see the LICENSE file for details.