Changelog
What's new across the suite.
Notable releases for each CLI plus this site. Filed in reverse chronological order. Subscribe by watching @DrBaher on GitHub for everything.
- docx2pdf-cli v0.2.2 May 15, 2026 releaseagentcatalog
docx2pdf-cli v0.2.2 — `--catalog json`, agent-doc reorg, telemetry shipped
The agent-discovery + telemetry-on-npm release.
--catalog json— machine-readable flag inventory matching the cross-suite contract (parallelssign --catalog jsonandnda-review-cli --catalog json). Stable across minor versions. Complements the existing--capabilities(feature contract) and--doctor(host readiness). Agents call this at startup rather than parsing--help.--retries <n>— retry network backends (gotenberg,convertapi) with non-busy backoff (Atomics.wait). Advertised viasupports.retries: truein--capabilities.- JSON success telemetry — every success row in
--jsonmode now carriesbackend,input,output,outputBytes, anddurationMs. Failure rows carryexitCodeso a batch consumer can branch per file. NDJSON shape is documented in docs/reference/json-output.md. CliError.kind— structured error class (e.g."NO_BACKEND") so library callers branch on error type, not message text.- Doc reorg adopted — new
AGENTS.md(replaces the priordocs/AGENT_INTEGRATION.md),docs/setup/per-backend (LibreOffice, Gotenberg, ConvertAPI, Pages, Word),docs/reference/for concept docs (backends, doctor JSON shape, exit codes, json-output), and a newschemas/doctor.schema.jsonso the--doctoroutput is now formally schema-validated. - README restructured around audience: “Run this” (
docx2pdf --doctor) → “Where to go next” decision tree → human quickstart → agent affordances. Human path precedes the agent section now.
Install:
npm i -g docx2pdf-cli(already on npm). - nda-review-cli v0.5.1 May 15, 2026 releaseagentcatalog
nda-review-cli v0.5.1 — `--catalog json`, `sample-nda`, `doctor --check-llm`, doc reorg
Cuts the agent-discovery + onboarding-polish work as v0.5.1.
nda-review-cli --catalog json— machine-readable inventory of every subcommand and flag, including the nestednegotiate <sub>tree (23 top-level commands, 12 nested negotiate subcommands). Stable across minor versions. Matches the cross-suite contract used bysign --catalog jsonanddocx2pdf --catalog json. Agents call this at startup rather than parsing--help.sample-nda --out PATH— drops the bundled sample NDA fixture into a user-chosen path so first-run users have something substantial to pointreviewat without knowing the fixture’s filesystem location. The fixture is a representative SaaS-style mutual NDA with clauses that reliably trip rule-engine findings (jurisdiction mismatch, indefinite-survival carve-out, term length).doctor --check-llm— sends a 1-token round-trip to the configured LLM provider (fromconfig/llm.jsonorNDA_LLM_*env vars) to confirm reachability, model name, and auth. Closes the most common LLM-setup stumble: “I edited config/llm.json, did it work?”--helpepilogs with concrete examples for the four most user-facing subcommands:review,draft,doctor, andnegotiate init. Replaces a README round-trip with in-place discovery.- First-run hint adapts to invocation form — detects whether the user invoked as
./nda_review_cli.pyornda-review-cli(pipx) and prints the matching prefix in every example. Disambiguates the three onboarding paths (tutorial/quickstart/setup --quick --yes). - Wheel-bundling fix —
pyproject.toml’s manifest now uses atemplates/*.mdglob so all bundled templates (including Common Paper Mutual NDA v1.0) ship in the wheel. The previous per-file allowlist silently omitted templates. - Sandboxed web demo under
web/with one-click deployment to Railway / Fly.io / Render. Stdlib-only Python service wrapping the CLI behind three browser flows (draft / review / negotiation simulator). Per-session UUID sandboxes auto-expire after 30 minutes. - Doc reorg adopted — new top-level
AGENTS.md,docs/setup/(per-LLM-provider setup: Anthropic, OpenAI, Ollama, OpenAI-compatible, plusintegrations.jsonhooks for handing off todocx2pdf-cliandsign-cli), anddocs/reference/for concept deep-dives (policy, stance, fatigue, scoring, state-file, exit codes, LLM data-flow). README trimmed from 619 to 280 lines.
Install: clone the repo or
pipx install git+https://github.com/DrBaher/nda-review-cli.git. PyPI publishing is being set up — once enabled,pipx install nda-review-cliwill fetch the latest release directly. - sign-cli v0.6.1 May 15, 2026 releasepadesverification
sign-cli v0.6.1 — `pdf inspect` for ANY signed PDF + pre-sign visibility + verify `--recipient`
A small, focused release that closes three real-world gaps surfaced in production signing flows.
sign pdf inspect— new top-level command that inspects PADES signatures on any signed PDF (yours, Adobe’s, DocuSign’s, Dropbox Sign’s, SignWell’s). Returns per-signature signer CN/email, cert subject + issuer, validity window, fingerprint, trust label (self_signed_local/self_signed_other/ca_signed/unknown), message-digest match, and parse warnings. Pure read — no DB interaction, no audit events. Pairs withrequest verify-signed-pdf(which adds request-level signer-match against the local DB); usepdf inspectwhen you don’t have a request to bind against — e.g. inspecting an incoming counterparty PDF. Companion: new MCP toolpdf_inspect_signaturesand HTTP routePOST /v1/pdf/inspect-signatures— samevalidateDocumentPathguard as the other PDF surfaces.- Pre-sign signature visibility —
signer fetch-document(CLI + MCPsigner_fetch_document+ HTTPPOST /v1/signer/fetch-document) now includes anexistingSignaturesfield in every response. Fields:count,hasSignature,allDigestsOk(false if any prior signature is broken — tamper or parse failure),signers[](subject / issuer / validity / fingerprint / trust / per-signer digestOk),warnings[]. So a signer fetching a PDF for countersignature can see what they’re about to countersign before they sign. Best-effort: if inspection throws on a malformed PDF, the field is populated with a degenerate summary plus a warning rather than failing the fetch. request verify-signed-pdf --recipient <email>— narrows thesigner_matchcheck to a single recipient instead of requiring the full persisted-signer roster. Mirrors the semantics ofrequest show --recipient. Useful mid-flight on multi-signer requests (verify Alice’s signature without failing because Bob hasn’t signed yet). Refuses unknown recipients withSIGNER_NOT_RECIPIENTrather than silently passing on vacuous truth.
Fixed#
request verify-signed-pdfno longer falsely reportssigner_mismatchagainst per-signer certs whose subjects contain RFC 4514 escapes — Node’sX509Certificate.subjectreturns the LDAP DN string, which backslash-escapes reserved chars (+,<,>,,). A per-signer cert subject likeCN=Baher Test \<baher\+dcc@example.com\>was being compared with a rawsubject.includes("baher+dcc@example.com")and failing — even though the signature was cryptographically valid (digest_ok: true). The matcher now strips backslash escapes before the substring check. Surfaced by a real-world signing test against GBrain agreements on 2026-05-14.
Docs#
- The doc reorg adopted across the three-CLI suite this week is captured in this release block too — new top-level
AGENTS.md,docs/setup/for provider-specific setup (Dropbox / DocuSign / SignWell / embedded), anddocs/reference/for concept docs (audit-chain, exit-codes, profiles, security model, security controls, legal posture, architecture, comparison).
Install:
npm i -g sign-clionce the npm publish lands (see release notes for the workflow state). - sign-cli v0.6.0 May 14, 2026 releasemcpsecurityprofiles
sign-cli v0.6 — cross-surface parity, profiles, path-traversal guards
The biggest
sign-clirelease since the offline PAdES signer landed.- Cross-surface parity. Every operationally-useful CLI command now exists as both an MCP tool and an HTTP route. The MCP surface grew from 8 to 19 tools (added:
pdf_detect_signature_field,pdf_detect_date_field,pdf_inspect_signatures,profile_list,profile_show,pdf_stamp_text,preview,document,signer_reissue_token,audit_scan,request_receipt). The HTTP surface grew to 20 routes under/v1/*, all with the same input shape, the same path-traversal guards, and the same read-only gating. - Named profiles.
sign profile init / list / show / use / set / unset / deletebundlesprovider,dbPath,strictProvider, and acredentialsblock under a name. Credentials use{{env:VAR}}references that resolve from the shell at call time — secrets never live in the profile file. Activate via--profile prod,SIGN_PROFILE=prod, or implicitly via a project-levelsign-profile.json(git/npm-style upward-walk discovery). - Path-traversal guards on every input and output.
validateDocumentPath/validateOutputPathreject paths that escape the working directory; opt out withSIGN_ALLOW_ABSOLUTE_DOCS=1. Closes the gap where a malicious or buggy MCP client could read arbitrary files viapdf_pathor write sealed PDFs anywhere on disk. - One-shot
sign document. Takes a.docx(or.pdf), converts via the bundleddocx2pdf-cli, auto-places, stamps, PAdES-seals, and verifies the chain — all in one call against a scoped temp database that’s deleted on exit. sign previewfor offline placement iteration. Stamps a signature image or rendered name onto a PDF without producing a PAdES envelope or touching the DB. Surfaces the same quality warnings (STAMP_OFF_PAGE,STAMP_OVERLAPS_TEXT) as the sealed flow.- Auto-place with multi-candidate selectors.
--auto-placeacceptstrue,first,last,all,page:N, orindex:N. Closes theAUTO_PLACE_AMBIGUOUSfoot-gun where the user knew the rule but had no way to tell the CLI. - Date detection +
pdf stamp-text. Detection now recognizes date anchors alongside signature anchors (English, French/EU conventions).sign pdf detect-date-fieldreturns ranked date candidates with analreadyFilledflag;sign pdf stamp-textstamps plain text without an envelope. Skips already-filled anchors by default. - Aspect-ratio preservation on visible-signature stamps (default ON). Shrink-to-fit instead of stretching. PNG inputs gain
--signature-image-auto-crop trueto trim white margins and replace near-white with transparent. Pure-JS PNG decoder, no native deps. sign doctor preflight. Structured per-check report: Node version, DB-path writability, provider env vars, provider API reachability, filesystem permissions. Exit0ok,1any failed. Branch onchecks[].namefor agent self-recovery.sign workflow nda. Renders the bundled mutual-NDA template into a PDF and creates a signing request in one shot. Method-consent clause baked in per the legal-posture guide. Missing placeholders surface in one error before any PDF is written.- Trust labels in signed-PDF inspection.
request verify-signed-pdfadds atrustfield per signer:self_signed_local,self_signed_other,ca_signed,unknown. Structural and descriptive — no trust-store lookup, no expiry check. - Extended audit export bundles.
audit exportemitsbundleVersion: 2:audit.json+signed.pdf+original.pdf+manifest.json+README.md+receipts/<signer-email>.json(per-signer event subsets, isolated).request receiptstill emits the cryptographically-signedbundleVersion: 1with detachedmanifest.sig+manifest.cert.pem. STORAGE_UNWRITABLEstructured error.openDatabasewrapsEACCES/EROFS/EPERMinto aSignCliErrorwith a code, message, and hint pointing atSIGN_DB_PATH,~/.sign-cli/, or a profiledbPath. Replaces a raw Node stack trace with an agent-actionable envelope.- Strict provider mode.
--strict-provider true(orSIGN_STRICT_PROVIDER=true) rejects mismatches between the resolved provider and a request’s persisted provider withSTRICT_PROVIDER_MISMATCH. Every command prints[sign] resolved provider: <provider> (<source>)to stderr on start so you can see what’s about to talk to whom.
Full notes in CHANGELOG.md.
- Cross-surface parity. Every operationally-useful CLI command now exists as both an MCP tool and an HTTP route. The MCP surface grew from 8 to 19 tools (added:
- site v0.3.0 May 10, 2026 site
Site v0.3 — search, OG images, comparison page, embedded demo
A meaningful round of site polish. Headline things:
- Search. Press
⌘K(orCtrl+Kon Linux/Windows) anywhere to open a Pagefind-backed instant search. Indexes every page at build time. - Real OG images. Per-page PNGs generated at build via
satori+@resvg/resvg-jsusing bundled fonts. Twitter, LinkedIn, and Slack previews now look intentional. - Embedded demo. The
nda-review-clipage now renders the live Railway sandbox in an inline frame so people can try it without leaving the page. - Comparison page. New
/comparepage — honest table of where the CLIs win versus SaaS contract suites and where SaaS still wins. - Live version badges. Each tool card and tool page shows the latest published version, fetched at build time from npm or PyPI (with a repo
pyproject.tomlfallback). - Sitemap + robots. Standard SEO basics added, including a
sitemap-index.xml. - Changelog. This page exists now.
- Search. Press
- site v0.2.0 May 9, 2026 site
Site v0.2 — dark mode, asciinema demos, animated workflow
The first big polish pass.
- Dark mode with system-preference detection plus a manual toggle.
- Animated workflow diagram — traveling dots flow across the arrows in sequence.
- Asciinema demo casts on each tool page (
quickstart,negotiate,sign-cli demo,docx2pdf doctor + batch). - Copy-to-clipboard buttons on every code block.
- Install-method tabs — pipx/pip/source for Python, npm/pnpm/yarn/npx for Node.
- Try-it-in-browser panels linking to the live sandboxes.
- Hover micro-interactions on tool cards and reveal-on-scroll on workflow steps (respects
prefers-reduced-motion).
- sign-cli v0.5.0 May 7, 2026 releasemcpagent
sign-cli v0.5 — agent-as-signer, MCP stdio server, structured errors, cryptographic receipts
The release that made
sign-clifirst-class for agents. Same per-signer-token asymmetry that gates the human-in-the-loop signing gesture — but now expressed across MCP, declarative policy, structured errors, and the self-documenting catalog.- Agent-as-signer flow for
--provider local.sign sign,signer list,signer fetch-document,signer decline— all gated by per-signer token authentication. Pre-sign safety checks (--require-hash,--require-title,--require-signer-email) throw with structured error codes before any state mutation. New audit events:request.signed_by_signer,request.signer_declined,request.signer_fetched_document. - MCP stdio server (8 tools).
sign mcp serveexposessigner_list,signer_fetch_document,sign,signer_decline,request_show,request_status,request_watch,audit_verifyover JSON-RPC 2.0. Plus three resource shapes:request://<id>snapshot,request://<id>/documentPDF blob,request://<id>/auditchain.request_watchstreamsnotifications/progresswhen the client supplies aprogressToken. Tool args validated against each tool’sinputSchema. - Structured error envelopes.
{ ok, error: { code, message, hint?, details? } }on stderr with stablecodevalues (TOKEN_EXPIRED,PRE_SIGN_HASH_MISMATCH,NON_LOCAL_PROVIDER, …). Toggle to plain text viaSIGN_ERROR_FORMAT=text. - Enriched
request show. AddssignedBy[],declinedBy, per-approvaltokenHint/expiresAt/expired/signed, and anextSteps[]array of suggested commands. - Token recovery.
signer reissue-tokenmints a fresh token in place of an expired/lost one.signer listnow includestokens[]withexpiresAt/expired/expiresSoon. - Spec-file requests.
request create --spec ./request.json [--param key=value]lets a single template be reused across counterparties with variable substitution. - Declarative signer policy.
signer policy run --spec ./policy.json [--dry-run true]andsigner policy run-all --tokens-file …. Two-layer model: non-negotiable expectations (titleMatches,documentSha256,signerEmail) + first-match-wins rules (sign/decline/report). - Cryptographic receipts.
request receipt --request-id <id> --out ./receipt/produces an audit-export bundle plus a detachedmanifest.sig+manifest.cert.pemthat openssl can verify directly. - Per-signer PAdES identity. Each signer gets a stable on-disk RSA-2048 key/cert keyed by email.
signedBy[]entries now carrycertFingerprintSha256+certSubjectCommonName, so multi-party requests have cryptographically distinguishable per-signer identities at the audit-chain level. - Cross-provider
signedByparity. Newsigner_signing_statestable fed by both local sign/decline and Dropbox/SignWell webhook ingestion.request showfor hosted-provider requests now returns a populatedsignedBy[]instead ofnull. - Webhook notifications.
SIGN_LOCAL_NOTIFY_URLfires fire-and-forget JSON POSTs on allow-listed audit events (request.signed_by_signer,request.signer_declined,request.final_pdf_downloaded, …). - Self-documenting CLI.
sign --help(grouped index),sign <cmd> --help(focused per-command),sign --catalog json(machine-readable index),sign examples(7 curated walkthroughs),sign --version,sign mcp tools(catalog without booting the server). - Shell completion.
sign completion bash|zsh|fish.
- Agent-as-signer flow for
- docx2pdf-cli v0.2.1 May 5, 2026 releaseagentdoctor
docx2pdf-cli v0.2 — agent-first framing, capabilities flag, smarter doctor
The agent-integration release. v0.2.0 made the agent affordances first-class; v0.2.1 polished the onboarding path when no backend is installed.
--capabilities. Machine-readable feature flags — backend availability, supported flags, capability spec version, tool version, backend fidelity map, strict-fidelity policy hints. An agent can introspect what this binary can do without parsing prose.- AGENTS.md + llms.txt + agent-defaults.json. Default-routing guidance so coding/automation agents can treat
docx2pdf-clias the default DOCX→PDF tool.docs/AGENT_INTEGRATION.mdcovers wire-up.examples/agent-defaults.jsonships the recommended defaults for agent invocations. - JSON Schemas under
schemas/. Formal schemas for agent metadata and capability output. Lets agents validate the contract before relying on it. - Smarter onboarding when no backend is installed. The “no conversion backend” error gets a platform-specific recommendation and per-backend install commands inline. If Docker is detected, leads with
docker run gotenberg/gotenberg:8so the user doesn’t need to install LibreOffice (~700MB). --doctorJSON enriched with actionable setup data. Addsplatform(darwin/linux/win32),platformKey(linux-apt,linux-dnf, …),tools.docker/tools.unzip/tools.fcList, abackends[name]object withavailable/fidelity/reason/install(platform-specific install command), and a top-levelrecommendationfield — single best next step for this host.CliError.kind. Optionalkindproperty (e.g."NO_BACKEND") on error envelopes, so library callers branch on error type instead of message text.commandExistsswitched fromsh -lctosh -c. The login shell was reading user init files and rebuildingPATH, sometimes returning probes for commands thatspawn()couldn’t actually find.- npm keyword + allowlist updates.
docx2pdf,ai-agent,automationadded to keywords. Agent docs and examples now ship in the npm tarball.
Recommended defaults for agent invocations:
docx2pdf --strict-fidelity --json --out-dir ./pdfs *.docx - nda-review-cli v0.5.0 May 5, 2026 releasenegotiation
nda-review-cli v0.5 — fatigue concession, web demo, profile learning
Headline release for the negotiation engine.
- Fatigue concession. When a clause bounces past
max_clause_bounces(default 4), the next proposer is force-conceded deterministically. Solves the conservative-vs-conservative stalemate without resorting to randomness. - Counterparty profile learning. Pass
--learn-profileon a review and the CLI builds a per-counterparty stance profile from the patterns it sees. Next round, that profile is applied automatically. - Web demo in
web/. A sandboxed Flask-style server that exposes the three headline flows (draft, review, negotiate-simulator) for trying without installing. - Stalemate detection still trips on hard non-negotiable conflicts and surfaces them for human escalation rather than auto-resolving.
- Fatigue concession. When a clause bounces past
- sign-cli v0.4.0 April 22, 2026 releasepadesrfc3161
sign-cli v0.4 — offline PAdES signer, RFC 3161 anchors, SignWell + embedded signing
The release that turned
sign-cliinto a complete signing tool you can use without signing up for anything.- Built-in offline PAdES signer.
--provider localproduces real PKCS#7 signed PDFs in/ByteRange, with a self-issued X.509 cert.request verify-signed-pdfre-parses the file, recomputes the digest, and validates the chain end-to-end. Zero signups, no API keys, no third-party SaaS. Suitable for internal docs, CI / testing, and anywhere you don’t need an external trust anchor. - RFC 3161 timestamping.
audit timestampanchors the head of the hash-chained audit log against a public Timestamp Authority. Durable evidence that an event existed by a given date — survives even if the signing provider disappears later. - SignWell provider. Email send, embedded signing, and webhook ingest. Joins Dropbox Sign and DocuSign in the multi-provider surface. Same primitives, same audit behavior across all three.
- Embedded signing across all hosted providers.
request send --embedded,launch-embedded, and signer-sidesign-urlgeneration for browser-based signing UIs (HelloSign Embedded JS for Dropbox; DocuSign recipient view withclientUserId; SignWell embedded). Final PDF retrieval viafetch-finalregardless of which provider sent it. - Webhook ingest + verification. Per-provider webhook endpoints on
sign servecapture status transitions and persist them into the audit chain, sorequest showreflects current state without polling. - PKCS#7 inspection.
request verify-signed-pdfparses the embedded PKCS#7, extracts X.509 signer certificates (subject + issuer + validity + fingerprint + serial), and reports per-signer details an auditor can use. - Bulk CSV sends.
request bulk --csv roster.csv— send the same document to many signers, or many documents to one signer, from a single CSV file. NDJSON output per row for streaming consumers. doctor providerscapability matrix. Per-provider readiness probe: env vars present, API reachability, embedded support, webhook configuration.- Production hardening. Input validation across every flag (path traversal, email shape, return-URL safety, payload sizes). Secret redaction in error envelopes + HTTP debug logs. Idempotent
request send— refuses to double-send unless--force true.db backup/db verifywith SQLite WAL mode.
- Built-in offline PAdES signer.