Skip to content
Diffsplain
Esc
navigateopen⌘Jpreview
On this page

Agent notes

Choose an agent, refresh its notes, or supply notes from another task.

A coding agent writes short notes for each changed file by default. Configure one with diffsplain config agent NAME, or choose one run with --agent NAME. --no-agent overrides both for a plain review. With no configured or explicit choice, Diffsplain lists usable agents in this order in an interactive terminal: Codex, Claude, Copilot, Cursor, then OpenCode. Each CLI uses its current login. The two per-run options cannot be combined.

A configured default works in non-interactive runs. If that preference is damaged, unsupported, or unavailable, Diffsplain stops instead of discovering or switching to another provider. An explicit --agent or --no-agent does not read the preference, so either can recover a run while you fix or unset it.

Access to a local checkout

Diffsplain chooses one access plan for each note run. The current checkout, --worktree, and --base REF without --head use checkout-read-only. The agent runs in the chosen repo with its normal user settings. It may inspect ignored files, Git history, and symlink targets. Diffsplain tells it not to edit files or run mutating commands. Diffsplain itself does not edit the review target. Agents run under your user permissions, and approval stays with you.

Pull requests, remote branches, and exact local ranges use snapshot-only because they may not map to the live checkout. In that mode, the agent gets only the supplied snapshot. It must not run commands, read other files, use the network, or edit anything. Pass --no-checkout-access to use this mode for any target. It limits both agent notes and review chat to the supplied snapshot.

Codex uses its read-only sandbox. Claude uses permission mode plan. Cursor uses non-interactive Ask mode, its sandbox, --trust, and --workspace. In checkout mode, those agents use the repo as their working folder. Copilot and OpenCode have no proven native read-only mode. Diffsplain warns before either gets checkout access. It does not pass automatic approval flags; approval stays with you.

Cursor Agent needs version 2026.08.11 or newer. Diffsplain runs the signed-in cursor-agent in the user’s home and does not replace HOME. Cursor still contacts its own service. An old CLI or a missing required flag stops Cursor before notes start. Once Diffsplain chooses an agent, a failed check or run ends the command; it does not switch to another agent.

Use a plain diff when you do not want notes:

npx diffsplain --no-agent

Choose an agent or control how it runs:

npx diffsplain \
  --agent codex \
  --model MODEL_NAME \
  --reasoning low \
  --fast \
  --batch-size 2

The default batch size is 12 files. Smaller batches add the first notes to the open page sooner. All supported agents accept --model; only Codex and OpenCode accept --reasoning.

Fast mode is an opt-in provider setting for Codex CLI 0.108.0 or newer and Claude Code 2.1.36 or newer. Pass --fast to apply it to every agent note and Review chat call in the run. Diffsplain checks the selected executable before the first call and stops for an older or unsupported provider. It does not change the chosen model or write a global provider setting. Provider account, model, and entitlement failures are reported as provider errors. --fast cannot be combined with --no-agent.

Ask the review agent

When a review starts with a coding agent, the note pane also has Ask agent. It starts on This file. Choose Review to ask about the whole change. The note tab stays available, so chat does not replace the file note.

Chat threads live only in the local review server’s memory. Reloading the page keeps them while that server runs. Stopping the review clears them. Each thread belongs to one review fingerprint. When the snapshot changes, Diffsplain keeps the old history as stale and asks you to start a new thread before you ask again. A short snapshot read fault keeps visible history, blocks the composer, and shows a recovery message until the review is ready again.

The page shows a running answer, lets you cancel it, and shows Retry only when the server allows a failed or cancelled question to run again. A blocked history can show Retry compaction when the server can compact it; otherwise start a new thread. Moving to another file or scope does not stop work. The page shows a small notice and a cancel control for work still running elsewhere.

Answers use Markdown and carry path and line-range citations. The page renders headings, lists, links, inline and fenced code, block quotes, and line breaks. It does not render raw HTML or images. It also drops unsafe link schemes, including javascript: and data:.

The chat endpoint accepts only the current access token from the local review page. A missing or old token cannot read or change its threads. Review-wide questions respect --exclude rules. A direct question about an excluded file may include that file, but this does not change the rules for review-wide chat.

Agent usage

Open Agent usage on the review page to see separate totals for notes and chat, plus their combined use. Counts cover provider-reported input, output, cache reads, and cache writes for this review. They do not show prices or your account-wide history.

Partial means some calls did not report use; Unavailable means none did. Missing reports do not mean zero tokens. A review that makes no agent calls reports zero input and output tokens. Reusing saved notes does not add the tokens spent creating them in an earlier run.

Exclude files from automatic notes

--exclude PATTERN controls prepared agent context. Repeat gitignore-style rules in the order you pass them. A later rule wins, and ! puts a path back in. Diffsplain tests the current path of a renamed file, not its old path.

Excluded files stay in the local snapshot and page with their full patches. Diffsplain keeps their path, metadata, patch, snippet, and prior note out of automatic agent input. It hides a cached note while the file is excluded and can reuse it only when the file returns with the same patch. If the patch changed while hidden, Diffsplain drops the note. --force does not override an exclusion. If all files are excluded, Diffsplain makes no agent request and keeps the reusable cache state.

This option is not a privacy boundary and does not change checkout access. In checkout-read-only mode, an agent can still inspect the repo. Use it to shape automatic input, not to hide a secret. With --no-agent, Diffsplain still marks matching files in the snapshot, but it starts no agent.

File limits and failed notes

Diffsplain sends a file’s full patch when it is at most 180,000 bytes. For a larger patch, it sends the short patch excerpt shown in the page. If that excerpt still makes the file input larger than 2,000,000 bytes, Diffsplain rejects the file without starting an agent for it.

A bad file note or a failed agent pass does not remove valid notes from other files. Diffsplain publishes each complete note, marks the run as failed, exits with an error, and lists each failed path and reason in meta.failedFiles. It ignores notes for paths outside the requested batch and reports those paths as failures.

Run one note pass

Generate or revise notes without starting the page:

pnpm run summarize -- --repo /path/to/repo --pr 198

The same command accepts branch, worktree, checkout, and exact-range targets. The command reuses complete notes when the file patches, agent, model, reasoning, and access mode still match. Changing those settings starts a new pass even when the patches stay the same. Pass --force to replace every non-excluded note:

pnpm run summarize -- --repo /path/to/repo --pr 198 --force

The presenter follows the same rule, so a cached review opens without a new agent pass. Use npx diffsplain --force when you want new notes.

Fast mode is not part of note cache identity. A run can reuse matching notes created with Fast mode on or off; the current Review metadata still records the mode requested for this run.

Note files

Implicit notes use one file per target in the user cache:

$XDG_CACHE_HOME/diffsplain/summaries/<target-kind>-<target-key>.json

Without XDG_CACHE_HOME, macOS uses ~/Library/Caches/diffsplain/summaries/, Windows uses %LOCALAPPDATA%\diffsplain\summaries\, and other systems use ~/.cache/diffsplain/summaries/. Worktree, checkout, branch, pull request, and range targets each get a distinct keyed file. Pass --summaries FILE to use another path.

Cache control

Saved notes use a short-lived lease while an agent writes them. A reader can still open the last complete notes. If a writer stops, its lease expires and a later run can take over. A writer that loses its lease cannot publish or remove the newer writer’s lease.

See cache location, total size, oldest entry, and active targets:

npx diffsplain cache status

Prune inactive notes by age in days or by total size in bytes. clear --yes removes inactive notes only; it keeps notes under an active lease.

npx diffsplain cache prune --age 30
npx diffsplain cache prune --size 104857600
npx diffsplain cache clear --yes

These commands manage the default note cache, not fetched Git objects or custom --summaries files outside that cache. --cache-dir selects the bare Git cache and does not change the note cache.

Note file format

The file has one change note and notes keyed by file path:

{
  "change": {
    "title": "Short change title",
    "summary": "What the whole change does.",
    "why": "Why the change is needed.",
    "highlights": ["One key result."],
    "risks": ["One point to check."]
  },
  "files": {
    "src/example.ts": {
      "title": "Short file title",
      "what": "What changed in this file.",
      "why": "Why this file had to change.",
      "details": ["One useful detail."],
      "risks": []
    }
  }
}

Missing notes get a plain fallback, so new files still appear at once.

Failed run support records

Support records are off by default. If review setup or agent notes fail, print one JSON record:

npx diffsplain --support-record

Or write it to a file:

npx diffsplain --support-record-file ./diffsplain-support.json

The file contains a new run ID, the agent and its CLI version, Diffsplain and Node.js versions, stage timings, byte counts, and the failed exit state. The stage totals cover cache access, snapshot work, agent calls, note publication, and local page startup. The export uses private file permissions.

The fixed record does not copy repo paths, file paths, prompts, patches, raw agent output, error text, credentials, or environment values. It records byte counts instead of data. A successful run writes no record. The print form goes to standard error, so the diff snapshot output stays unchanged.

Was this page helpful?