Omni dev agent
AI-powered git commit rewriter, PR generator, and MCP server for Jira, Confluence, and Datadog.
by rust-works·BSD-3-Clause license·★ 2 Stars on the repo·GitHub ↗
Files of Omni dev
rust-works/
Show the full text1093 lines
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
omni-dev git commit message twiddle 'origin/main..HEAD' --use-context
# 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
omni-dev git branch create pr
# 🎉 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
cargo install omni-dev
# Install with Nix
nix profile install github:rust-works/omni-dev
# Install with Nix flakes (development)
nix run github:rust-works/omni-dev
Pre-built binaries are attached to each
release. The Linux ones
(omni-dev-linux.tar.gz, omni-dev-linux-arm64.tar.gz) are dynamically linked
and need glibc 2.35 or newer (Ubuntu 22.04 and Debian 12 qualify). On an older
host, such as RHEL 9 or Amazon Linux 2023 (glibc 2.34), they fail in the loader
with version `GLIBC_2.xx' not found; build from source with
cargo install omni-dev instead. The release workflow fails if a binary needs
more than that floor (docs/RELEASE.md).
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:
eval "$(omni-dev completions bash)"
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.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.
📋 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
omni-dev git commit message twiddle 'origin/main..HEAD' --use-context
# Process large commit ranges with parallel processing
omni-dev git commit message twiddle 'HEAD~20..HEAD' --concurrency 5
# Save suggestions to file for review
omni-dev git commit message twiddle 'HEAD~5..HEAD' \
--save-only suggestions.yaml
# Auto-apply improvements without confirmation
omni-dev git commit message twiddle 'HEAD~3..HEAD' --auto-apply
🔍 Analysis Commands
# Analyze commits in detail (YAML output)
omni-dev git commit message view 'HEAD~3..HEAD'
# Analyze current branch vs main
omni-dev git branch info main
# Get comprehensive help
omni-dev help-all
🚀 AI-Powered PR Creation
Create professional pull requests with AI-generated descriptions:
# Generate and create PR with AI-powered description
omni-dev git branch create pr
# Create PR with specific base branch
omni-dev git branch create pr main
# Save PR details to file without creating
omni-dev git branch create pr --save-only pr-description.yaml
# Auto-create without confirmation
omni-dev git branch create pr --auto-apply
📝 Atlassian Integration
Read, write, and manage JIRA issues and Confluence pages from the command line:
# Authenticate with Atlassian Cloud
omni-dev atlassian auth login
# Check authentication status
omni-dev atlassian auth status
# Fetch a JIRA issue as markdown
omni-dev atlassian jira read PROJ-123
# Fetch as raw ADF JSON
omni-dev atlassian jira read PROJ-123 --format adf
# Push markdown changes back to JIRA
omni-dev atlassian jira write PROJ-123 issue.md
# Interactive edit: fetch, edit in $EDITOR, push
omni-dev atlassian jira edit PROJ-123
# Search issues with JQL
omni-dev atlassian jira search --project PROJ --status Open
# Create an issue
omni-dev atlassian jira create issue.md --project PROJ --summary "Fix bug"
# Transition an issue
omni-dev atlassian jira transition PROJ-123 "In Progress"
# Confluence: read, search, create pages
omni-dev atlassian confluence read 12345
omni-dev atlassian confluence search --space ENG --title auth
omni-dev atlassian confluence create page.md --space ENG --title "New Page"
# Convert markdown to ADF JSON (offline)
omni-dev atlassian convert to-adf input.md
Self-hosted PATs use atlassian auth login --auth-mode bearer without email.
See PAT authentication and compatibility limits;
most service operations still target Cloud APIs.
📊 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)
omni-dev datadog auth login
# Verify the credentials by calling /api/v1/validate
omni-dev datadog auth status
# Query metrics, monitors, dashboards, logs, and SLOs
omni-dev datadog metrics query --query 'avg:system.cpu.user{*}' --from 15m
omni-dev datadog monitor list --tags env:prod
omni-dev datadog dashboard list
omni-dev datadog logs search --filter 'service:api status:error' --from 1h
omni-dev datadog slo list --tags team:platform
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.
📧 Gmail Integration
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.
# One-time: create your own Google Cloud OAuth2 client (see docs/gmail.md),
# then authenticate (opens a browser)
export GMAIL_CLIENT_ID=...
export GMAIL_CLIENT_SECRET=...
omni-dev gmail auth login
# Verify the credentials by calling users.getProfile
omni-dev gmail auth status
# Search, read messages/threads, and manage labels
omni-dev gmail search --query 'label:finance after:2026/01/01' --limit 50
omni-dev gmail read <message-id>
omni-dev gmail thread <thread-id>
omni-dev gmail label list
# Maintain a durable local archive (.eml files + a JSONL manifest)
omni-dev gmail sync --output-dir ~/mail-archive --query 'label:finance'
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.
📁 Drive Integration
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.
# One-time: create your own Google Cloud OAuth2 client (see docs/drive.md),
# then authenticate (opens a browser)
export DRIVE_CLIENT_ID=...
export DRIVE_CLIENT_SECRET=...
omni-dev drive auth login
# Verify the credentials by calling about.get
omni-dev drive auth status
# Search and read file metadata/content
omni-dev drive search "name contains 'report'"
omni-dev drive read <file-id>
omni-dev drive read <file-id> --content --out-file report.pdf
# Rename/move need the opt-in drive.metadata scope
omni-dev drive auth login --write
omni-dev drive rename <file-id> "New Name.pdf"
omni-dev drive move <file-id> --to <folder-id>
# Creating/uploading/editing content needs a content scope *and* a
# folder rule in settings.json permitting the destination
omni-dev drive auth login --write-file # or --write-full to edit
omni-dev drive permissions show # what is configured
omni-dev drive permissions check <folder-id> --operation create # what it decides
omni-dev drive create --name notes.txt --parent <folder-id>
omni-dev drive upload ./report.pdf --parent <folder-id>
omni-dev drive edit <file-id> --content ./report.pdf # or --content - for stdin
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.
🎙️ 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).
omni-dev transcript youtube fetch https://www.youtube.com/watch?v=jNQXAC9IVRw
# WebVTT to a file, falling through to auto-generated captions if needed.
omni-dev transcript youtube fetch jNQXAC9IVRw \
--format vtt --auto --output me-at-the-zoo.vtt
# Synthesise a translated track when no native French track exists.
omni-dev transcript youtube fetch <url> --lang fr --translate fr
# List available caption tracks (manual + auto-generated).
omni-dev transcript youtube list-langs <url>
# Show video metadata (title, channel, duration, languages).
omni-dev transcript youtube info <url> --output json
--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.
omni-dev browser bridge serve
# Drive requests through the tab (token from the bridge's stdout).
export OMNI_BRIDGE_TOKEN=<token printed by the bridge>
omni-dev browser bridge request --url /loki/api/v1/labels
# POST a JSON payload from a file, with a custom header.
omni-dev browser bridge request --url /api/foo --method POST \
--body @payload.json --header "Accept: application/json"
# Stream a long-lived endpoint (SSE / chunked) instead of buffering.
omni-dev browser bridge request --url /api/events --stream
# Route to a specific tab when several are connected (by id or origin).
omni-dev browser bridge request --url /api/foo --target https://grafana.internal
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)
omni-dev daemon start
# Per-service status (add --json for machines)
omni-dev daemon status
# Restart or stop it
omni-dev daemon restart
omni-dev daemon stop
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
omni-dev snowflake query "select current_version()"
# Per-query context overrides and JSON output
omni-dev snowflake query "select * from t limit 10" \
--warehouse WH --role ANALYST --database DB --schema PUBLIC --format json
# Inspect or evict live sessions
omni-dev snowflake sessions
omni-dev snowflake disconnect --account <ACCOUNT> --user <USER>
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)
omni-dev log
# Filter by service and status class, or a query expression; follow live
omni-dev log --service jira --status 5xx
omni-dev log --query 'method:POST AND status:4xx' --follow
# Full records as JSON (byte-identical to the on-disk lines)
omni-dev log --format json -n 20
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)
omni-dev worktrees list
Runs on the daemon, so it is Unix-only.
🤖 Agent Sessions
Track the Claude Code, Codex and pi.dev sessions running across every terminal
and VS Code window, each with a coarse live state (working, idle, or waiting on
you). Opt-in hooks, the claude-wrap/codex-wrap wrappers, a pi.dev extension
and transcript watchers feed the daemon, which keeps the sessions in memory and
serves them to the CLI, the tray, worktrees ui and the VS Code worktrees view.
See docs/sessions-service.md.
# Install the Claude Code (and, when present, Codex and pi.dev) hooks
omni-dev sessions install-hooks
# One line per live session
omni-dev sessions list
Runs on the daemon, so it is Unix-only.
⚖️ Jev Judgments
omni-dev ai jev is a client for TypeSafe AI's Jev API, which returns typed
probabilistic judgments rather than generated text. Beyond the raw
choice/score/noul/ask primitives, route asks which model tier each
GitHub issue needs to design, implement and review, and verify-decision
checks each claim in a decision comment against the sources it cites. See
docs/jev.md.
# Which model tier should handle these issues?
omni-dev ai jev route '#1779' '#1820' -o text
✏️ Manual Amendment
# Apply specific amendments from YAML file
omni-dev git commit message amend amendments.yaml
🧩 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
omni-dev commands generate all
# Or individually
omni-dev commands generate commit-twiddle
omni-dev commands generate pr-create
omni-dev commands generate pr-update
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)
omni-dev ai claude history sync --target ./history
# Limit to one project (encoded slug or decoded cwd path)
omni-dev ai claude history sync --target ./history --project /Users/me/work/repo
# Only sessions touched in the last week
omni-dev ai claude history sync --target ./history --since 7d
# Preview without writing, then prune target files for sessions removed upstream
omni-dev ai claude history sync --target ./history --dry-run --prune
# Render LLM-friendly markdown alongside the raw jsonl (one .md per session)
omni-dev ai claude history sync --target ./history --output-format jsonl,markdown
# Markdown only — suitable for piping into a coaching LLM
omni-dev ai claude history sync --target ./history --output-format markdown
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 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 (8) | gmail_auth_status, gmail_account_list, gmail_search, gmail_message_read, gmail_thread_read, gmail_label_list, gmail_draft_list, gmail_draft_show |
| 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
cargo install omni-dev --features mcp
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):
{
"mcpServers": {
"omni-dev": {
"command": "omni-dev-mcp"
}
}
}
Claude Code
Per-project — create .mcp.json at the repo root:
{
"mcpServers": {
"omni-dev": {
"command": "omni-dev-mcp"
}
}
}
Or register globally with the Claude Code CLI:
claude mcp add omni-dev omni-dev-mcp
Smoke-test with the MCP Inspector
npx @modelcontextprotocol/inspector omni-dev-mcp
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.
Configuration (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.
{
"mcp": {
"default_model": "claude-sonnet-4-6",
"log_level": "info",
"max_response_bytes": 102400
}
}
| 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.
⚙️ Configuration Commands
# Show supported AI models and their specifications
omni-dev config models show
# View model information with token limits and capabilities
omni-dev config models show | grep -A5 "claude-opus-4.1"
🧠 Contextual Intelligence
omni-dev understands your project context to provide better suggestions:
Project Configuration
Create .omni-dev/ directory in your repo root:
mkdir .omni-dev
Scope Definitions (.omni-dev/scopes.yaml)
scopes:
- name: "auth"
description: "Authentication and authorization systems"
examples: ["auth: add OAuth2 support", "auth: fix token validation"]
file_patterns: ["src/auth/**", "auth.rs"]
- name: "api"
description: "REST API endpoints and handlers"
examples: ["api: add user endpoints", "api: improve error responses"]
file_patterns: ["src/api/**", "handlers/**"]
Commit Guidelines (.omni-dev/commit-guidelines.md)
# Project Commit Guidelines
## Format
- Use conventional commits: `type(scope): description`
- Keep subject line under 50 characters
- Use imperative mood: "Add feature" not "Added feature"
## Our Scopes
- `auth` - Authentication systems
- `api` - REST API changes
- `ui` - Frontend/UI components
🎯 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)
omni-dev git commit message twiddle 'HEAD~50..HEAD' --use-context
# Custom concurrency for very large ranges
omni-dev git commit message twiddle 'main..HEAD' --concurrency 2
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; amend to a deterministic type/scope suggestion, leaving conforming commits untouched | --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
git checkout -b feature/user-dashboard
# 2. Make commits (don't worry about perfect messages)
git commit -m "wip"
git commit -m "fix stuff"
git commit -m "add more features"
# 3. Before merging, improve all commit messages
omni-dev git commit message twiddle 'main..HEAD' --use-context
# 4. Create professional PR with AI-generated description
omni-dev git branch create pr
# ✅ 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:
git clone https://github.com/rust-works/omni-dev.git cd omni-devInstall Rust (if you haven't already):
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | shBuild the project:
cargo buildRun the build script (includes tests, linting, and formatting):
./scripts/build.shOr run individual steps:
cargo test # Run tests cargo clippy # Run linting cargo fmt # Format code
📚 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.88+ (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
--modelon an AI command, 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 --ai-backend flag — accepted after
the AI commands (git commit message twiddle, git commit message check,
git commit message staged, git branch create pr, ai chat), or set via
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 omni-dev git commit message twiddle ...
# Debug specific modules (e.g., context discovery)
RUST_LOG=omni_dev::claude::context::discovery=debug omni-dev git commit message twiddle ...
# Show only errors and warnings
RUST_LOG=warn omni-dev git commit message twiddle ...
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
| 1 | # omni-dev |
| 2 | |
| 3 | [![MCP Toplist]](https://mcptoplist.com/server/glama%2Frust-works%2Fomni-dev) |
| 4 | |
| 5 | [![Crates.io]](https://crates.io/crates/omni-dev) |
| 6 | [![Documentation]](https://docs.rs/omni-dev) |
| 7 | [![Build Status]](https://github.com/rust-works/omni-dev/actions) |
| 8 | [![License: BSD-3-Clause]](LICENSE) |
| 9 | |
| 10 | An intelligent Git commit message toolkit with AI-powered contextual |
| 11 | intelligence. Transform messy commit histories into professional, |
| 12 | conventional commit formats with project-aware suggestions. |
| 13 | |
| 14 | ## 🎬 See It In Action |
| 15 | |
| 16 | [![asciicast]](https://asciinema.org/a/eJJf5Aj8N26JoCaUsAFVH8dqz) |
| 17 | |
| 18 | *Watch omni-dev transform messy commits into professional ones with AI-powered analysis* |
| 19 | |
| 20 | ## 30-Second Demo |
| 21 | |
| 22 | Transform your commit messages and create professional PRs with AI intelligence: |
| 23 | |
| 24 | |
| 25 | # Analyze and improve commit messages in your current branch |
| 26 | omni-dev git commit message twiddle 'origin/main..HEAD' --use-context |
| 27 | |
| 28 | # Before: "fix stuff", "wip", "update files" |
| 29 | # After: "feat(auth): implement OAuth2 authentication system" |
| 30 | # "docs(api): add comprehensive endpoint documentation" |
| 31 | # "fix(ui): resolve mobile responsive layout issues" |
| 32 | |
| 33 | # Create a professional PR with AI-generated description |
| 34 | omni-dev git branch create pr |
| 35 | # 🎉 Generates comprehensive PR with detailed description, testing info, and more |
| 36 | |
| 37 | |
| 38 | ## ✨ Key Features |
| 39 | |
| 40 | 🤖 **AI-Powered Intelligence**: Claude AI analyzes your code changes to |
| 41 | suggest meaningful commit messages and PR descriptions |
| 42 | 🧠 **Contextual Awareness**: Understands your project structure, |
| 43 | conventions, and work patterns |
| 44 | 🔍 **Comprehensive Analysis**: Deep analysis of commits, branches, and |
| 45 | file changes |
| 46 | ✏️ **Smart Amendments**: Safely improve single or multiple commit messages |
| 47 | 🚀 **PR Creation**: Generate professional pull requests with AI-powered |
| 48 | descriptions |
| 49 | 📦 **Automatic Batching**: Handles large commit ranges intelligently |
| 50 | 🎯 **Conventional Commits**: Automatic detection and formatting |
| 51 | 🌐 **Browser Bridge**: Drive HTTP requests through an authenticated browser |
| 52 | tab without exfiltrating cookies or tokens |
| 53 | 🗂️ **Worktrees View**: One live view of every repo and git worktree open |
| 54 | across all your VS Code windows |
| 55 | 🛡️ **Safety First**: Working directory validation, protection against |
| 56 | amending commits already in remote main branches, and error recovery |
| 57 | ⚡ **Fast & Reliable**: Built with Rust for memory safety and performance |
| 58 | |
| 59 | ## 🚀 Quick Start |
| 60 | |
| 61 | ### Installation |
| 62 | |
| 63 | |
| 64 | # Install from crates.io |
| 65 | cargo install omni-dev |
| 66 | |
| 67 | # Install with Nix |
| 68 | nix profile install github:rust-works/omni-dev |
| 69 | |
| 70 | # Install with Nix flakes (development) |
| 71 | nix run github:rust-works/omni-dev |
| 72 | |
| 73 | |
| 74 | Pre-built binaries are attached to each |
| 75 | [release]. The Linux ones |
| 76 | (`omni-dev-linux.tar.gz`, `omni-dev-linux-arm64.tar.gz`) are dynamically linked |
| 77 | and need **glibc 2.35 or newer** (Ubuntu 22.04 and Debian 12 qualify). On an older |
| 78 | host, such as RHEL 9 or Amazon Linux 2023 (glibc 2.34), they fail in the loader |
| 79 | with ``version `GLIBC_2.xx' not found``; build from source with |
| 80 | `cargo install omni-dev` instead. The release workflow fails if a binary needs |
| 81 | more than that floor ([docs/RELEASE.md]). |
| 82 | |
| 83 | **Next step:** see [Getting Started] — a |
| 84 | 10-minute walkthrough from authentication to your first AI-improved |
| 85 | commit. (For just the API-key reference, see |
| 86 | [Authentication].) |
| 87 | |
| 88 | #### Shell Completion |
| 89 | |
| 90 | `omni-dev completions <shell>` prints a completion script to stdout for |
| 91 | `bash`, `zsh`, `fish`, `powershell`, or `elvish`. The quickest path is bash |
| 92 | per-user: |
| 93 | |
| 94 | |
| 95 | # Add to ~/.bashrc: |
| 96 | eval "$(omni-dev completions bash)" |
| 97 | |
| 98 | |
| 99 | See [docs/shell-completion.md] for per-shell install |
| 100 | recipes, the `$fpath`/`compinit` setup zsh requires, and troubleshooting. |
| 101 | |
| 102 | ## 🆚 How omni-dev Compares |
| 103 | |
| 104 | omni-dev sits in two adjacent spaces — AI commit-message tooling and |
| 105 | Atlassian/dev-workflow MCP servers. The tables below contrast the |
| 106 | incumbents on the dimensions a first-time reader is most likely to weigh. |
| 107 | In every cell, `✅` means full / native support, `⚠` means partial or |
| 108 | available only with caveats, and `❌` means not supported — and omni-dev's |
| 109 | own limitations are flagged just as honestly (the `⚠` marks in its own |
| 110 | columns). |
| 111 | |
| 112 | Beyond these two niches, omni-dev also ships a supervised **daemon** that |
| 113 | hosts a **browser bridge** (an authenticated proxy that runs requests |
| 114 | through a logged-in browser tab for SSO-gated dashboards such as Grafana |
| 115 | and Loki), a **Snowflake** SQL service (one external-browser SSO session |
| 116 | reused for concurrent queries), and a **worktrees** registry (one live view of |
| 117 | the repos open across every VS Code window), plus a local append-only |
| 118 | **request log** (`omni-dev log`). These have no direct incumbent in either |
| 119 | table below, so |
| 120 | they are called out here rather than scored against tools that don't aim |
| 121 | for them. |
| 122 | |
| 123 | ### vs AI commit tools |
| 124 | |
| 125 | | | omni-dev | [opencommit] | [aicommits] | |
| 126 | |-------------------------------------------------------|-------------------------------------|---------------------------------------------------------|---------------------------------------------------| |
| 127 | | Rewrite existing commits in a range | ✅ `twiddle` | ❌ pre-commit only | ❌ pre-commit only | |
| 128 | | Parallel batched processing (long ranges) | ✅ `--concurrency N` | ❌ | ❌ | |
| 129 | | AI-written PR descriptions | ✅ `git branch create pr` | ⚠ GitHub Action only | ❌ | |
| 130 | | Project-context awareness | ✅ `--use-context` | ❌ | ❌ | |
| 131 | | Sandboxed `claude-cli` backend | ✅ [ADR-0028] | ❌ | ❌ | |
| 132 | | Multi-backend (Anthropic / Bedrock / OpenAI / Ollama) | ✅ | ✅ | ✅ | |
| 133 | | Conventional Commits | ✅ | ✅ | ⚠ config | |
| 134 | | Language / runtime | Rust (static binary) | Node.js | Node.js | |
| 135 | |
| 136 | ### vs Atlassian-workflow MCP servers |
| 137 | |
| 138 | omni-dev's MCP server also exposes Git tools (commit analysis, twiddling, |
| 139 | PR creation), Datadog tools, and an `ai_chat` proxy — surfaces the |
| 140 | Atlassian-focused servers don't aim for. The table below compares only |
| 141 | Atlassian capability depth. |
| 142 | |
| 143 | | | omni-dev MCP | [sooperset/mcp-atlassian] | [Atlassian official (Rovo)] | |
| 144 | |-----------------------------------------|---------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------| |
| 145 | | 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) | |
| 146 | | 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**) | |
| 147 | | Lossless JFM ↔ ADF round-trip | ✅ full ADF node set (schema v56.1.18) + unsupported-node escape | ❌ | ⚠ raw ADF, model-dependent | |
| 148 | | Anchored review-comment preservation | ✅ annotation marks survive round-trip | ❌ anchor stripped, comments orphaned | ⚠ ADF carries anchors; model-dependent | |
| 149 | | Pre-flight ADF schema validation | ✅ nesting + arity, before write | ❌ | ❌ | |
| 150 | | Offline JFM ↔ ADF conversion (no creds) | ✅ `atlassian_convert` | ❌ | ❌ | |
| 151 | | Cloud + Server + Data Center | ⚠ Cloud verified | ✅ Cloud + Server (v6+) + DC (Jira v8.14+) | ❌ Cloud only | |
| 152 | | Auth | ⚠ API token only | ✅ API token / PAT / OAuth 2.0 | ✅ OAuth 2.1 / API token | |
| 153 | |
| 154 | _Last verified: 2026-06-23. omni-dev and sooperset rows are live-tested — a |
| 155 | `tools/list` enumeration (omni-dev branch build vs |
| 156 | `ghcr.io/sooperset/mcp-atlassian:latest`) plus a live read→write→read fidelity |
| 157 | cycle on a complex page. Atlassian Rovo's server accepts the API token but |
| 158 | gates tool **execution** behind an org-admin grant, so its rows combine |
| 159 | Atlassian's |
| 160 | [Supported tools] |
| 161 | docs with the ADF-passthrough reasoning (raw ADF can round-trip, but only if |
| 162 | the model echoes it faithfully — no deterministic guarantee), not a live run. |
| 163 | Refresh quarterly or whenever a release-note search for the comparators flags |
| 164 | a relevant change._ |
| 165 | |
| 166 | ## 📋 Core Commands |
| 167 | |
| 168 | ### 🤖 AI-Powered Commit Improvement (`twiddle`) |
| 169 | |
| 170 | The star feature - intelligently improve your commit messages with real-time model information display: |
| 171 | |
| 172 | |
| 173 | # Improve commits with contextual intelligence |
| 174 | omni-dev git commit message twiddle 'origin/main..HEAD' --use-context |
| 175 | |
| 176 | # Process large commit ranges with parallel processing |
| 177 | omni-dev git commit message twiddle 'HEAD~20..HEAD' --concurrency 5 |
| 178 | |
| 179 | # Save suggestions to file for review |
| 180 | omni-dev git commit message twiddle 'HEAD~5..HEAD' \ |
| 181 | --save-only suggestions.yaml |
| 182 | |
| 183 | # Auto-apply improvements without confirmation |
| 184 | omni-dev git commit message twiddle 'HEAD~3..HEAD' --auto-apply |
| 185 | |
| 186 | |
| 187 | ### 🔍 Analysis Commands |
| 188 | |
| 189 | |
| 190 | # Analyze commits in detail (YAML output) |
| 191 | omni-dev git commit message view 'HEAD~3..HEAD' |
| 192 | |
| 193 | # Analyze current branch vs main |
| 194 | omni-dev git branch info main |
| 195 | |
| 196 | # Get comprehensive help |
| 197 | omni-dev help-all |
| 198 | |
| 199 | |
| 200 | ### 🚀 AI-Powered PR Creation |
| 201 | |
| 202 | Create professional pull requests with AI-generated descriptions: |
| 203 | |
| 204 | |
| 205 | # Generate and create PR with AI-powered description |
| 206 | omni-dev git branch create pr |
| 207 | |
| 208 | # Create PR with specific base branch |
| 209 | omni-dev git branch create pr main |
| 210 | |
| 211 | # Save PR details to file without creating |
| 212 | omni-dev git branch create pr --save-only pr-description.yaml |
| 213 | |
| 214 | # Auto-create without confirmation |
| 215 | omni-dev git branch create pr --auto-apply |
| 216 | |
| 217 | |
| 218 | ### 📝 Atlassian Integration |
| 219 | |
| 220 | Read, write, and manage JIRA issues and Confluence pages from the command line: |
| 221 | |
| 222 | |
| 223 | # Authenticate with Atlassian Cloud |
| 224 | omni-dev atlassian auth login |
| 225 | |
| 226 | # Check authentication status |
| 227 | omni-dev atlassian auth status |
| 228 | |
| 229 | # Fetch a JIRA issue as markdown |
| 230 | omni-dev atlassian jira read PROJ-123 |
| 231 | |
| 232 | # Fetch as raw ADF JSON |
| 233 | omni-dev atlassian jira read PROJ-123 --format adf |
| 234 | |
| 235 | # Push markdown changes back to JIRA |
| 236 | omni-dev atlassian jira write PROJ-123 issue.md |
| 237 | |
| 238 | # Interactive edit: fetch, edit in $EDITOR, push |
| 239 | omni-dev atlassian jira edit PROJ-123 |
| 240 | |
| 241 | # Search issues with JQL |
| 242 | omni-dev atlassian jira search --project PROJ --status Open |
| 243 | |
| 244 | # Create an issue |
| 245 | omni-dev atlassian jira create issue.md --project PROJ --summary "Fix bug" |
| 246 | |
| 247 | # Transition an issue |
| 248 | omni-dev atlassian jira transition PROJ-123 "In Progress" |
| 249 | |
| 250 | # Confluence: read, search, create pages |
| 251 | omni-dev atlassian confluence read 12345 |
| 252 | omni-dev atlassian confluence search --space ENG --title auth |
| 253 | omni-dev atlassian confluence create page.md --space ENG --title "New Page" |
| 254 | |
| 255 | # Convert markdown to ADF JSON (offline) |
| 256 | omni-dev atlassian convert to-adf input.md |
| 257 | |
| 258 | |
| 259 | Self-hosted PATs use `atlassian auth login --auth-mode bearer` without email. |
| 260 | See [PAT authentication and compatibility limits]; |
| 261 | most service operations still target Cloud APIs. |
| 262 | |
| 263 | ### 📊 Datadog Integration (read-only) |
| 264 | |
| 265 | Authenticate against the Datadog API and query metrics, monitors, dashboards, |
| 266 | logs, events, SLOs, hosts, and downtimes. See the [Datadog integration |
| 267 | guide](docs/datadog.md) for the full subcommand reference, authentication |
| 268 | setup, rate-limit behaviour, and troubleshooting. |
| 269 | |
| 270 | |
| 271 | # Configure Datadog API credentials (prompts for API key, APP key, and site) |
| 272 | omni-dev datadog auth login |
| 273 | |
| 274 | # Verify the credentials by calling /api/v1/validate |
| 275 | omni-dev datadog auth status |
| 276 | |
| 277 | # Query metrics, monitors, dashboards, logs, and SLOs |
| 278 | omni-dev datadog metrics query --query 'avg:system.cpu.user{*}' --from 15m |
| 279 | omni-dev datadog monitor list --tags env:prod |
| 280 | omni-dev datadog dashboard list |
| 281 | omni-dev datadog logs search --filter 'service:api status:error' --from 1h |
| 282 | omni-dev datadog slo list --tags team:platform |
| 283 | |
| 284 | |
| 285 | `DATADOG_SITE` defaults to `datadoghq.com`. Other regions (`datadoghq.eu`, |
| 286 | `us3.datadoghq.com`, `us5.datadoghq.com`, `ap1.datadoghq.com`, `ddog-gov.com`) |
| 287 | are recognised without warning. Environment variables `DATADOG_API_KEY`, |
| 288 | `DATADOG_APP_KEY`, `DATADOG_SITE` override the stored settings. For on-prem |
| 289 | or proxied installs, set `DATADOG_API_URL` to override the site-derived URL. |
| 290 | |
| 291 | All Datadog subcommands are also exposed as MCP tools (`datadog_*`) — see |
| 292 | [docs/mcp.md]. For the full guide covering |
| 293 | every family with worked examples, see [docs/datadog.md]. |
| 294 | |
| 295 | ### 📧 Gmail Integration |
| 296 | |
| 297 | Authenticate against your own Gmail account via OAuth2 (loopback |
| 298 | authorization-code + PKCE), search/read/label messages and threads, and |
| 299 | maintain a durable local archive with `gmail sync`. New to this |
| 300 | integration? Start with the |
| 301 | [Gmail Quickstart] for a zero-to-synced-archive |
| 302 | walkthrough; see the [Gmail integration guide] for |
| 303 | prerequisites (you bring your own Google Cloud OAuth2 client — Gmail read |
| 304 | scopes require Google's CASA security assessment to distribute otherwise), |
| 305 | authentication setup, rate-limit behaviour, and troubleshooting. |
| 306 | |
| 307 | |
| 308 | # One-time: create your own Google Cloud OAuth2 client (see docs/gmail.md), |
| 309 | # then authenticate (opens a browser) |
| 310 | export GMAIL_CLIENT_ID=... |
| 311 | export GMAIL_CLIENT_SECRET=... |
| 312 | omni-dev gmail auth login |
| 313 | |
| 314 | # Verify the credentials by calling users.getProfile |
| 315 | omni-dev gmail auth status |
| 316 | |
| 317 | # Search, read messages/threads, and manage labels |
| 318 | omni-dev gmail search --query 'label:finance after:2026/01/01' --limit 50 |
| 319 | omni-dev gmail read <message-id> |
| 320 | omni-dev gmail thread <thread-id> |
| 321 | omni-dev gmail label list |
| 322 | |
| 323 | # Maintain a durable local archive (.eml files + a JSONL manifest) |
| 324 | omni-dev gmail sync --output-dir ~/mail-archive --query 'label:finance' |
| 325 | |
| 326 | |
| 327 | An OAuth2 client left in Google's "Testing" publishing status issues |
| 328 | refresh tokens that expire after 7 days — see |
| 329 | [docs/gmail.md] for how to avoid re-running |
| 330 | `auth login` weekly. |
| 331 | |
| 332 | Every read-only Gmail subcommand except `sync` is also exposed as an MCP |
| 333 | tool (`gmail_*`) — see [docs/mcp.md]; `sync` is |
| 334 | CLI-only (a long-running bulk filesystem operation, a poor fit for a |
| 335 | synchronous MCP call). For the full guide, see |
| 336 | [docs/gmail.md]. |
| 337 | |
| 338 | ### 📁 Drive Integration |
| 339 | |
| 340 | Authenticate against your own Google Drive account via OAuth2 (loopback |
| 341 | authorization-code + PKCE, the same flow as Gmail), then search files, read |
| 342 | their metadata or content, find duplicates, rename/move files, and create, |
| 343 | upload, or replace file content. Every write is opt-in twice over. First by |
| 344 | OAuth scope: the default `drive.readonly` covers search/read/dedupe; |
| 345 | rename/move need `drive.metadata` (`drive auth login --write`), the narrowest |
| 346 | write scope Google offers; create/upload need `drive.file` |
| 347 | (`--write-file`); and editing a file omni-dev did not itself create needs the |
| 348 | unrestricted `drive` scope (`--write-full`). Second by a **local**, |
| 349 | folder-scoped gate: `create`/`upload`/`edit` resolve the target's ancestor |
| 350 | folder chain against per-account rules in `settings.json` — closest ancestor |
| 351 | wins, deny beats allow, and **a write with no matching rule is denied** — so |
| 352 | an OAuth grant alone never authorizes a mutation (see |
| 353 | [ADR-0071]). Inspect that gate with `drive permissions |
| 354 | show/lookup-folder/check` before granting anything. There is still no |
| 355 | trash/share/permission-mutation capability anywhere in this surface. `drive |
| 356 | move` is separately security-gated: it refuses any move that would change a |
| 357 | file's visibility by default (see [ADR-0070]). |
| 358 | New to this integration? Start with the |
| 359 | [Drive Quickstart] for a zero-to-first-search |
| 360 | walkthrough; see the [Drive integration guide] for |
| 361 | prerequisites (you bring your own Google Cloud OAuth2 client, independent |
| 362 | of Gmail's), authentication setup, rate-limit behaviour, and |
| 363 | troubleshooting. |
| 364 | |
| 365 | |
| 366 | # One-time: create your own Google Cloud OAuth2 client (see docs/drive.md), |
| 367 | # then authenticate (opens a browser) |
| 368 | export DRIVE_CLIENT_ID=... |
| 369 | export DRIVE_CLIENT_SECRET=... |
| 370 | omni-dev drive auth login |
| 371 | |
| 372 | # Verify the credentials by calling about.get |
| 373 | omni-dev drive auth status |
| 374 | |
| 375 | # Search and read file metadata/content |
| 376 | omni-dev drive search "name contains 'report'" |
| 377 | omni-dev drive read <file-id> |
| 378 | omni-dev drive read <file-id> --content --out-file report.pdf |
| 379 | |
| 380 | # Rename/move need the opt-in drive.metadata scope |
| 381 | omni-dev drive auth login --write |
| 382 | omni-dev drive rename <file-id> "New Name.pdf" |
| 383 | omni-dev drive move <file-id> --to <folder-id> |
| 384 | |
| 385 | # Creating/uploading/editing content needs a content scope *and* a |
| 386 | # folder rule in settings.json permitting the destination |
| 387 | omni-dev drive auth login --write-file # or --write-full to edit |
| 388 | omni-dev drive permissions show # what is configured |
| 389 | omni-dev drive permissions check <folder-id> --operation create # what it decides |
| 390 | omni-dev drive create --name notes.txt --parent <folder-id> |
| 391 | omni-dev drive upload ./report.pdf --parent <folder-id> |
| 392 | omni-dev drive edit <file-id> --content ./report.pdf # or --content - for stdin |
| 393 | |
| 394 | |
| 395 | An OAuth2 client left in Google's "Testing" publishing status issues |
| 396 | refresh tokens that expire after 7 days — see |
| 397 | [docs/drive.md] for how to avoid re-running |
| 398 | `auth login` weekly. |
| 399 | |
| 400 | Five read-only MCP tools (`drive_*`) mirror the CLI's `auth status`, |
| 401 | `search`, `dedupe`, `read`, and `account list` — see |
| 402 | [docs/mcp.md]. The mutating verbs — |
| 403 | `rename`/`move`/`create`/`upload`/`edit` — have no MCP equivalent. For the |
| 404 | full guide, see [docs/drive.md]. |
| 405 | |
| 406 | ### 🎙️ Transcript Fetching |
| 407 | |
| 408 | Pull captions and transcripts from external media platforms. YouTube is the |
| 409 | first supported source; the CLI namespace and library are designed so |
| 410 | additional sources (Vimeo, podcast RSS, generic VTT/SRT URLs) can be |
| 411 | added without restructuring. See [docs/transcript.md] |
| 412 | for the full reference and the recipe for adding a new source. |
| 413 | |
| 414 | |
| 415 | # Fetch captions for a YouTube video as SubRip (default). |
| 416 | omni-dev transcript youtube fetch https://www.youtube.com/watch?v=jNQXAC9IVRw |
| 417 | |
| 418 | # WebVTT to a file, falling through to auto-generated captions if needed. |
| 419 | omni-dev transcript youtube fetch jNQXAC9IVRw \ |
| 420 | --format vtt --auto --output me-at-the-zoo.vtt |
| 421 | |
| 422 | # Synthesise a translated track when no native French track exists. |
| 423 | omni-dev transcript youtube fetch <url> --lang fr --translate fr |
| 424 | |
| 425 | # List available caption tracks (manual + auto-generated). |
| 426 | omni-dev transcript youtube list-langs <url> |
| 427 | |
| 428 | # Show video metadata (title, channel, duration, languages). |
| 429 | omni-dev transcript youtube info <url> --output json |
| 430 | |
| 431 | |
| 432 | `--format` accepts `srt`, `vtt`, `txt`, or `json`. Locators may be a |
| 433 | `watch?v=` URL, a `youtu.be/` short URL, a `/shorts/` or `/embed/` URL, |
| 434 | or a bare 11-character video ID. Age-gated and login-required videos |
| 435 | surface as a typed `PlayabilityRefused` error carrying YouTube's status |
| 436 | code rather than a generic HTTP failure. |
| 437 | |
| 438 | ### 🌐 Browser Bridge |
| 439 | |
| 440 | Drive HTTP requests **through an authenticated browser tab**. When you are |
| 441 | investigating internal services (Grafana/Loki, internal dashboards, SSO-gated |
| 442 | admin panels), the browser already holds sessions — SSO, OAuth, cookies — that |
| 443 | are hard to replicate programmatically. The bridge issues requests inside the |
| 444 | browser's authenticated context **without exfiltrating cookies or tokens** (a |
| 445 | *confused deputy by design*). Both planes are authenticated and default-closed; |
| 446 | see [docs/browser-bridge.md] for the full guide and |
| 447 | [ADR-0036] for the security rationale. |
| 448 | |
| 449 | |
| 450 | # Start the bridge; it prints the bound ports, a session token, and a JS |
| 451 | # snippet to paste into the DevTools console of the authenticated tab. |
| 452 | omni-dev browser bridge serve |
| 453 | |
| 454 | # Drive requests through the tab (token from the bridge's stdout). |
| 455 | export OMNI_BRIDGE_TOKEN=<token printed by the bridge> |
| 456 | omni-dev browser bridge request --url /loki/api/v1/labels |
| 457 | |
| 458 | # POST a JSON payload from a file, with a custom header. |
| 459 | omni-dev browser bridge request --url /api/foo --method POST \ |
| 460 | --body @payload.json --header "Accept: application/json" |
| 461 | |
| 462 | # Stream a long-lived endpoint (SSE / chunked) instead of buffering. |
| 463 | omni-dev browser bridge request --url /api/events --stream |
| 464 | |
| 465 | # Route to a specific tab when several are connected (by id or origin). |
| 466 | omni-dev browser bridge request --url /api/foo --target https://grafana.internal |
| 467 | |
| 468 | |
| 469 | Supports binary and streaming response bodies, multi-tab routing via |
| 470 | `X-Omni-Bridge-Target`, per-request `--credentials` and `--allow-origin` |
| 471 | overrides, and a transparent proxy for tools that speak plain HTTP. |
| 472 | |
| 473 | ### 🛰️ Daemon |
| 474 | |
| 475 | Host long-lived services in one supervised process behind a private per-user |
| 476 | Unix-domain control socket. The browser bridge is the first service migrated |
| 477 | onto it (Snowflake and the worktrees registry followed), and on macOS an |
| 478 | optional menu-bar app gives live control. `daemon start` installs a launchd LaunchAgent for auto-start at |
| 479 | login, and `status` reports every hosted service. See |
| 480 | [Running under the daemon] and |
| 481 | [ADR-0039] for the architecture. |
| 482 | |
| 483 | |
| 484 | # Start the background daemon (installs a launchd LaunchAgent on macOS) |
| 485 | omni-dev daemon start |
| 486 | |
| 487 | # Per-service status (add --json for machines) |
| 488 | omni-dev daemon status |
| 489 | |
| 490 | # Restart or stop it |
| 491 | omni-dev daemon restart |
| 492 | omni-dev daemon stop |
| 493 | |
| 494 | |
| 495 | The daemon is Unix-only — its control plane is a Unix-domain socket — while the |
| 496 | rest of omni-dev runs everywhere. |
| 497 | |
| 498 | ### ❄️ Snowflake |
| 499 | |
| 500 | Authenticate a Snowflake session once via external-browser SSO, then run |
| 501 | concurrent arbitrary SQL across any account **without an SSO popup on every |
| 502 | query**. The daemon holds the session in memory and multiplexes a bounded pool, |
| 503 | so each query can still set its own warehouse/role/database/schema. See |
| 504 | [docs/snowflake-service.md]. |
| 505 | |
| 506 | |
| 507 | # Run SQL (from an argument or stdin); the first query opens the SSO browser |
| 508 | omni-dev snowflake query "select current_version()" |
| 509 | |
| 510 | # Per-query context overrides and JSON output |
| 511 | omni-dev snowflake query "select * from t limit 10" \ |
| 512 | --warehouse WH --role ANALYST --database DB --schema PUBLIC --format json |
| 513 | |
| 514 | # Inspect or evict live sessions |
| 515 | omni-dev snowflake sessions |
| 516 | omni-dev snowflake disconnect --account <ACCOUNT> --user <USER> |
| 517 | |
| 518 | |
| 519 | Account/user/context default from `SNOWFLAKE_*` env vars then |
| 520 | `~/.omni-dev/settings.json` — no accounts are hardcoded. Runs on the daemon, so |
| 521 | it is Unix-only. |
| 522 | |
| 523 | ### 📓 Request Log |
| 524 | |
| 525 | Every invocation and the HTTP requests it issues are recorded to a local, |
| 526 | append-only log you can search and tail. Best-effort and default-on; **no |
| 527 | secret is ever written** (auth headers are redacted, bodies opt-in). See |
| 528 | [docs/log.md]. |
| 529 | |
| 530 | |
| 531 | # Recent activity (one line each) |
| 532 | omni-dev log |
| 533 | |
| 534 | # Filter by service and status class, or a query expression; follow live |
| 535 | omni-dev log --service jira --status 5xx |
| 536 | omni-dev log --query 'method:POST AND status:4xx' --follow |
| 537 | |
| 538 | # Full records as JSON (byte-identical to the on-disk lines) |
| 539 | omni-dev log --format json -n 20 |
| 540 | |
| 541 | |
| 542 | Set `OMNI_DEV_LOG_DISABLE=1` to turn it off, or `OMNI_DEV_LOG_BODIES=1` / |
| 543 | `OMNI_DEV_LOG_HEADERS=1` to opt into capturing bodies/headers. |
| 544 | |
| 545 | ### 🗂️ Worktrees |
| 546 | |
| 547 | See every repo and git worktree open across **all** your VS Code windows in |
| 548 | one live view. A VS Code extension host is sandboxed per window — no extension |
| 549 | alone can see a sibling window's folders — so a small first-party companion |
| 550 | extension registers each window with the daemon, which aggregates them into a |
| 551 | single registry served back to the CLI, tray, and extension UI. The registry |
| 552 | is in-memory only; windows that crash without unregistering age out |
| 553 | automatically. See [docs/worktrees-service.md] and |
| 554 | [ADR-0040]. |
| 555 | |
| 556 | |
| 557 | # One line per open window and its folders (add --json for machines) |
| 558 | omni-dev worktrees list |
| 559 | |
| 560 | |
| 561 | Runs on the daemon, so it is Unix-only. |
| 562 | |
| 563 | ### 🤖 Agent Sessions |
| 564 | |
| 565 | Track the Claude Code, Codex and pi.dev sessions running across every terminal |
| 566 | and VS Code window, each with a coarse live state (working, idle, or waiting on |
| 567 | you). Opt-in hooks, the `claude-wrap`/`codex-wrap` wrappers, a pi.dev extension |
| 568 | and transcript watchers feed the daemon, which keeps the sessions in memory and |
| 569 | serves them to the CLI, the tray, `worktrees ui` and the VS Code worktrees view. |
| 570 | See [docs/sessions-service.md]. |
| 571 | |
| 572 | |
| 573 | # Install the Claude Code (and, when present, Codex and pi.dev) hooks |
| 574 | omni-dev sessions install-hooks |
| 575 | |
| 576 | # One line per live session |
| 577 | omni-dev sessions list |
| 578 | |
| 579 | |
| 580 | Runs on the daemon, so it is Unix-only. |
| 581 | |
| 582 | ### ⚖️ Jev Judgments |
| 583 | |
| 584 | `omni-dev ai jev` is a client for TypeSafe AI's Jev API, which returns typed |
| 585 | probabilistic judgments rather than generated text. Beyond the raw |
| 586 | `choice`/`score`/`noul`/`ask` primitives, `route` asks which model tier each |
| 587 | GitHub issue needs to design, implement and review, and `verify-decision` |
| 588 | checks each claim in a decision comment against the sources it cites. See |
| 589 | [docs/jev.md]. |
| 590 | |
| 591 | |
| 592 | # Which model tier should handle these issues? |
| 593 | omni-dev ai jev route '#1779' '#1820' -o text |
| 594 | |
| 595 | |
| 596 | ### ✏️ Manual Amendment |
| 597 | |
| 598 | |
| 599 | # Apply specific amendments from YAML file |
| 600 | omni-dev git commit message amend amendments.yaml |
| 601 | |
| 602 | |
| 603 | ### 🧩 Claude Code Slash-Commands |
| 604 | |
| 605 | Generate ready-to-use Claude Code slash-command templates into the |
| 606 | project's `.claude/commands/` directory. Each template is a self-contained |
| 607 | workflow that drives a multi-step omni-dev operation from inside a Claude |
| 608 | Code session. |
| 609 | |
| 610 | |
| 611 | # Generate all templates: commit-twiddle, pr-create, pr-update |
| 612 | omni-dev commands generate all |
| 613 | |
| 614 | # Or individually |
| 615 | omni-dev commands generate commit-twiddle |
| 616 | omni-dev commands generate pr-create |
| 617 | omni-dev commands generate pr-update |
| 618 | |
| 619 | |
| 620 | Each subcommand writes `.claude/commands/<name>.md`. Commit the files to |
| 621 | share the workflows with collaborators — Claude Code picks them up |
| 622 | automatically, so anyone in the repo can invoke `/commit-twiddle`, |
| 623 | `/pr-create`, or `/pr-update` inside a Claude Code session. See the |
| 624 | [user guide] |
| 625 | for the full reference. |
| 626 | |
| 627 | ### 🗒️ Claude Conversation History |
| 628 | |
| 629 | Export your Claude Code chat history to a directory of `.jsonl` files for |
| 630 | behavioural analysis, work-log generation, or downstream tooling. Re-running |
| 631 | acts as an idempotent sync: new chats are added, modified chats are |
| 632 | overwritten, unchanged chats are skipped. |
| 633 | |
| 634 | |
| 635 | # Mirror ~/.claude/projects to ./history/ (one .jsonl per chat, grouped by project slug) |
| 636 | omni-dev ai claude history sync --target ./history |
| 637 | |
| 638 | # Limit to one project (encoded slug or decoded cwd path) |
| 639 | omni-dev ai claude history sync --target ./history --project /Users/me/work/repo |
| 640 | |
| 641 | # Only sessions touched in the last week |
| 642 | omni-dev ai claude history sync --target ./history --since 7d |
| 643 | |
| 644 | # Preview without writing, then prune target files for sessions removed upstream |
| 645 | omni-dev ai claude history sync --target ./history --dry-run --prune |
| 646 | |
| 647 | # Render LLM-friendly markdown alongside the raw jsonl (one .md per session) |
| 648 | omni-dev ai claude history sync --target ./history --output-format jsonl,markdown |
| 649 | |
| 650 | # Markdown only — suitable for piping into a coaching LLM |
| 651 | omni-dev ai claude history sync --target ./history --output-format markdown |
| 652 | |
| 653 | |
| 654 | The export is a **behavioural transcript**, not a faithful archive. The |
| 655 | top-level session jsonl captures all prompts, responses, thinking blocks, tool |
| 656 | calls, and tool-result metadata — the signal needed for analysis. Sub-agent |
| 657 | internal turns, large tool-output sidecars, PDF page rasters, and Claude's |
| 658 | auto-memory are deliberately excluded; they would bloat any LLM-ingested |
| 659 | corpus without adding interaction-pattern signal. |
| 660 | |
| 661 | In-progress chats produce a valid jsonl prefix (the source size is captured |
| 662 | once at the start of the copy), so you can sync safely while a chat is open. |
| 663 | The target layout mirrors the source — `<target>/<slug>/<uuid>.jsonl` — and |
| 664 | source `mtime` is preserved on each target file so downstream tooling can |
| 665 | sort sessions chronologically without parsing every file. |
| 666 | |
| 667 | `--output-format markdown` writes a derived `<target>/<slug>/<uuid>.md` |
| 668 | alongside (or instead of) the jsonl. Each markdown file has YAML frontmatter |
| 669 | with session metadata followed by `## User` / `## Assistant` turns; tool calls |
| 670 | render as `### Tool call: <name>` blocks, thinking blocks collapse into |
| 671 | `<details>`, and sub-agent (`Agent`) calls render the prompt argument only. |
| 672 | |
| 673 | Agent-to-user interactions are surfaced as first-class structured events so |
| 674 | the analyst LLM sees what was actually asked and how the user responded: |
| 675 | |
| 676 | `AskUserQuestion` calls render as `### Agent question: <header>` with the |
| 677 | question text and a bulleted list of options (with descriptions); the |
| 678 | paired user reply renders as `## User response`. |
| 679 | Tool denials show up as `**Tool result (<tool>, denied by user):**` — |
| 680 | detected by the canonical "The user doesn't want to proceed with this tool |
| 681 | use" sentinel Claude Code stuffs into the next `tool_result`. |
| 682 | Tool interrupts (escape mid-execution) render as |
| 683 | `**Tool result (<tool>, interrupted by user):**`. |
| 684 | Errors (real tool failures, distinct from user denials) keep the |
| 685 | `error` label; successes use `ok`. |
| 686 | |
| 687 | System reminders, attachments, and permission-mode events are included by |
| 688 | default — pass `--exclude-system` to drop them. Markdown idempotency keys off |
| 689 | source mtime alone (the rendered length differs from the source length), and |
| 690 | `--prune` only deletes artifacts whose extension matches one of the formats |
| 691 | listed in `--output-format`. |
| 692 | |
| 693 | See [docs/user-guide.md#ai-claude-history-sync--export-conversation-history] |
| 694 | for the in-depth reference, and the broader [Claude Code Integration] |
| 695 | section for related commands (`ai chat`, `ai claude skills`). |
| 696 | |
| 697 | ### 🔌 MCP Server |
| 698 | |
| 699 | omni-dev ships an optional **Model Context Protocol** server so AI assistants |
| 700 | (Claude Desktop, Claude Code, the MCP Inspector, custom agents) can call |
| 701 | omni-dev over stdio instead of shelling out to the CLI. The server is |
| 702 | delivered as a second binary, `omni-dev-mcp`, gated behind the `mcp` Cargo |
| 703 | feature (see [ADR-0021]). |
| 704 | |
| 705 | Tools cover seven domains: |
| 706 | |
| 707 | | Domain | Examples | |
| 708 | |--------|----------| |
| 709 | | **Git** (5) | `git_view_commits`, `git_branch_info`, `git_check_commits`, `git_twiddle_commits`, `git_create_pr` | |
| 710 | | **JIRA** (28) | core read/write/search/transition/comment/link/dev/delete; sprints, boards, watchers, worklogs, fields, attachments, projects, changelog | |
| 711 | | **Confluence** (13) | read/write/search/create/delete/download/children, comments, labels, user search | |
| 712 | | **Atlassian shared** (2) | `atlassian_auth_status`, `atlassian_convert` (offline JFM ↔ ADF) | |
| 713 | | **Datadog** (14) | metrics, monitors, dashboards, logs, events, SLOs, hosts, downtimes, metrics catalog | |
| 714 | | **Gmail** (8) | `gmail_auth_status`, `gmail_account_list`, `gmail_search`, `gmail_message_read`, `gmail_thread_read`, `gmail_label_list`, `gmail_draft_list`, `gmail_draft_show` | |
| 715 | | **AI / Config** (5) | `ai_chat` (one-shot chat), `claude_skills_*` (sync / clean / status for `.claude/skills/` distribution), `config_models_show` | |
| 716 | |
| 717 | Resources exposed via URI templates: |
| 718 | |
| 719 | | URI template | Returns | |
| 720 | |---------------------------------|----------------------------------| |
| 721 | | `git://repo/commits/{range}` | YAML commit analysis | |
| 722 | | `jira://issue/{key}` | JIRA issue as JFM | |
| 723 | | `jira://issue/{key}.adf` | JIRA issue body as ADF | |
| 724 | | `confluence://page/{id}` | Confluence page as JFM | |
| 725 | | `confluence://page/{id}.adf` | Confluence page body as ADF | |
| 726 | | `omni-dev://specs/{name}` | Embedded reference specs (e.g. `jfm`) | |
| 727 | |
| 728 | See [docs/mcp.md] for the full tool catalog, resource |
| 729 | reference, cross-cutting parameters (`output_file`, `confirm`), and |
| 730 | troubleshooting. |
| 731 | |
| 732 | #### Install |
| 733 | |
| 734 | |
| 735 | cargo install omni-dev --features mcp |
| 736 | |
| 737 | |
| 738 | This adds a second binary, `omni-dev-mcp`, alongside the regular `omni-dev` |
| 739 | CLI. The default `cargo install omni-dev` build is unchanged — no MCP |
| 740 | dependencies are pulled in unless the `mcp` feature is enabled. |
| 741 | |
| 742 | #### Claude Desktop |
| 743 | |
| 744 | Edit `~/Library/Application Support/Claude/claude_desktop_config.json` on |
| 745 | macOS (or `%APPDATA%\Claude\claude_desktop_config.json` on Windows): |
| 746 | |
| 747 | |
| 748 | { |
| 749 | "mcpServers": { |
| 750 | "omni-dev": { |
| 751 | "command": "omni-dev-mcp" |
| 752 | } |
| 753 | } |
| 754 | } |
| 755 | |
| 756 | |
| 757 | #### Claude Code |
| 758 | |
| 759 | Per-project — create `.mcp.json` at the repo root: |
| 760 | |
| 761 | |
| 762 | { |
| 763 | "mcpServers": { |
| 764 | "omni-dev": { |
| 765 | "command": "omni-dev-mcp" |
| 766 | } |
| 767 | } |
| 768 | } |
| 769 | |
| 770 | |
| 771 | Or register globally with the Claude Code CLI: |
| 772 | |
| 773 | |
| 774 | claude mcp add omni-dev omni-dev-mcp |
| 775 | |
| 776 | |
| 777 | #### Smoke-test with the MCP Inspector |
| 778 | |
| 779 | |
| 780 | npx @modelcontextprotocol/inspector omni-dev-mcp |
| 781 | |
| 782 | |
| 783 | The Inspector opens a browser UI where you can list tools and resources, |
| 784 | call any tool interactively, and fetch resources against the current working |
| 785 | directory. |
| 786 | |
| 787 | #### Configuration (`settings.json`) |
| 788 | |
| 789 | Three server defaults can be set once in the `mcp` section of |
| 790 | `~/.omni-dev/settings.json` instead of per-invocation env vars or flags. All |
| 791 | three fields are optional; an absent `mcp` block leaves the built-in |
| 792 | behaviour unchanged. |
| 793 | |
| 794 | |
| 795 | { |
| 796 | "mcp": { |
| 797 | "default_model": "claude-sonnet-4-6", |
| 798 | "log_level": "info", |
| 799 | "max_response_bytes": 102400 |
| 800 | } |
| 801 | } |
| 802 | |
| 803 | |
| 804 | | Field | Effect | Fallback | |
| 805 | |-------|--------|----------| |
| 806 | | `default_model` | Model for `ai_chat` when its `model` param is omitted | model registry default | |
| 807 | | `log_level` | Tracing filter directive for the server | `warn` (env `RUST_LOG` overrides) | |
| 808 | | `max_response_bytes` | Cap on a tool response before truncation (`0` disables) | 100 KB | |
| 809 | |
| 810 | For troubleshooting (stderr logs, `RUST_LOG=debug`, "failed to open git |
| 811 | repository"), see [docs/mcp.md#troubleshooting]. |
| 812 | |
| 813 | ### ⚙️ Configuration Commands |
| 814 | |
| 815 | |
| 816 | # Show supported AI models and their specifications |
| 817 | omni-dev config models show |
| 818 | |
| 819 | # View model information with token limits and capabilities |
| 820 | omni-dev config models show | grep -A5 "claude-opus-4.1" |
| 821 | |
| 822 | |
| 823 | ## 🧠 Contextual Intelligence |
| 824 | |
| 825 | omni-dev understands your project context to provide better suggestions: |
| 826 | |
| 827 | ### Project Configuration |
| 828 | |
| 829 | Create `.omni-dev/` directory in your repo root: |
| 830 | |
| 831 | |
| 832 | mkdir .omni-dev |
| 833 | |
| 834 | |
| 835 | #### Scope Definitions (`.omni-dev/scopes.yaml`) |
| 836 | |
| 837 | |
| 838 | scopes: |
| 839 | - name: "auth" |
| 840 | description: "Authentication and authorization systems" |
| 841 | examples: ["auth: add OAuth2 support", "auth: fix token validation"] |
| 842 | file_patterns: ["src/auth/**", "auth.rs"] |
| 843 | |
| 844 | - name: "api" |
| 845 | description: "REST API endpoints and handlers" |
| 846 | examples: ["api: add user endpoints", "api: improve error responses"] |
| 847 | file_patterns: ["src/api/**", "handlers/**"] |
| 848 | |
| 849 | |
| 850 | #### Commit Guidelines (`.omni-dev/commit-guidelines.md`) |
| 851 | |
| 852 | |
| 853 | # Project Commit Guidelines |
| 854 | |
| 855 | ## Format |
| 856 | - Use conventional commits: `type(scope): description` |
| 857 | - Keep subject line under 50 characters |
| 858 | - Use imperative mood: "Add feature" not "Added feature" |
| 859 | |
| 860 | ## Our Scopes |
| 861 | - `auth` - Authentication systems |
| 862 | - `api` - REST API changes |
| 863 | - `ui` - Frontend/UI components |
| 864 | |
| 865 | |
| 866 | ## 🎯 Advanced Features |
| 867 | |
| 868 | ### Intelligent Context Detection |
| 869 | |
| 870 | omni-dev automatically detects: |
| 871 | |
| 872 | **Project Conventions**: From `.omni-dev/`, `CONTRIBUTING.md` |
| 873 | **Work Patterns**: Feature development, bug fixes, documentation, |
| 874 | refactoring |
| 875 | **Branch Context**: Extracts work type from branch names |
| 876 | (`feature/auth-system`) |
| 877 | **File Architecture**: Understands UI, API, core logic, configuration |
| 878 | changes |
| 879 | **Change Significance**: Adjusts detail level based on impact |
| 880 | |
| 881 | ### Automatic Batching |
| 882 | |
| 883 | Large commit ranges are automatically split into manageable batches: |
| 884 | |
| 885 | |
| 886 | # Processes 50 commits in batches of 4 (default) |
| 887 | omni-dev git commit message twiddle 'HEAD~50..HEAD' --use-context |
| 888 | |
| 889 | # Custom concurrency for very large ranges |
| 890 | omni-dev git commit message twiddle 'main..HEAD' --concurrency 2 |
| 891 | |
| 892 | |
| 893 | ### Command Options |
| 894 | |
| 895 | | Option | Description | Example | |
| 896 | |--------|-------------|---------| |
| 897 | | `--fresh` | Generate fresh messages from the diffs alone (the default; conflicts with `--refine`) | `--fresh` | |
| 898 | | `--refine` | Refine the existing messages instead of starting fresh (conflicts with `--fresh`) | `--refine` | |
| 899 | | `--use-context` | Enable contextual intelligence | `--use-context` | |
| 900 | | `--work-context TEXT` | Describe the work being done to steer suggestions | `--work-context "feature: user auth"` | |
| 901 | | `--branch-context TEXT` | Override the context detected from the branch name | `--branch-context "bugfix: login flow"` | |
| 902 | | `--context-dir PATH` | Custom context directory | `--context-dir ./config` | |
| 903 | | `--model MODEL` | Claude API model to use (defaults from settings) | `--model claude-sonnet-4-5` | |
| 904 | | `--beta-header KEY:VALUE` | Beta header for API requests (model-gated) | `--beta-header key:value` | |
| 905 | | `--concurrency N` | Number of parallel commit processors (default: 4) | `--concurrency 3` | |
| 906 | | `--no-coherence` | Skip cross-commit coherence refinement pass | `--no-coherence` | |
| 907 | | `--no-ai` | Skip AI; amend to a deterministic type/scope suggestion, leaving conforming commits untouched | `--no-ai` | |
| 908 | | `--auto-apply` | Apply without confirmation | `--auto-apply` | |
| 909 | | `--allow-pushed` | Allow amending commits already in remote main branches | `--allow-pushed` | |
| 910 | | `--check` | Validate the messages after applying | `--check` | |
| 911 | | `--save-only FILE` | Save to file without applying | `--save-only fixes.yaml` | |
| 912 | | `--quiet` | Only show errors/warnings | `--quiet` | |
| 913 | |
| 914 | See the [User Guide's Key Options table] |
| 915 | for the full reference; `omni-dev git commit message twiddle --help` is the |
| 916 | source of truth. |
| 917 | |
| 918 | ## 📖 Real-World Examples |
| 919 | |
| 920 | ### Before & After |
| 921 | |
| 922 | **Before**: Messy commit history |
| 923 | |
| 924 | |
| 925 | e4b2c1a fix stuff |
| 926 | a8d9f3e wip |
| 927 | c7e1b4f update files |
| 928 | 9f2a6d8 more changes |
| 929 | |
| 930 | |
| 931 | **After**: Professional commit messages |
| 932 | |
| 933 | |
| 934 | e4b2c1a feat(auth): implement JWT token validation system |
| 935 | a8d9f3e docs(api): add comprehensive OpenAPI documentation |
| 936 | c7e1b4f fix(ui): resolve mobile responsive layout issues |
| 937 | 9f2a6d8 refactor(core): optimize database query performance |
| 938 | |
| 939 | |
| 940 | ### Workflow Integration |
| 941 | |
| 942 | |
| 943 | # 1. Work on your feature branch |
| 944 | git checkout -b feature/user-dashboard |
| 945 | |
| 946 | # 2. Make commits (don't worry about perfect messages) |
| 947 | git commit -m "wip" |
| 948 | git commit -m "fix stuff" |
| 949 | git commit -m "add more features" |
| 950 | |
| 951 | # 3. Before merging, improve all commit messages |
| 952 | omni-dev git commit message twiddle 'main..HEAD' --use-context |
| 953 | |
| 954 | # 4. Create professional PR with AI-generated description |
| 955 | omni-dev git branch create pr |
| 956 | |
| 957 | # ✅ Professional commit history + comprehensive PR description ready for review |
| 958 | |
| 959 | |
| 960 | ## Contributing |
| 961 | |
| 962 | We welcome contributions! Please see our [Contributing Guidelines] for details. |
| 963 | |
| 964 | ### Development Setup |
| 965 | |
| 966 | Clone the repository: |
| 967 | |
| 968 | |
| 969 | git clone https://github.com/rust-works/omni-dev.git |
| 970 | cd omni-dev |
| 971 | |
| 972 | |
| 973 | Install Rust (if you haven't already): |
| 974 | |
| 975 | |
| 976 | curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh |
| 977 | |
| 978 | |
| 979 | Build the project: |
| 980 | |
| 981 | |
| 982 | cargo build |
| 983 | |
| 984 | |
| 985 | Run the build script (includes tests, linting, and formatting): |
| 986 | |
| 987 | |
| 988 | ./scripts/build.sh |
| 989 | |
| 990 | |
| 991 | Or run individual steps: |
| 992 | |
| 993 | |
| 994 | cargo test # Run tests |
| 995 | cargo clippy # Run linting |
| 996 | cargo fmt # Format code |
| 997 | |
| 998 | |
| 999 | ## 📚 Documentation |
| 1000 | |
| 1001 | **[Getting Started]** - 10-minute walkthrough |
| 1002 | from install to first AI-improved commit (start here) |
| 1003 | **[User Guide]** - Comprehensive usage guide with examples |
| 1004 | **[Configuration Guide]** - Set up contextual |
| 1005 | intelligence |
| 1006 | **[Why JFM?]** - Why omni-dev edits Atlassian content as |
| 1007 | Markdown instead of raw ADF |
| 1008 | **[API Documentation]** - Rust API reference |
| 1009 | **[Troubleshooting]** - Common issues and |
| 1010 | solutions |
| 1011 | **[Examples]** - Real-world usage examples |
| 1012 | [Release Process] - For contributors |
| 1013 | |
| 1014 | ## 🔧 Requirements |
| 1015 | |
| 1016 | **Rust**: 1.88+ (for installation from source) |
| 1017 | **Claude API Key**: Required for AI-powered features |
| 1018 | See [Authentication] for |
| 1019 | setup (env var, `.env`, or CI/CD secrets) |
| 1020 | **AI Model Selection**: Optional configuration for specific models |
| 1021 | View available models: `omni-dev config models show` |
| 1022 | Pick per-invocation with `--model` on an AI command, or configure via |
| 1023 | `OMNI_DEV_MODEL` / the per-backend env chain (`CLAUDE_MODEL`, |
| 1024 | `CLAUDE_CODE_MODEL`, `ANTHROPIC_MODEL` for Claude-family backends; |
| 1025 | `OPENAI_MODEL`; `OLLAMA_MODEL`) or `~/.omni-dev/settings.json` |
| 1026 | Supports standard identifiers and Bedrock-style formats |
| 1027 | **Atlassian Credentials** (for JIRA/Confluence features): Instance URL, email, and |
| 1028 | [API token] |
| 1029 | Configure with: `omni-dev atlassian auth login` |
| 1030 | **Datadog Credentials** (for Datadog features): API key, application key, and site |
| 1031 | Configure with: `omni-dev datadog auth login` |
| 1032 | **Git**: Any modern version |
| 1033 | |
| 1034 | ### AI backend selection |
| 1035 | |
| 1036 | omni-dev supports five AI backends. The `--ai-backend` flag — accepted after |
| 1037 | the AI commands (`git commit message twiddle`, `git commit message check`, |
| 1038 | `git commit message staged`, `git branch create pr`, `ai chat`), or set via |
| 1039 | `OMNI_DEV_AI_BACKEND` — selects one decisively — `default`, `claude-cli`, |
| 1040 | `openai`, `ollama`, or `bedrock`: |
| 1041 | |
| 1042 | `--ai-backend claude-cli` — sandboxed `claude -p` subprocess that reuses |
| 1043 | your Claude Code session. |
| 1044 | `--ai-backend ollama` — local Ollama or LM Studio server. |
| 1045 | `--ai-backend openai` — OpenAI Chat Completions API. |
| 1046 | `--ai-backend bedrock` — AWS Bedrock. |
| 1047 | `--ai-backend default` *(or no flag)* — direct Anthropic API. |
| 1048 | |
| 1049 | When `OMNI_DEV_AI_BACKEND` is unset, the legacy `USE_OLLAMA=true` / |
| 1050 | `USE_OPENAI=true` / `CLAUDE_CODE_USE_BEDROCK=true` variables still select |
| 1051 | their backends, in that order. |
| 1052 | |
| 1053 | See the **[AI Backends Guide]** for required env vars, |
| 1054 | model selection, the Claude CLI sandbox and its escape hatches |
| 1055 | (`--claude-cli-allow-tools`, `--claude-cli-allow-mcp`), the |
| 1056 | `--claude-cli-max-budget-usd` spending cap, and per-backend troubleshooting. |
| 1057 | |
| 1058 | ## 🐛 Debugging |
| 1059 | |
| 1060 | For troubleshooting and detailed logging, use the `RUST_LOG` environment variable: |
| 1061 | |
| 1062 | |
| 1063 | # Enable debug logging for omni-dev components |
| 1064 | RUST_LOG=omni_dev=debug omni-dev git commit message twiddle ... |
| 1065 | |
| 1066 | # Debug specific modules (e.g., context discovery) |
| 1067 | RUST_LOG=omni_dev::claude::context::discovery=debug omni-dev git commit message twiddle ... |
| 1068 | |
| 1069 | # Show only errors and warnings |
| 1070 | RUST_LOG=warn omni-dev git commit message twiddle ... |
| 1071 | |
| 1072 | |
| 1073 | See [Troubleshooting Guide] for detailed debugging information. |
| 1074 | |
| 1075 | ## Changelog |
| 1076 | |
| 1077 | See [CHANGELOG.md] for a list of changes in each version. |
| 1078 | |
| 1079 | ## License |
| 1080 | |
| 1081 | This project is licensed under the BSD 3-Clause License - see the |
| 1082 | [LICENSE] file for details. |
| 1083 | |
| 1084 | ## Support |
| 1085 | |
| 1086 | 📋 [Issues] |
| 1087 | 💬 [Discussions] |
| 1088 | |
| 1089 | ## Acknowledgments |
| 1090 | |
| 1091 | Thanks to all contributors who help make this project better! |
| 1092 | Built with ❤️ using Rust |
| 1093 |
Discussion
Alternatives
Browse more free AI agents or everything in Development.
