omni-dev
An intelligent Git commit message toolkit with AI-powered contextual intelligence. Transform messy commit histories into professional, conventional commit formats with project-aware suggestions.
π¬ See It In Action
Watch omni-dev transform messy commits into professional ones with AI-powered analysis
30-Second Demo
Transform your commit messages and create professional PRs with AI intelligence:
# Analyze and improve commit messages in your current branch
# Before: "fix stuff", "wip", "update files"
# After: "feat(auth): implement OAuth2 authentication system"
# "docs(api): add comprehensive endpoint documentation"
# "fix(ui): resolve mobile responsive layout issues"
# Create a professional PR with AI-generated description
# π Generates comprehensive PR with detailed description, testing info, and more
β¨ Key Features
- π€ AI-Powered Intelligence: Claude AI analyzes your code changes to suggest meaningful commit messages and PR descriptions
- π§ Contextual Awareness: Understands your project structure, conventions, and work patterns
- π Comprehensive Analysis: Deep analysis of commits, branches, and file changes
- βοΈ Smart Amendments: Safely improve single or multiple commit messages
- π PR Creation: Generate professional pull requests with AI-powered descriptions
- π¦ Automatic Batching: Handles large commit ranges intelligently
- π― Conventional Commits: Automatic detection and formatting
- π Browser Bridge: Drive HTTP requests through an authenticated browser tab without exfiltrating cookies or tokens
- ποΈ Worktrees View: One live view of every repo and git worktree open across all your VS Code windows
- π‘οΈ Safety First: Working directory validation, protection against amending commits already in remote main branches, and error recovery
- β‘ Fast & Reliable: Built with Rust for memory safety and performance
π Quick Start
Installation
# Install from crates.io
# Install with Nix
# Install with Nix flakes (development)
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.)
Shell Completion
omni-dev completions <shell> prints a completion script to stdout for
bash, zsh, fish, powershell, or elvish. The quickest path is bash
per-user:
# Add to ~/.bashrc:
See docs/shell-completion.md for per-shell install
recipes, the $fpath/compinit setup zsh requires, and troubleshooting.
π How omni-dev Compares
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.
vs AI commit tools
| 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 |
vs Atlassian-workflow MCP servers
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.0.9) + 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.
π Core Commands
π€ AI-Powered Commit Improvement (twiddle)
The star feature - intelligently improve your commit messages with real-time model information display:
# Improve commits with contextual intelligence
# Process large commit ranges with parallel processing
# Save suggestions to file for review
# Auto-apply improvements without confirmation
π Analysis Commands
# Analyze commits in detail (YAML output)
# Analyze current branch vs main
# Get comprehensive help
π AI-Powered PR Creation
Create professional pull requests with AI-generated descriptions:
# Generate and create PR with AI-powered description
# Create PR with specific base branch
# Save PR details to file without creating
# Auto-create without confirmation
π Atlassian Integration
Read, write, and manage JIRA issues and Confluence pages from the command line:
# Authenticate with Atlassian Cloud
# Check authentication status
# Fetch a JIRA issue as markdown
# Fetch as raw ADF JSON
# Push markdown changes back to JIRA
# Interactive edit: fetch, edit in $EDITOR, push
# Search issues with JQL
# Create an issue
# Transition an issue
# Confluence: read, search, create pages
# Convert markdown to ADF JSON (offline)
π Datadog Integration (read-only)
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.
# Configure Datadog API credentials (prompts for API key, APP key, and site)
# Verify the credentials by calling /api/v1/validate
# Query metrics, monitors, dashboards, logs, and SLOs
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.
ποΈ Transcript Fetching
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.
# Fetch captions for a YouTube video as SubRip (default).
# WebVTT to a file, falling through to auto-generated captions if needed.
# Synthesise a translated track when no native French track exists.
# List available caption tracks (manual + auto-generated).
# Show video metadata (title, channel, duration, languages).
--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.
π Browser Bridge
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.
# Start the bridge; it prints the bound ports, a session token, and a JS
# snippet to paste into the DevTools console of the authenticated tab.
# Drive requests through the tab (token from the bridge's stdout).
# POST a JSON payload from a file, with a custom header.
# Stream a long-lived endpoint (SSE / chunked) instead of buffering.
# Route to a specific tab when several are connected (by id or origin).
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.
π°οΈ Daemon
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.
# Start the background daemon (installs a launchd LaunchAgent on macOS)
# Per-service status (add --json for machines)
# Restart or stop it
The daemon is Unix-only β its control plane is a Unix-domain socket β while the rest of omni-dev runs everywhere.
βοΈ Snowflake
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.
# Run SQL (from an argument or stdin); the first query opens the SSO browser
# Per-query context overrides and JSON output
# Inspect or evict live sessions
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.
π Request Log
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.
# Recent activity (one line each)
# Filter by service and status class, or a query expression; follow live
# Full records as JSON (byte-identical to the on-disk lines)
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.
ποΈ Worktrees
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.
# One line per open window and its folders (add --json for machines)
Runs on the daemon, so it is Unix-only.
π Coverage Diff
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. It powers the project's PR coverage comment and runs locally too. See docs/coverage.md.
# Patch coverage for the working tree against the default merge-base
# Fail if patch coverage is under 80% (a CI gate or a pre-push check)
# Full report with project deltas, as JSON
βοΈ Manual Amendment
# Apply specific amendments from YAML file
π§© Claude Code Slash-Commands
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.
# Generate all templates: commit-twiddle, pr-create, pr-update
# Or individually
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.
ποΈ Claude Conversation History
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.
# Mirror ~/.claude/projects to ./history/ (one .jsonl per chat, grouped by project slug)
# Limit to one project (encoded slug or decoded cwd path)
# Only sessions touched in the last week
# Preview without writing, then prune target files for sessions removed upstream
# Render LLM-friendly markdown alongside the raw jsonl (one .md per session)
# Markdown only β suitable for piping into a coaching LLM
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:
AskUserQuestioncalls 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 denials show up as
**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 nexttool_result. - Tool interrupts (escape mid-execution) render as
**Tool result (<tool>, interrupted by user):**. - Errors (real tool failures, distinct from user denials) keep the
errorlabel; successes useok.
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).
π MCP Server
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 six 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 |
| 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.
Install
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.
Claude Desktop
Edit ~/Library/Application Support/Claude/claude_desktop_config.json on
macOS (or %APPDATA%\Claude\claude_desktop_config.json on Windows):
Claude Code
Per-project β create .mcp.json at the repo root:
Or register globally with the Claude Code CLI:
Smoke-test with the MCP Inspector
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.
For troubleshooting (stderr logs, RUST_LOG=debug, "failed to open git
repository"), see docs/mcp.md#troubleshooting.
βοΈ Configuration Commands
# Show supported AI models and their specifications
# View model information with token limits and capabilities
|
π§ Contextual Intelligence
omni-dev understands your project context to provide better suggestions:
Project Configuration
Create .omni-dev/ directory in your repo root:
Scope Definitions (.omni-dev/scopes.yaml)
scopes:
- name: "auth"
description: "Authentication and authorization systems"
examples:
file_patterns:
- name: "api"
description: "REST API endpoints and handlers"
examples:
file_patterns:
Commit Guidelines (.omni-dev/commit-guidelines.md)
- --
- --
π― Advanced Features
Intelligent Context Detection
omni-dev automatically detects:
- Project Conventions: From
.omni-dev/,CONTRIBUTING.md - Work Patterns: Feature development, bug fixes, documentation, refactoring
- Branch Context: Extracts work type from branch names
(
feature/auth-system) - File Architecture: Understands UI, API, core logic, configuration changes
- Change Significance: Adjusts detail level based on impact
Automatic Batching
Large commit ranges are automatically split into manageable batches:
# Processes 50 commits in batches of 4 (default)
# Custom concurrency for very large ranges
Command Options
| 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.
π Real-World Examples
Before & After
Before: Messy commit history
e4b2c1a fix stuff
a8d9f3e wip
c7e1b4f update files
9f2a6d8 more changes
After: Professional commit messages
e4b2c1a feat(auth): implement JWT token validation system
a8d9f3e docs(api): add comprehensive OpenAPI documentation
c7e1b4f fix(ui): resolve mobile responsive layout issues
9f2a6d8 refactor(core): optimize database query performance
Workflow Integration
# 1. Work on your feature branch
# 2. Make commits (don't worry about perfect messages)
# 3. Before merging, improve all commit messages
# 4. Create professional PR with AI-generated description
# β
Professional commit history + comprehensive PR description ready for review
Contributing
We welcome contributions! Please see our Contributing Guidelines for details.
Development Setup
-
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:
π Documentation
- Getting Started - 10-minute walkthrough from install to first AI-improved commit (start here)
- User Guide - Comprehensive usage guide with examples
- Configuration Guide - Set up contextual intelligence
- Why JFM? - Why omni-dev edits Atlassian content as Markdown instead of raw ADF
- API Documentation - Rust API reference
- Troubleshooting - Common issues and solutions
- Examples - Real-world usage examples
- Release Process - For contributors
π§ Requirements
- Rust: 1.80+ (for installation from source)
- Claude API Key: Required for AI-powered features
- See Authentication for
setup (env var,
.env, or CI/CD secrets)
- See Authentication for
setup (env var,
- AI Model Selection: Optional configuration for specific models
- View available models:
omni-dev config models show - Pick per-invocation with the global
--modelflag, or configure viaOMNI_DEV_MODEL/ the per-backend env chain (CLAUDE_MODEL,CLAUDE_CODE_MODEL,ANTHROPIC_MODELfor Claude-family backends;OPENAI_MODEL;OLLAMA_MODEL) or~/.omni-dev/settings.json - Supports standard identifiers and Bedrock-style formats
- View available models:
- Atlassian Credentials (for JIRA/Confluence features): Instance URL, email, and
API token
- Configure with:
omni-dev atlassian auth login
- Configure with:
- Datadog Credentials (for Datadog features): API key, application key, and site
- Configure with:
omni-dev datadog auth login
- Configure with:
- Git: Any modern version
AI backend selection
omni-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β sandboxedclaude -psubprocess 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.
π Debugging
For troubleshooting and detailed logging, use the RUST_LOG environment variable:
# Enable debug logging for omni-dev components
RUST_LOG=omni_dev=debug
# Debug specific modules (e.g., context discovery)
RUST_LOG=omni_dev::claude::context::discovery=debug
# Show only errors and warnings
RUST_LOG=warn
See Troubleshooting Guide for detailed debugging information.
Changelog
See CHANGELOG.md for a list of changes in each version.
License
This project is licensed under the BSD 3-Clause License - see the LICENSE file for details.
Support
- π Issues
- π¬ Discussions
Acknowledgments
- Thanks to all contributors who help make this project better!
- Built with β€οΈ using Rust