From oma
Verifies documentation references (file paths, CLI commands, config keys, env vars) against codebase and proposes updates for git diff-affected docs.
npx claudepluginhub first-fluke/oh-my-agent --plugin omaThis skill uses the workspace's default tool permissions.
Detect broken references in `docs/**/*.md` (verify mode) and propose LLM-generated patch proposals for docs affected by recent code changes (sync mode). Both modes run on-demand; sync is always interactive.
Detects documentation drift, stale references, and cross-document inconsistencies in projects. Scans code-doc mismatches, broken links, outdated versions, and git staleness.
Audits repo docs under doc/ and READMEs (README.md, README-EN.md, README-ZH.md, mcp/README.md) for drift, stale statements, broken references before PRs.
Detects documentation drift from code using harness check-docs, cleanup, git diff, and graph queries. Run after features, refactoring, code reviews, or periodically.
Share bugs, ideas, or general feedback.
Detect broken references in docs/**/*.md (verify mode) and propose LLM-generated patch proposals for docs affected by recent code changes (sync mode). Both modes run on-demand; sync is always interactive.
docs.auto_verify: true and runs oma docs verify --json at completion.oma-translator.verify mode: Optional glob path (default **/*.md), optional --json flag, optional --report-file <path>.
sync mode: Optional git diff range (default --cached, fallback HEAD~1..HEAD).
verify mode:
--json, or full markdown written to file with --report-file.sync mode:
[y] apply [n] skip [d] diff [s] full proposal prompts.doc-refs.json regenerated after applies.cli/commands/docs/extract.ts — markdown AST + L2 pattern extractor.cli/commands/docs/resolve.ts — deterministic broken-ref checker.cli/commands/docs/reporter.ts — markdown/JSON report renderer (LLM-optional).cli/commands/docs/sync-propose.ts — git diff intake, reverse lookup, LLM patch proposer with secret redaction.cli/io/llm.ts — thin Anthropic Messages wrapper used by reporter and sync proposer.docs/generated/doc-refs.json — single-direction reference index (git-tracked, regenerated on every verify run).docs/generated/url-drift.json — lychee-produced URL drift report (written by background lychee spawn; gitignored or tracked at user discretion).lychee — external Rust tool for URL link checking. Detected on PATH; install via brew install lychee or see https://github.com/lycheeverse/lychee#installation. Optional but recommended..agents/oma-config.yaml — docs.auto_verify (workflow hook opt-in) and docs.check_urls (URL checking on/off, default true) toggles.verify or sync.--json, --report-file, LLM availability, and network reachability.verify | sync). If absent, print help and exit.oma-config.yaml to check docs.auto_verify when invoked from a workflow hook.oma docs verify, oma docs sync) are on PATH.extract.ts) to regenerate doc-refs.json from docs/**/*.md (verify) or build in-memory reverse index from existing doc-refs.json (sync).--json; structured candidate list for sync).doc-refs.json is stale or missing in sync: run extractor first, then continue.verify-skipped: unreachable, continue.oma docs CLI not found: skip with installation hint (workflow hook: skip silently).doc-refs.json write failure: abort and report the write error; do not emit partial index.doc-refs.json regenerated; session summary printed.| Action | SSL primitive | Notes |
|---|---|---|
| Parse CLI args and mode | READ | First arg selects verify or sync |
| Extract refs from docs | CALL_TOOL | extract.ts: remark AST + L2 patterns → doc-refs.json |
| Check broken refs | RESOLVE | resolve.ts: file, url, cli, script, env, config checks |
| Build reverse index | INFER | sync-propose.ts: in-memory map from doc-refs.json |
| Match diff to candidate docs | RESOLVE | sync-propose.ts: git diff + reverse lookup |
| Redact secrets from diff | VALIDATE | Exclude .env*, *.pem, *.key, id_rsa*; sanitize content |
| Generate patch proposals | CALL_TOOL | sync-propose.ts + llm.ts: per-doc LLM calls |
| Render drift report | RENDER | reporter.ts: markdown (default), JSON (--json), file (--report-file) |
| Apply approved patches | WRITE | git apply on user-confirmed patches only |
| Notify hook summary | NOTIFY | 1-3 line stdout summary for workflow hooks |
cli/commands/docs/extract.ts — remark + unified markdown AST, L2 pattern extraction, escape hatch filter, docs/generated/doc-refs.json writer.cli/commands/docs/resolve.ts — case-sensitive file existence, which for CLI tokens, package.json scripts lookup, ripgrep/git grep for env vars, oma-config.yaml deep-path check. Per-target dedupe caches (cli by first token, env, config) and per-directory listing cache for file resolution. URL kind is filtered out by the verify command and delegated to lychee.cli/commands/docs/reporter.ts — deterministic markdown + JSON renderer. No LLM call. Friendly summary, severity tagging, fix prioritization are the host LLM's responsibility.cli/commands/docs/sync-propose.ts — git diff intake, reverse index build, secret-pattern + gitignore file exclusion. Returns candidate docs with matched refs only. No LLM call. Patch synthesis is the host LLM's responsibility.lychee (background URL link checking; install via brew install lychee).This skill follows the OMA pattern (mirroring oma-scholar): the CLI emits structured data; the host LLM (the agent runtime that invoked the skill) does any natural-language synthesis or judgment.
After oma docs verify --json:
After oma docs sync <range> --json:
{ doc, changedFiles, matchedRefs }).git diff for changedFiles, draft a unified-diff patch reflecting the code change.git apply or by writing the doc directly.verify mode — drift check against the current codebase:
# Default: scan all docs/**/*.md, render markdown to stdout.
# URL link checking is delegated to lychee in the background
# (install: `brew install lychee`). Core check ~8s on a 1k-doc repo.
oma docs verify
# Narrow to a path or glob (uses minimatch)
oma docs verify "docs/**/*.md"
oma docs verify cli/README.md
# Machine-readable output for CI / hooks
oma docs verify --json
# Persist full markdown report to a file
oma docs verify --report-file ./drift-report.md
# Skip URL checking entirely (when lychee is run separately, or as a
# one-off override of docs.check_urls=true in oma-config.yaml)
oma docs verify --no-urls
# Block until lychee finishes (CI scenarios needing complete URL data)
oma docs verify --urls-sync
# Exit code: 0 = clean, 1 = broken refs found in core check.
# URL drift, if any, is reported separately at docs/generated/url-drift.json
# and does NOT affect this exit code.
sync mode — propose patches for docs affected by a git diff (always interactive, never auto-applies):
# Default: staged changes (--cached), fallback HEAD~1..HEAD
oma docs sync
# Explicit range
oma docs sync HEAD~5..HEAD
oma docs sync main..feature-branch
# Per-doc prompt: [y] apply [n] skip [d] show diff [s] show full proposal
# Sync regenerates docs/generated/doc-refs.json after applying any patches.
Workflow hook (opt-in) — runs verify automatically at workflow completion when docs.auto_verify: true in oma-config.yaml:
# Hook command emitted by /scm, /work, /ultrawork
oma docs verify --json
# Hook policy: warn-only in v1; non-zero exit does NOT block workflow completion
| Scope | Resource target |
|---|---|
LOCAL_FS read | docs/**/*.md (extractor input), docs/generated/doc-refs.json (index), .env.example, package.json, .agents/oma-config.yaml |
LOCAL_FS write | docs/generated/doc-refs.json (regenerated each verify run), approved sync patches |
CODEBASE read-only | Existence checks for file/cli/script/env/config refs; git diff intake |
PROCESS | git diff, git apply, which, HTTP HEAD requests |
NETWORK | URL ref HEAD requests (external hosts only; internal hosts skipped) |
docs/ directory exists at repo root.cli/commands/docs/ is built and oma binary is on PATH (or invoked directly via bun run).--cached stage or recent commits).docs/generated/doc-refs.json (always overwrites).doc-refs.json after applies..agents/ files are ever modified..agents/ — CLAUDE.md SSOT protection applies in all modes.[y] confirm required per doc.oma-config.yaml language — user-facing report text is localized; code, paths, JSON keys, and CLI commands stay in English..env*, *.pem, *.key, id_rsa*, and gitignored files never appear in candidate changedFiles lists. Host LLM never sees secret file paths.docs.check_urls=true (default), URL refs are checked by lychee running in the background; results land in docs/generated/url-drift.json. If lychee is missing, an install hint is printed and URL checking is skipped (no internal HEAD fallback).oma-scholar's pattern). This makes oma-docs vendor-agnostic: works identically under Claude Code / Codex / Gemini / Qwen / Antigravity.docs.auto_verify: false by default (explicit opt-in required).<!-- oma-docs:ignore-start --> / <!-- oma-docs:ignore-end --> blocks and frontmatter oma-docs: skip are honored; no ref extraction from ignored regions.v1 covers verify and sync (broken-only classification, L2 ref extraction). The following are explicitly deferred to v2: create mode (generate missing docs), multilingual sync (deeper oma-translator integration), L3 symbol-level extraction (Tree-sitter/LSP), GitHub Action wrapper, block hook mode.
docs/plans/designs/008-oma-docs.md — full architecture, schema spec, decision log, edge cases.doc-refs.json v1 schema defined in design doc § doc-refs.json Schema.deepinit Step 6 retirement — design doc § Migration: deepinit Step 6.oma-translator (v2 multilingual), oma-skill-creator (SSL-lite validation).