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/main1 file
README.md
Show the full text1093 lines

omni-dev

MCP Toplist

Crates.io Documentation Build Status License: BSD-3-Clause

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

asciicast

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:

  • AskUserQuestion calls render as ### Agent question: <header> with the question text and a bulleted list of options (with descriptions); the paired user reply renders as ## User response.
  • Tool 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 next tool_result.
  • Tool interrupts (escape mid-execution) render as **Tool result (<tool>, interrupted by user):**.
  • Errors (real tool failures, distinct from user denials) keep the error label; successes use ok.

System reminders, attachments, and permission-mode events are included by default — pass --exclude-system to drop them. Markdown idempotency keys off source mtime alone (the rendered length differs from the source length), and --prune only deletes artifacts whose extension matches one of the formats listed in --output-format.

See docs/user-guide.md#ai-claude-history-sync--export-conversation-history for the in-depth reference, and the broader Claude Code Integration section for related commands (ai chat, ai claude skills).

🔌 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
  1. Clone the repository:

    git clone https://github.com/rust-works/omni-dev.git
    cd omni-dev
    
  2. Install Rust (if you haven't already):

    curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
    
  3. Build the project:

    cargo build
    
  4. Run the build script (includes tests, linting, and formatting):

    ./scripts/build.sh
    

    Or run individual steps:

    cargo test         # Run tests
    cargo clippy       # Run linting
    cargo fmt          # Format code
    

📚 Documentation

🔧 Requirements

  • Rust: 1.88+ (for installation from source)
  • Claude API Key: Required for AI-powered features
  • AI Model Selection: Optional configuration for specific models
    • View available models: omni-dev config models show
    • Pick per-invocation with --model on an AI command, or configure via OMNI_DEV_MODEL / the per-backend env chain (CLAUDE_MODEL, CLAUDE_CODE_MODEL, ANTHROPIC_MODEL for Claude-family backends; OPENAI_MODEL; OLLAMA_MODEL) or ~/.omni-dev/settings.json
    • Supports standard identifiers and Bedrock-style formats
  • Atlassian Credentials (for JIRA/Confluence features): Instance URL, email, and API token
    • Configure with: omni-dev atlassian auth login
  • Datadog Credentials (for Datadog features): API key, application key, and site
    • Configure with: omni-dev datadog auth login
  • 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 — sandboxed claude -p subprocess that reuses your Claude Code session.
  • --ai-backend ollama — local Ollama or LM Studio server.
  • --ai-backend openai — OpenAI Chat Completions API.
  • --ai-backend bedrock — AWS Bedrock.
  • --ai-backend default (or no flag) — direct Anthropic API.

When OMNI_DEV_AI_BACKEND is unset, the legacy USE_OLLAMA=true / USE_OPENAI=true / CLAUDE_CODE_USE_BEDROCK=true variables still select their backends, in that order.

See the AI Backends Guide for required env vars, model selection, the Claude CLI sandbox and its escape hatches (--claude-cli-allow-tools, --claude-cli-allow-mcp), the --claude-cli-max-budget-usd spending cap, and per-backend troubleshooting.

🐛 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

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/badge/glama%2Frust-works%2Fomni-dev.svg)](https://mcptoplist.com/server/glama%2Frust-works%2Fomni-dev)
4 
5[![Crates.io](https://img.shields.io/crates/v/omni-dev.svg)](https://crates.io/crates/omni-dev)
6[![Documentation](https://docs.rs/omni-dev/badge.svg)](https://docs.rs/omni-dev)
7[![Build Status](https://github.com/rust-works/omni-dev/workflows/CI/badge.svg)](https://github.com/rust-works/omni-dev/actions)
8[![License: BSD-3-Clause](https://img.shields.io/badge/License-BSD%203--Clause-blue.svg)](LICENSE)
9 
10An intelligent Git commit message toolkit with AI-powered contextual
11intelligence. Transform messy commit histories into professional,
12conventional commit formats with project-aware suggestions.
13 
14## 🎬 See It In Action
15 
16[![asciicast](https://asciinema.org/a/eJJf5Aj8N26JoCaUsAFVH8dqz.png)](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 
22Transform your commit messages and create professional PRs with AI intelligence:
23 
24```bash
25# Analyze and improve commit messages in your current branch
26omni-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
34omni-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```bash
64# Install from crates.io
65cargo install omni-dev
66 
67# Install with Nix
68nix profile install github:rust-works/omni-dev
69 
70# Install with Nix flakes (development)
71nix run github:rust-works/omni-dev
72```
73 
74Pre-built binaries are attached to each
75[release](https://github.com/rust-works/omni-dev/releases). The Linux ones
76(`omni-dev-linux.tar.gz`, `omni-dev-linux-arm64.tar.gz`) are dynamically linked
77and need **glibc 2.35 or newer** (Ubuntu 22.04 and Debian 12 qualify). On an older
78host, such as RHEL 9 or Amazon Linux 2023 (glibc 2.34), they fail in the loader
79with ``version `GLIBC_2.xx' not found``; build from source with
80`cargo install omni-dev` instead. The release workflow fails if a binary needs
81more than that floor ([docs/RELEASE.md](docs/RELEASE.md#linux-glibc-floor)).
82 
83**Next step:** see [Getting Started](docs/getting-started.md) — a
8410-minute walkthrough from authentication to your first AI-improved
85commit. (For just the API-key reference, see
86[Authentication](docs/configuration.md#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
92per-user:
93 
94```bash
95# Add to ~/.bashrc:
96eval "$(omni-dev completions bash)"
97```
98 
99See [docs/shell-completion.md](docs/shell-completion.md) for per-shell install
100recipes, the `$fpath`/`compinit` setup zsh requires, and troubleshooting.
101 
102## 🆚 How omni-dev Compares
103 
104omni-dev sits in two adjacent spaces — AI commit-message tooling and
105Atlassian/dev-workflow MCP servers. The tables below contrast the
106incumbents on the dimensions a first-time reader is most likely to weigh.
107In every cell, `✅` means full / native support, `⚠` means partial or
108available only with caveats, and `❌` means not supported — and omni-dev's
109own limitations are flagged just as honestly (the `⚠` marks in its own
110columns).
111 
112Beyond these two niches, omni-dev also ships a supervised **daemon** that
113hosts a **browser bridge** (an authenticated proxy that runs requests
114through a logged-in browser tab for SSO-gated dashboards such as Grafana
115and Loki), a **Snowflake** SQL service (one external-browser SSO session
116reused for concurrent queries), and a **worktrees** registry (one live view of
117the 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
119table below, so
120they are called out here rather than scored against tools that don't aim
121for them.
122 
123### vs AI commit tools
124 
125| | omni-dev | [opencommit](https://github.com/di-sukharev/opencommit) | [aicommits](https://github.com/Nutlope/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](docs/adrs/adr-0028.md) | ❌ | ❌ |
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 
138omni-dev's MCP server also exposes Git tools (commit analysis, twiddling,
139PR creation), Datadog tools, and an `ai_chat` proxy — surfaces the
140Atlassian-focused servers don't aim for. The table below compares only
141Atlassian capability depth.
142 
143| | omni-dev MCP | [sooperset/mcp-atlassian](https://github.com/sooperset/mcp-atlassian) | [Atlassian official (Rovo)](https://github.com/atlassian/atlassian-mcp-server) |
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
157cycle on a complex page. Atlassian Rovo's server accepts the API token but
158gates tool **execution** behind an org-admin grant, so its rows combine
159Atlassian's
160[Supported tools](https://support.atlassian.com/atlassian-rovo-mcp-server/docs/supported-tools/)
161docs with the ADF-passthrough reasoning (raw ADF can round-trip, but only if
162the model echoes it faithfully — no deterministic guarantee), not a live run.
163Refresh quarterly or whenever a release-note search for the comparators flags
164a relevant change._
165 
166## 📋 Core Commands
167 
168### 🤖 AI-Powered Commit Improvement (`twiddle`)
169 
170The star feature - intelligently improve your commit messages with real-time model information display:
171 
172```bash
173# Improve commits with contextual intelligence
174omni-dev git commit message twiddle 'origin/main..HEAD' --use-context
175 
176# Process large commit ranges with parallel processing
177omni-dev git commit message twiddle 'HEAD~20..HEAD' --concurrency 5
178 
179# Save suggestions to file for review
180omni-dev git commit message twiddle 'HEAD~5..HEAD' \
181 --save-only suggestions.yaml
182 
183# Auto-apply improvements without confirmation
184omni-dev git commit message twiddle 'HEAD~3..HEAD' --auto-apply
185```
186 
187### 🔍 Analysis Commands
188 
189```bash
190# Analyze commits in detail (YAML output)
191omni-dev git commit message view 'HEAD~3..HEAD'
192 
193# Analyze current branch vs main
194omni-dev git branch info main
195 
196# Get comprehensive help
197omni-dev help-all
198```
199 
200### 🚀 AI-Powered PR Creation
201 
202Create professional pull requests with AI-generated descriptions:
203 
204```bash
205# Generate and create PR with AI-powered description
206omni-dev git branch create pr
207 
208# Create PR with specific base branch
209omni-dev git branch create pr main
210 
211# Save PR details to file without creating
212omni-dev git branch create pr --save-only pr-description.yaml
213 
214# Auto-create without confirmation
215omni-dev git branch create pr --auto-apply
216```
217 
218### 📝 Atlassian Integration
219 
220Read, write, and manage JIRA issues and Confluence pages from the command line:
221 
222```bash
223# Authenticate with Atlassian Cloud
224omni-dev atlassian auth login
225 
226# Check authentication status
227omni-dev atlassian auth status
228 
229# Fetch a JIRA issue as markdown
230omni-dev atlassian jira read PROJ-123
231 
232# Fetch as raw ADF JSON
233omni-dev atlassian jira read PROJ-123 --format adf
234 
235# Push markdown changes back to JIRA
236omni-dev atlassian jira write PROJ-123 issue.md
237 
238# Interactive edit: fetch, edit in $EDITOR, push
239omni-dev atlassian jira edit PROJ-123
240 
241# Search issues with JQL
242omni-dev atlassian jira search --project PROJ --status Open
243 
244# Create an issue
245omni-dev atlassian jira create issue.md --project PROJ --summary "Fix bug"
246 
247# Transition an issue
248omni-dev atlassian jira transition PROJ-123 "In Progress"
249 
250# Confluence: read, search, create pages
251omni-dev atlassian confluence read 12345
252omni-dev atlassian confluence search --space ENG --title auth
253omni-dev atlassian confluence create page.md --space ENG --title "New Page"
254 
255# Convert markdown to ADF JSON (offline)
256omni-dev atlassian convert to-adf input.md
257```
258 
259Self-hosted PATs use `atlassian auth login --auth-mode bearer` without email.
260See [PAT authentication and compatibility limits](docs/user-guide.md#serverdata-center-personal-access-tokens);
261most service operations still target Cloud APIs.
262 
263### 📊 Datadog Integration (read-only)
264 
265Authenticate against the Datadog API and query metrics, monitors, dashboards,
266logs, events, SLOs, hosts, and downtimes. See the [Datadog integration
267guide](docs/datadog.md) for the full subcommand reference, authentication
268setup, rate-limit behaviour, and troubleshooting.
269 
270```bash
271# Configure Datadog API credentials (prompts for API key, APP key, and site)
272omni-dev datadog auth login
273 
274# Verify the credentials by calling /api/v1/validate
275omni-dev datadog auth status
276 
277# Query metrics, monitors, dashboards, logs, and SLOs
278omni-dev datadog metrics query --query 'avg:system.cpu.user{*}' --from 15m
279omni-dev datadog monitor list --tags env:prod
280omni-dev datadog dashboard list
281omni-dev datadog logs search --filter 'service:api status:error' --from 1h
282omni-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`)
287are recognised without warning. Environment variables `DATADOG_API_KEY`,
288`DATADOG_APP_KEY`, `DATADOG_SITE` override the stored settings. For on-prem
289or proxied installs, set `DATADOG_API_URL` to override the site-derived URL.
290 
291All Datadog subcommands are also exposed as MCP tools (`datadog_*`) — see
292[docs/mcp.md](docs/mcp.md#datadog-14-tools). For the full guide covering
293every family with worked examples, see [docs/datadog.md](docs/datadog.md).
294 
295### 📧 Gmail Integration
296 
297Authenticate against your own Gmail account via OAuth2 (loopback
298authorization-code + PKCE), search/read/label messages and threads, and
299maintain a durable local archive with `gmail sync`. New to this
300integration? Start with the
301[Gmail Quickstart](docs/gmail-quickstart.md) for a zero-to-synced-archive
302walkthrough; see the [Gmail integration guide](docs/gmail.md) for
303prerequisites (you bring your own Google Cloud OAuth2 client — Gmail read
304scopes require Google's CASA security assessment to distribute otherwise),
305authentication setup, rate-limit behaviour, and troubleshooting.
306 
307```bash
308# One-time: create your own Google Cloud OAuth2 client (see docs/gmail.md),
309# then authenticate (opens a browser)
310export GMAIL_CLIENT_ID=...
311export GMAIL_CLIENT_SECRET=...
312omni-dev gmail auth login
313 
314# Verify the credentials by calling users.getProfile
315omni-dev gmail auth status
316 
317# Search, read messages/threads, and manage labels
318omni-dev gmail search --query 'label:finance after:2026/01/01' --limit 50
319omni-dev gmail read <message-id>
320omni-dev gmail thread <thread-id>
321omni-dev gmail label list
322 
323# Maintain a durable local archive (.eml files + a JSONL manifest)
324omni-dev gmail sync --output-dir ~/mail-archive --query 'label:finance'
325```
326 
327An OAuth2 client left in Google's "Testing" publishing status issues
328refresh tokens that expire after 7 days — see
329[docs/gmail.md](docs/gmail.md#prerequisites) for how to avoid re-running
330`auth login` weekly.
331 
332Every read-only Gmail subcommand except `sync` is also exposed as an MCP
333tool (`gmail_*`) — see [docs/mcp.md](docs/mcp.md#gmail-8-tools); `sync` is
334CLI-only (a long-running bulk filesystem operation, a poor fit for a
335synchronous MCP call). For the full guide, see
336[docs/gmail.md](docs/gmail.md).
337 
338### 📁 Drive Integration
339 
340Authenticate against your own Google Drive account via OAuth2 (loopback
341authorization-code + PKCE, the same flow as Gmail), then search files, read
342their metadata or content, find duplicates, rename/move files, and create,
343upload, or replace file content. Every write is opt-in twice over. First by
344OAuth scope: the default `drive.readonly` covers search/read/dedupe;
345rename/move need `drive.metadata` (`drive auth login --write`), the narrowest
346write scope Google offers; create/upload need `drive.file`
347(`--write-file`); and editing a file omni-dev did not itself create needs the
348unrestricted `drive` scope (`--write-full`). Second by a **local**,
349folder-scoped gate: `create`/`upload`/`edit` resolve the target's ancestor
350folder chain against per-account rules in `settings.json` — closest ancestor
351wins, deny beats allow, and **a write with no matching rule is denied** — so
352an OAuth grant alone never authorizes a mutation (see
353[ADR-0071](docs/adrs/adr-0071.md)). Inspect that gate with `drive permissions
354show/lookup-folder/check` before granting anything. There is still no
355trash/share/permission-mutation capability anywhere in this surface. `drive
356move` is separately security-gated: it refuses any move that would change a
357file's visibility by default (see [ADR-0070](docs/adrs/adr-0070.md)).
358New to this integration? Start with the
359[Drive Quickstart](docs/drive-quickstart.md) for a zero-to-first-search
360walkthrough; see the [Drive integration guide](docs/drive.md) for
361prerequisites (you bring your own Google Cloud OAuth2 client, independent
362of Gmail's), authentication setup, rate-limit behaviour, and
363troubleshooting.
364 
365```bash
366# One-time: create your own Google Cloud OAuth2 client (see docs/drive.md),
367# then authenticate (opens a browser)
368export DRIVE_CLIENT_ID=...
369export DRIVE_CLIENT_SECRET=...
370omni-dev drive auth login
371 
372# Verify the credentials by calling about.get
373omni-dev drive auth status
374 
375# Search and read file metadata/content
376omni-dev drive search "name contains 'report'"
377omni-dev drive read <file-id>
378omni-dev drive read <file-id> --content --out-file report.pdf
379 
380# Rename/move need the opt-in drive.metadata scope
381omni-dev drive auth login --write
382omni-dev drive rename <file-id> "New Name.pdf"
383omni-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
387omni-dev drive auth login --write-file # or --write-full to edit
388omni-dev drive permissions show # what is configured
389omni-dev drive permissions check <folder-id> --operation create # what it decides
390omni-dev drive create --name notes.txt --parent <folder-id>
391omni-dev drive upload ./report.pdf --parent <folder-id>
392omni-dev drive edit <file-id> --content ./report.pdf # or --content - for stdin
393```
394 
395An OAuth2 client left in Google's "Testing" publishing status issues
396refresh tokens that expire after 7 days — see
397[docs/drive.md](docs/drive.md#prerequisites) for how to avoid re-running
398`auth login` weekly.
399 
400Five read-only MCP tools (`drive_*`) mirror the CLI's `auth status`,
401`search`, `dedupe`, `read`, and `account list` — see
402[docs/mcp.md](docs/mcp.md#drive-5-tools). The mutating verbs —
403`rename`/`move`/`create`/`upload`/`edit` — have no MCP equivalent. For the
404full guide, see [docs/drive.md](docs/drive.md).
405 
406### 🎙️ Transcript Fetching
407 
408Pull captions and transcripts from external media platforms. YouTube is the
409first supported source; the CLI namespace and library are designed so
410additional sources (Vimeo, podcast RSS, generic VTT/SRT URLs) can be
411added without restructuring. See [docs/transcript.md](docs/transcript.md)
412for the full reference and the recipe for adding a new source.
413 
414```bash
415# Fetch captions for a YouTube video as SubRip (default).
416omni-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.
419omni-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.
423omni-dev transcript youtube fetch <url> --lang fr --translate fr
424 
425# List available caption tracks (manual + auto-generated).
426omni-dev transcript youtube list-langs <url>
427 
428# Show video metadata (title, channel, duration, languages).
429omni-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,
434or a bare 11-character video ID. Age-gated and login-required videos
435surface as a typed `PlayabilityRefused` error carrying YouTube's status
436code rather than a generic HTTP failure.
437 
438### 🌐 Browser Bridge
439 
440Drive HTTP requests **through an authenticated browser tab**. When you are
441investigating internal services (Grafana/Loki, internal dashboards, SSO-gated
442admin panels), the browser already holds sessions — SSO, OAuth, cookies — that
443are hard to replicate programmatically. The bridge issues requests inside the
444browser's authenticated context **without exfiltrating cookies or tokens** (a
445*confused deputy by design*). Both planes are authenticated and default-closed;
446see [docs/browser-bridge.md](docs/browser-bridge.md) for the full guide and
447[ADR-0036](docs/adrs/adr-0036.md) for the security rationale.
448 
449```bash
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.
452omni-dev browser bridge serve
453 
454# Drive requests through the tab (token from the bridge's stdout).
455export OMNI_BRIDGE_TOKEN=<token printed by the bridge>
456omni-dev browser bridge request --url /loki/api/v1/labels
457 
458# POST a JSON payload from a file, with a custom header.
459omni-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.
463omni-dev browser bridge request --url /api/events --stream
464 
465# Route to a specific tab when several are connected (by id or origin).
466omni-dev browser bridge request --url /api/foo --target https://grafana.internal
467```
468 
469Supports binary and streaming response bodies, multi-tab routing via
470`X-Omni-Bridge-Target`, per-request `--credentials` and `--allow-origin`
471overrides, and a transparent proxy for tools that speak plain HTTP.
472 
473### 🛰️ Daemon
474 
475Host long-lived services in one supervised process behind a private per-user
476Unix-domain control socket. The browser bridge is the first service migrated
477onto it (Snowflake and the worktrees registry followed), and on macOS an
478optional menu-bar app gives live control. `daemon start` installs a launchd LaunchAgent for auto-start at
479login, and `status` reports every hosted service. See
480[Running under the daemon](docs/browser-bridge.md#running-under-the-daemon) and
481[ADR-0039](docs/adrs/adr-0039.md) for the architecture.
482 
483```bash
484# Start the background daemon (installs a launchd LaunchAgent on macOS)
485omni-dev daemon start
486 
487# Per-service status (add --json for machines)
488omni-dev daemon status
489 
490# Restart or stop it
491omni-dev daemon restart
492omni-dev daemon stop
493```
494 
495The daemon is Unix-only — its control plane is a Unix-domain socket — while the
496rest of omni-dev runs everywhere.
497 
498### ❄️ Snowflake
499 
500Authenticate a Snowflake session once via external-browser SSO, then run
501concurrent arbitrary SQL across any account **without an SSO popup on every
502query**. The daemon holds the session in memory and multiplexes a bounded pool,
503so each query can still set its own warehouse/role/database/schema. See
504[docs/snowflake-service.md](docs/snowflake-service.md).
505 
506```bash
507# Run SQL (from an argument or stdin); the first query opens the SSO browser
508omni-dev snowflake query "select current_version()"
509 
510# Per-query context overrides and JSON output
511omni-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
515omni-dev snowflake sessions
516omni-dev snowflake disconnect --account <ACCOUNT> --user <USER>
517```
518 
519Account/user/context default from `SNOWFLAKE_*` env vars then
520`~/.omni-dev/settings.json` — no accounts are hardcoded. Runs on the daemon, so
521it is Unix-only.
522 
523### 📓 Request Log
524 
525Every invocation and the HTTP requests it issues are recorded to a local,
526append-only log you can search and tail. Best-effort and default-on; **no
527secret is ever written** (auth headers are redacted, bodies opt-in). See
528[docs/log.md](docs/log.md).
529 
530```bash
531# Recent activity (one line each)
532omni-dev log
533 
534# Filter by service and status class, or a query expression; follow live
535omni-dev log --service jira --status 5xx
536omni-dev log --query 'method:POST AND status:4xx' --follow
537 
538# Full records as JSON (byte-identical to the on-disk lines)
539omni-dev log --format json -n 20
540```
541 
542Set `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 
547See every repo and git worktree open across **all** your VS Code windows in
548one live view. A VS Code extension host is sandboxed per window — no extension
549alone can see a sibling window's folders — so a small first-party companion
550extension registers each window with the daemon, which aggregates them into a
551single registry served back to the CLI, tray, and extension UI. The registry
552is in-memory only; windows that crash without unregistering age out
553automatically. See [docs/worktrees-service.md](docs/worktrees-service.md) and
554[ADR-0040](docs/adrs/adr-0040.md).
555 
556```bash
557# One line per open window and its folders (add --json for machines)
558omni-dev worktrees list
559```
560 
561Runs on the daemon, so it is Unix-only.
562 
563### 🤖 Agent Sessions
564 
565Track the Claude Code, Codex and pi.dev sessions running across every terminal
566and VS Code window, each with a coarse live state (working, idle, or waiting on
567you). Opt-in hooks, the `claude-wrap`/`codex-wrap` wrappers, a pi.dev extension
568and transcript watchers feed the daemon, which keeps the sessions in memory and
569serves them to the CLI, the tray, `worktrees ui` and the VS Code worktrees view.
570See [docs/sessions-service.md](docs/sessions-service.md).
571 
572```bash
573# Install the Claude Code (and, when present, Codex and pi.dev) hooks
574omni-dev sessions install-hooks
575 
576# One line per live session
577omni-dev sessions list
578```
579 
580Runs 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
585probabilistic judgments rather than generated text. Beyond the raw
586`choice`/`score`/`noul`/`ask` primitives, `route` asks which model tier each
587GitHub issue needs to design, implement and review, and `verify-decision`
588checks each claim in a decision comment against the sources it cites. See
589[docs/jev.md](docs/jev.md).
590 
591```bash
592# Which model tier should handle these issues?
593omni-dev ai jev route '#1779' '#1820' -o text
594```
595 
596### ✏️ Manual Amendment
597 
598```bash
599# Apply specific amendments from YAML file
600omni-dev git commit message amend amendments.yaml
601```
602 
603### 🧩 Claude Code Slash-Commands
604 
605Generate ready-to-use Claude Code slash-command templates into the
606project's `.claude/commands/` directory. Each template is a self-contained
607workflow that drives a multi-step omni-dev operation from inside a Claude
608Code session.
609 
610```bash
611# Generate all templates: commit-twiddle, pr-create, pr-update
612omni-dev commands generate all
613 
614# Or individually
615omni-dev commands generate commit-twiddle
616omni-dev commands generate pr-create
617omni-dev commands generate pr-update
618```
619 
620Each subcommand writes `.claude/commands/<name>.md`. Commit the files to
621share the workflows with collaborators — Claude Code picks them up
622automatically, 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](docs/user-guide.md#commands-generate--generate-claude-code-slash-commands)
625for the full reference.
626 
627### 🗒️ Claude Conversation History
628 
629Export your Claude Code chat history to a directory of `.jsonl` files for
630behavioural analysis, work-log generation, or downstream tooling. Re-running
631acts as an idempotent sync: new chats are added, modified chats are
632overwritten, unchanged chats are skipped.
633 
634```bash
635# Mirror ~/.claude/projects to ./history/ (one .jsonl per chat, grouped by project slug)
636omni-dev ai claude history sync --target ./history
637 
638# Limit to one project (encoded slug or decoded cwd path)
639omni-dev ai claude history sync --target ./history --project /Users/me/work/repo
640 
641# Only sessions touched in the last week
642omni-dev ai claude history sync --target ./history --since 7d
643 
644# Preview without writing, then prune target files for sessions removed upstream
645omni-dev ai claude history sync --target ./history --dry-run --prune
646 
647# Render LLM-friendly markdown alongside the raw jsonl (one .md per session)
648omni-dev ai claude history sync --target ./history --output-format jsonl,markdown
649 
650# Markdown only — suitable for piping into a coaching LLM
651omni-dev ai claude history sync --target ./history --output-format markdown
652```
653 
654The export is a **behavioural transcript**, not a faithful archive. The
655top-level session jsonl captures all prompts, responses, thinking blocks, tool
656calls, and tool-result metadata — the signal needed for analysis. Sub-agent
657internal turns, large tool-output sidecars, PDF page rasters, and Claude's
658auto-memory are deliberately excluded; they would bloat any LLM-ingested
659corpus without adding interaction-pattern signal.
660 
661In-progress chats produce a valid jsonl prefix (the source size is captured
662once at the start of the copy), so you can sync safely while a chat is open.
663The target layout mirrors the source — `<target>/<slug>/<uuid>.jsonl` — and
664source `mtime` is preserved on each target file so downstream tooling can
665sort sessions chronologically without parsing every file.
666 
667`--output-format markdown` writes a derived `<target>/<slug>/<uuid>.md`
668alongside (or instead of) the jsonl. Each markdown file has YAML frontmatter
669with session metadata followed by `## User` / `## Assistant` turns; tool calls
670render as `### Tool call: <name>` blocks, thinking blocks collapse into
671`<details>`, and sub-agent (`Agent`) calls render the prompt argument only.
672 
673Agent-to-user interactions are surfaced as first-class structured events so
674the 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 
687System reminders, attachments, and permission-mode events are included by
688default — pass `--exclude-system` to drop them. Markdown idempotency keys off
689source mtime alone (the rendered length differs from the source length), and
690`--prune` only deletes artifacts whose extension matches one of the formats
691listed in `--output-format`.
692 
693See [docs/user-guide.md#ai-claude-history-sync--export-conversation-history](docs/user-guide.md#ai-claude-history-sync--export-conversation-history)
694for the in-depth reference, and the broader [Claude Code Integration](docs/user-guide.md#claude-code-integration)
695section for related commands (`ai chat`, `ai claude skills`).
696 
697### 🔌 MCP Server
698 
699omni-dev ships an optional **Model Context Protocol** server so AI assistants
700(Claude Desktop, Claude Code, the MCP Inspector, custom agents) can call
701omni-dev over stdio instead of shelling out to the CLI. The server is
702delivered as a second binary, `omni-dev-mcp`, gated behind the `mcp` Cargo
703feature (see [ADR-0021](docs/adrs/adr-0021.md)).
704 
705Tools 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 
717Resources 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 
728See [docs/mcp.md](docs/mcp.md) for the full tool catalog, resource
729reference, cross-cutting parameters (`output_file`, `confirm`), and
730troubleshooting.
731 
732#### Install
733 
734```bash
735cargo install omni-dev --features mcp
736```
737 
738This adds a second binary, `omni-dev-mcp`, alongside the regular `omni-dev`
739CLI. The default `cargo install omni-dev` build is unchanged — no MCP
740dependencies are pulled in unless the `mcp` feature is enabled.
741 
742#### Claude Desktop
743 
744Edit `~/Library/Application Support/Claude/claude_desktop_config.json` on
745macOS (or `%APPDATA%\Claude\claude_desktop_config.json` on Windows):
746 
747```json
748{
749 "mcpServers": {
750 "omni-dev": {
751 "command": "omni-dev-mcp"
752 }
753 }
754}
755```
756 
757#### Claude Code
758 
759Per-project — create `.mcp.json` at the repo root:
760 
761```json
762{
763 "mcpServers": {
764 "omni-dev": {
765 "command": "omni-dev-mcp"
766 }
767 }
768}
769```
770 
771Or register globally with the Claude Code CLI:
772 
773```bash
774claude mcp add omni-dev omni-dev-mcp
775```
776 
777#### Smoke-test with the MCP Inspector
778 
779```bash
780npx @modelcontextprotocol/inspector omni-dev-mcp
781```
782 
783The Inspector opens a browser UI where you can list tools and resources,
784call any tool interactively, and fetch resources against the current working
785directory.
786 
787#### Configuration (`settings.json`)
788 
789Three 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
791three fields are optional; an absent `mcp` block leaves the built-in
792behaviour unchanged.
793 
794```json
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 
810For troubleshooting (stderr logs, `RUST_LOG=debug`, "failed to open git
811repository"), see [docs/mcp.md#troubleshooting](docs/mcp.md#troubleshooting).
812 
813### ⚙️ Configuration Commands
814 
815```bash
816# Show supported AI models and their specifications
817omni-dev config models show
818 
819# View model information with token limits and capabilities
820omni-dev config models show | grep -A5 "claude-opus-4.1"
821```
822 
823## 🧠 Contextual Intelligence
824 
825omni-dev understands your project context to provide better suggestions:
826 
827### Project Configuration
828 
829Create `.omni-dev/` directory in your repo root:
830 
831```bash
832mkdir .omni-dev
833```
834 
835#### Scope Definitions (`.omni-dev/scopes.yaml`)
836 
837```yaml
838scopes:
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```markdown
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 
870omni-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 
883Large commit ranges are automatically split into manageable batches:
884 
885```bash
886# Processes 50 commits in batches of 4 (default)
887omni-dev git commit message twiddle 'HEAD~50..HEAD' --use-context
888 
889# Custom concurrency for very large ranges
890omni-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 
914See the [User Guide's Key Options table](docs/user-guide.md#twiddle---ai-powered-improvement)
915for the full reference; `omni-dev git commit message twiddle --help` is the
916source of truth.
917 
918## 📖 Real-World Examples
919 
920### Before & After
921 
922**Before**: Messy commit history
923 
924```text
925e4b2c1a fix stuff
926a8d9f3e wip
927c7e1b4f update files
9289f2a6d8 more changes
929```
930 
931**After**: Professional commit messages
932 
933```text
934e4b2c1a feat(auth): implement JWT token validation system
935a8d9f3e docs(api): add comprehensive OpenAPI documentation
936c7e1b4f fix(ui): resolve mobile responsive layout issues
9379f2a6d8 refactor(core): optimize database query performance
938```
939 
940### Workflow Integration
941 
942```bash
943# 1. Work on your feature branch
944git checkout -b feature/user-dashboard
945 
946# 2. Make commits (don't worry about perfect messages)
947git commit -m "wip"
948git commit -m "fix stuff"
949git commit -m "add more features"
950 
951# 3. Before merging, improve all commit messages
952omni-dev git commit message twiddle 'main..HEAD' --use-context
953 
954# 4. Create professional PR with AI-generated description
955omni-dev git branch create pr
956 
957# ✅ Professional commit history + comprehensive PR description ready for review
958```
959 
960## Contributing
961 
962We welcome contributions! Please see our [Contributing Guidelines](CONTRIBUTING.md) for details.
963 
964### Development Setup
965 
9661. Clone the repository:
967 
968 ```bash
969 git clone https://github.com/rust-works/omni-dev.git
970 cd omni-dev
971 ```
972 
9732. Install Rust (if you haven't already):
974 
975 ```bash
976 curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
977 ```
978 
9793. Build the project:
980 
981 ```bash
982 cargo build
983 ```
984 
9854. Run the build script (includes tests, linting, and formatting):
986 
987 ```bash
988 ./scripts/build.sh
989 ```
990 
991 Or run individual steps:
992 
993 ```bash
994 cargo test # Run tests
995 cargo clippy # Run linting
996 cargo fmt # Format code
997 ```
998 
999## 📚 Documentation
1000 
1001- **[Getting Started](docs/getting-started.md)** - 10-minute walkthrough
1002 from install to first AI-improved commit (start here)
1003- **[User Guide](docs/user-guide.md)** - Comprehensive usage guide with examples
1004- **[Configuration Guide](docs/configuration.md)** - Set up contextual
1005 intelligence
1006- **[Why JFM?](docs/why-jfm.md)** - Why omni-dev edits Atlassian content as
1007 Markdown instead of raw ADF
1008- **[API Documentation](https://docs.rs/omni-dev)** - Rust API reference
1009- **[Troubleshooting](docs/troubleshooting.md)** - Common issues and
1010 solutions
1011- **[Examples](docs/examples.md)** - Real-world usage examples
1012- [Release Process](docs/RELEASE.md) - 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](docs/configuration.md#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](https://id.atlassian.com/manage-profile/security/api-tokens)
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 
1036omni-dev supports five AI backends. The `--ai-backend` flag — accepted after
1037the 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 
1049When `OMNI_DEV_AI_BACKEND` is unset, the legacy `USE_OLLAMA=true` /
1050`USE_OPENAI=true` / `CLAUDE_CODE_USE_BEDROCK=true` variables still select
1051their backends, in that order.
1052 
1053See the **[AI Backends Guide](docs/ai-backends.md)** for required env vars,
1054model 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 
1060For troubleshooting and detailed logging, use the `RUST_LOG` environment variable:
1061 
1062```bash
1063# Enable debug logging for omni-dev components
1064RUST_LOG=omni_dev=debug omni-dev git commit message twiddle ...
1065 
1066# Debug specific modules (e.g., context discovery)
1067RUST_LOG=omni_dev::claude::context::discovery=debug omni-dev git commit message twiddle ...
1068 
1069# Show only errors and warnings
1070RUST_LOG=warn omni-dev git commit message twiddle ...
1071```
1072 
1073See [Troubleshooting Guide](docs/troubleshooting.md) for detailed debugging information.
1074 
1075## Changelog
1076 
1077See [CHANGELOG.md](CHANGELOG.md) for a list of changes in each version.
1078 
1079## License
1080 
1081This project is licensed under the BSD 3-Clause License - see the
1082[LICENSE](LICENSE) file for details.
1083 
1084## Support
1085 
1086- 📋 [Issues](https://github.com/rust-works/omni-dev/issues)
1087- 💬 [Discussions](https://github.com/rust-works/omni-dev/discussions)
1088 
1089## Acknowledgments
1090 
1091- Thanks to all contributors who help make this project better!
1092- Built with ❤️ using Rust
1093 

Discussion

Alternatives

CI/CD and AutomationAutomates CI/CD pipeline setup. Use when setting up or modifying build and deployment pipelines. Use when you need to automate quality gates, configure test runners in CI, or establish deployment strategies.Infrastructure & ops · MITVersion Bump & Release WorkflowAutomated semantic versioning and release workflow for Claude Code plugins. Handles version increments across package.json, marketplace.json, plugin.json manifests, build verification, git tagging, GitHub releases, and changelog generation. NPM publishing is the final human-required handoff because the maintainer raised npm security.Infrastructure & ops · Apache-2.0Orca CLIOperate Orca-managed worktrees, folder contexts, terminals, repos, automations, artifacts, skill sharing, worktree comments, and Orca's embedded browser through the `orca` CLI. Use when the user says "$orca-cli", "Orca worktree", "child worktree", "spawn codex/claude in a worktree", "read/wait/send Orca terminal", "handoff" / "handover" / "give this to another agent", "Orca browser", "orca artifacts", or "share skills". Prefer it over raw git worktree, ad hoc PTYs, or Computer Use when Orca state is involved. Use Computer Use only when a visible window needs GUI control that a CLI, filesystem, or API cannot do.Infrastructure & ops · MITOrca OrchestrationCoordinate supervised Orca workers: threaded messages, blocking ask/reply, task dispatch, worker_done/escalation waits, task DAGs, decision gates, coordinator loops, and decomposing work across agents. Use `orca-cli` for full ownership handoffs — "hand off", "handoff", "handover", "give this to another agent", "another worktree" — unless asked to supervise, monitor, or coordinate a DAG, and for terminal control, lightweight terminal prompts, shell commands, Orca worktree management, and reading or waiting on terminals.Infrastructure & ops · MIT