The full upstream README, mirrored here for reference. Install config, tool schemas, adoption signals, and an original overview live on the Compare Cli MCP listing page.
Clause-aware drift detection between two contract versions. Pre-signature gate for legal teams and agent pipelines. Single-file Node CLI, two runtime deps, deterministic by design, no LLM tier in v1.
Part of the contract-ops CLI suite: template-vault-cli (storage) → draft-cli (fill placeholders) → nda-review-cli (review, redline, negotiate) → docx2pdf-cli (DOCX → PDF) → sign-cli (signing + audit). compare-cli is the pre-signature drift gate. Showcase site.
Part of the contract-ops CLI suite. draft-cli (fill placeholders) → nda-review-cli (review, redline, negotiate) → docx2pdf-cli (DOCX → PDF) → sign-cli (signing + audit). Storage: template-vault-cli. Drift detection: compare-cli (this CLI). Showcase site.
Agent pipelines: see
mcp/README.mdforcompare-cli-mcp, the MCP server wrapping this CLI. Three tools (compare_files,compare_with_negotiation,compare_demo), stdio transport, JSON-first responses. Design contract:docs/mcp.md.
You negotiated a contract over several rounds with counterparty's counsel.
A few days later their paralegal sends you a ready-to-sign.pdf. Is the
PDF the same text you agreed to, or did something quietly shift between
"final version" and "version we put in the signing envelope"?
compare-cli answers that question with an exit code your CI can gate on:
$1,000 vs $1000, Oxford comma) drift.
Informational; the agreement didn't change.The CLI works on .docx, .pdf, .md, and plain text — including
cross-format comparisons (negotiated .docx vs ready-to-sign .pdf).
Or run without installing:
(The package is compare-cli; the installed command is compare. The
-p … -- compare form tells npx which package to fetch and which bin
to run, since the two names differ.)
Requires Node ≥ 20. (Pinned by pdfjs-dist@^5.7.284, which we share with sign-cli.)
Runs against two bundled fixtures (a negotiated NDA and a candidate where the term silently shifted from "two (2) years" to "three (3) years") and exits 2. You see the headline contract — substantive drift detected, report written, exit code asserted — without authoring a file.
Same comparison, structured JSON output to stdout.
| If you are… | Start here |
|---|---|
| A new user evaluating the gate | Run this above, then the End-to-end transcript |
| An LLM agent driving the CLI | AGENTS.md → compare --catalog json → compare <base> <candidate> --json |
| Gating in CI | compare --check (exit-code only) or --sarif for code-scanning |
| Wiring via MCP | the compare-cli-mcp package — see docs/mcp.md |
| Adding a new CLI to the suite | The build-a-CLI playbook — the conventions every suite CLI follows |
In a CI pipeline:
| Code | Meaning |
|---|---|
0 | No drift detected, safe to sign |
1 | I/O error — input not found, unreadable, malformed .docx/.pdf |
2 | Substantive drift (or --strict/--strict-cosmetic was set and tripped) |
3 | Cosmetic-only or typographic-only drift (informational) |
4 | Clause(s) moved but content identical |
Stable across minor versions. Documented in AGENTS.md and COMPARE_SCHEMA.md.
...$1,000 vs $1000,
5.0% vs 5%), Oxford comma flips, case-only differences
(Acme vs ACME)will not vs will, two years vs three years,
clauses added or removed)The exact rules — including what is deliberately not normalized away (singular/plural, tense, negation, list punctuation) — are locked in COMPARE_SCHEMA.md §5–§6.
--json output shapeStable across minor versions. Top-level keys: ok, exit_class,
exit_code, base, candidate, summary, differences, warnings.
See COMPARE_SCHEMA.md §10 for the full shape.
--why outputStructured key=value lines on stderr describing detection tiers,
alignment method, class counts, exit decision, and strict-mode state.
Same posture as draft-cli's --why.
--from-negotiationReads nda-review-cli's negotiation.json and extracts the latest
agreed text as BASE. Three-tier resolution (preferred → fallback):
top-level status: converged|signed_off|finalized, per-round
agreed: true (minimum schema), per-round clause_status all
"agreed" (historical fallback). See
COMPARE_SCHEMA.md §9.
Pair with --require-signoffs when running unattended: it errors
(exit 2) unless both signoffs.a and signoffs.b are non-empty in the
state file. nda-review-cli populates these when the negotiate sign-off
checkpoint is satisfied — a human-review gate before any agreement is
acted on.
--only-clauses Term,Payment,Indemnification keeps only matching
clauses in the report and exit-code calculation; --ignore-clauses Acknowledgments,Notices drops matching ones. Patterns are
case-insensitive substrings, matched against numbering-stripped clause
titles. Both flags can combine (--ignore-clauses runs after
--only-clauses). The number of suppressed differences is surfaced in
the human report and as summary.suppressed_by_filter in --json /
SARIF output, so the suppression is auditable.
--sarif (CI / code-scanning)--sarif emits a SARIF v2.1.0 document. Each substantive difference is
a result with level: error; cosmetic/typographic are warning;
added/removed/moved are note. Designed for GitHub Actions code-
scanning upload — substantive drift appears as inline annotations on
the candidate file in the PR review UI.
--check (exit-code-only mode)--check suppresses both stdout and stderr; the exit code is the only
output. Use for CI gates and short shell pipelines:
Implies --silent. --output is also skipped under --check (you said
you only care about the exit code).
If no agreed round exists, the CLI exits 2 with a clear error.
Text extraction from .pdf is layout-lossy. When either side is a PDF,
the report surfaces a warning:
If extraction returns zero characters (a scanned PDF without an OCR layer), compare-cli exits 1 with a clear message rather than silently reporting no drift.
Pipeline (in order):
negotiation.json hash-chained state file. --from-negotiation
reads its output..docx into the .pdf you put
in the signing envelope.Auxiliaries:
info --json payloads that
downstream tools consume. Implements the same clause-detection rule
(docs/clause-detection.md) compare-cli
does; divergences tracked in
template-vault-cli/docs/clause-detection-divergence.md.MIT © DrBaher