Skip to content
Apothem
CLI reference

diff

CLI reference for the apothem diff command.

Preview the pending configuration changes for a single harness.

Synopsis

apothem diff --harness NAME [--profile PATH] [--project PATH]
             [--quiet|-q] [--verbose|-v]
             [--format plain|json] [--json] [--no-color]

diff is a read-only inspection command. It runs the same materialization the install command would run, but in dry-run mode — nothing is written to disk. For each pending target it renders a plain-language action (for example Write file, Merge directory, Install skills, or Prune stale files), the target path, a preview status (would create, would update, would remove, or no change), and — for operator-owned anchors that would be merged — the unified diff of the change. The status is computed by comparing the source against the current on-disk target, so an already-matching target reads no change and is hidden from the default view. It is the answer to "what would apothem install do to this harness right now?" without making the change.

The plan covers every path the install writes: the manifest entries, the harness's own config file (for example opencode.json or config.yaml), the instruction anchor or profile document the shared profile is projected into (such as CLAUDE.md), and the shared data stores under .apothem/. Right after an install, diff reports no pending change; a re-install then writes nothing and takes no new backup. install --dry-run shows the same plan.

For the adapters that write skills to your home directory, the plan lists those folders with their home paths, ahead of the project files, and a skill folder that Apothem did not write appears as a skill_conflict warning.

For operator-owned targets — files that carry both your own content and an Apothem-managed block — the diff shows the exact lines that would change. For other targets, the planned action and preview status are summarized.

The default view lists only pending changes. Pass --verbose to see the full plan, including unchanged targets, annotated with the raw internal operation kind and outcome. The --json envelope is unaffected by the display layer: it always carries the raw operation and outcome fields for machine consumers.

diff operates on a single harness. Unlike install or verify, it does not accept all; pass one harness name.

Options

OptionDescription
--harness NAMEHarness adapter to preview (required; single harness, not all).
--profile PATHPath to shared profile YAML. Defaults to ~/.config/apothem/profile.yaml.
--project PATHProject root for project-scope harnesses. Required when the selected harness is project-scope.
--quiet, -qSuppress informational output; only errors are emitted.
--verbose, -vShow the full plan, including unchanged targets, annotated with the raw operation kind and outcome.
--format plain|jsonOutput format (default: plain).
--jsonShorthand for --format json.
--no-colorDisable ANSI color codes in output.
-h, --helpShow help and exit.

JSON output

The --json envelope mirrors the dry-run install envelope. status is dry_run, files_written is always empty, and the materialization block plus the results list carry the full planned-target detail. Each operator-owned result row's detail.diff field carries the unified diff string.

{
  "schema_version": 1,
  "status": "dry_run",
  "command": "diff",
  "action": "dry_run",
  "harness": "claude-code",
  "files_written": [],
  "results": [
    {
      "harness": "claude-code",
      "outcome": "updated",
      "operation": "sentinel_merge",
      "path": "C:\\Users\\Example\\.claude\\CLAUDE.md",
      "message": "dry run: no filesystem changes made",
      "detail": {
        "ownership_class": "operator-owned",
        "diff": "--- a/CLAUDE.md\n+++ b/CLAUDE.md\n@@ ..."
      }
    }
  ],
  "warnings": [],
  "error": null,
  "materialization": { "...": "..." }
}

Examples

apothem diff --harness claude-code
apothem diff --harness cursor --project .
apothem diff --harness claude-code --json

Exit codes

CodeMeaning
0Diff reported (pending changes are reported, not an error)
1Expected validation, profile, harness, or project error
64Usage error: an unknown option or command, or a missing or invalid option value. Under --json the error is a JSON envelope with code cli.usage.

See also

On this page