Skip to content

diffr: update or remove diffr and its plugins with upgrade and uninstall - #1057

Closed
sidkmenon wants to merge 2 commits into
sm/diffr-install-shfrom
sm/diffr-upgrade
Closed

sidkmenon wants to merge 2 commits into
sm/diffr-install-shfrom
sm/diffr-upgrade

Conversation

@sidkmenon

@sidkmenon sidkmenon commented Oct 9, 2026 •

Copy link
Copy Markdown
Contributor

diffr: keep what config init installs in its own module

The agents, their plugin commands and the install record move from
init.rs to install.rs, so upgrade and uninstall can use them
without going through the prompts. No change in behavior.

diffr: update or remove diffr and its plugins with upgrade and uninstall

Both commands work the way diffr was installed, which they read from
where the binary is, as opencode upgrade does:

  • Homebrew (a Cellar/diffr path): brew upgrade or brew uninstall
    devdotfast/tap/diffr.
  • Cargo (the Cargo bin directory): cargo install or cargo uninstall
    diffr-cli.
  • Inside node_modules: refuse. That diffr came with an app, such as
    Whiteboard, which updates it.
  • Anywhere else: install.sh from install.dev.fast into the binary's
    directory, or remove diffr and diffr-tui from it.

install.sh asks the setup questions only when no diffr was in its
directory before, so an upgrade through it doesn't ask them again.

After the upgrade, each agent in the install record updates its plugin.
diffr uninstall removes those plugins first, then the record, then
diffr; a failed plugin removal stops it with diffr in place.
~/.config/diffr stays, because Whiteboard reads it too.

https://claude.ai/code/session_01LYrgBPQFAiQVjNV6D7UkQv

@sidkmenon
sidkmenon added this pull request to stack #1055 October 9, 2026 01:03
@sidkmenon sidkmenon changed the title sm/diffr upgrade diffr: update or remove diffr and its plugins with upgrade and uninstall Oct 9, 2026
@sidkmenon
sidkmenon force-pushed the sm/diffr-install-sh branch from 24a75f5 to f9af9e5 Compare October 9, 2026 02:40
@sidkmenon
sidkmenon removed this pull request from stack #1055 October 9, 2026 02:40
@sidkmenon
sidkmenon added this pull request to stack #1060 October 9, 2026 02:40
@sidkmenon
sidkmenon removed this pull request from stack #1060 October 9, 2026 02:40
@sidkmenon
sidkmenon force-pushed the sm/diffr-install-sh branch from f9af9e5 to d1853ee Compare October 9, 2026 04:06
@sidkmenon
sidkmenon force-pushed the sm/diffr-upgrade branch 2 times, most recently from 02a12b4 to 6e72dc9 Compare October 9, 2026 04:08
@sidkmenon
sidkmenon force-pushed the sm/diffr-install-sh branch from d1853ee to 6545169 Compare October 9, 2026 04:09
The agents, their plugin commands and the install record move from
init.rs to install.rs, so `upgrade` and `uninstall` can use them
without going through the prompts. No change in behavior.

Claude-Session: https://claude.ai/code/session_01LYrgBPQFAiQVjNV6D7UkQv
Agent-Session: 01a11aca-5007-7b80-ad35-c0a0f746a05d
Agent-Session: ec5d2c35-3045-44f3-9c41-ba4378797c8e
Agent-Session: 01a11ded-d896-7251-bf8f-c71bf07fd283
Agent-Session: 01a11e03-81df-7d63-bfa5-953f535444d2
Agent-Session: 01a11e0a-d042-71d2-9bc9-ac7b652487d1
Agent-Session: b5985b3c-e5d2-4bb4-b6ac-7fec168d8328
Agent-Session: 7ba69deb-2039-47e6-900f-0f30a79e167a
Agent-Session: 01a11ecf-aa86-7a81-a5e6-c5dfe72d48eb
…nstall`

Both commands work the way diffr was installed, which they read from
where the binary is, as `opencode upgrade` does:

- Homebrew (a Cellar/diffr path): `brew upgrade` or `brew uninstall`
  devdotfast/tap/diffr.
- Cargo (the Cargo bin directory): `cargo install` or `cargo uninstall`
  diffr-cli.
- Inside node_modules: refuse. That diffr came with an app, such as
  Whiteboard, which updates it.
- Anywhere else: install.sh from install.dev.fast into the binary's
  directory, or remove diffr and diffr-tui from it.

install.sh asks the setup questions only when no diffr was in its
directory before, so an upgrade through it doesn't ask them again.

After the upgrade, each agent in the install record updates its plugin.
`diffr uninstall` removes those plugins first, then the record, then
diffr; a failed plugin removal stops it with diffr in place.
~/.config/diffr stays, because Whiteboard reads it too.

Claude-Session: https://claude.ai/code/session_01LYrgBPQFAiQVjNV6D7UkQv
Agent-Session: ec5d2c35-3045-44f3-9c41-ba4378797c8e
Agent-Session: b5985b3c-e5d2-4bb4-b6ac-7fec168d8328
Agent-Session: 01a11ded-d896-7251-bf8f-c71bf07fd283
Agent-Session: 7ba69deb-2039-47e6-900f-0f30a79e167a
Agent-Session: 01a11ecf-aa86-7a81-a5e6-c5dfe72d48eb
@sidkmenon

Copy link
Copy Markdown
Contributor Author

Folded into #1066, which carries these commits rebased onto main beneath #1019.

@sidkmenon sidkmenon closed this Oct 9, 2026
sidkmenon added a commit that referenced this pull request Oct 9, 2026
One command installs diffr and its Claude Code plugin:

```sh
curl -fsSL https://install.dev.fast/diffr | sh
```

Commit by commit:
- **`DIFFR_CONFIG_DIR`**: a host such as Whiteboard can keep its own
diffr config file. Without the variable, diffr reads the same file as
before.
- **`--help` guides**: `diffr --help` ends with a guide for agents
(`docs/agents.md`), and `diffr config --help` with the plugins guide
(`docs/plugin.md`). `-h` stays short. An agent runs `diffr --help` in
its shell, so what it reads always matches the installed diffr.
- **`diffr config init`**: in a terminal, asks which agents get the
diffr plugin and which provider writes summaries, and asks for a key
only when neither the config nor the environment has one. Without a
terminal, `config init --json` prints the questions and a schema, and
`config init --json ANSWERS` applies them; the key never goes through
`--json`. Claude Code is the only agent: `claude plugin install
diffr@devfast` after adding or updating the devfast marketplace, the
same marketplace Whiteboard's plugin uses. Installed agents are recorded
in `$XDG_STATE_HOME/diffr/install.json`, outside the synced config
directory.
- **`install.sh`**: finds the newest `diffr/X.Y.Z` release (or
`DIFFR_VERSION`), checks the archive against the release's SHA256SUMS,
installs diffr and diffr-tui in `DIFFR_INSTALL_DIR` (`~/.local/bin` by
default), then runs `diffr config init` on a first install.
- **Install module**: what `config init` installs moves to `install.rs`,
so `upgrade` and `uninstall` use it without the prompts. No behavior
change.
- **`diffr upgrade` and `diffr uninstall`**: work the way diffr was
installed, read from where the binary is (Homebrew, Cargo, inside
`node_modules`: refuse, otherwise install.sh). After an upgrade, each
recorded agent updates its plugin. `uninstall` keeps `~/.config/diffr`,
which Whiteboard shares.
- **Docs**: the plugins guide for agents, the man page's commands, files
and environment, and a README that leads with the install script.
- **Summaries**: `config init` asks yes or no for pseudocode summaries,
then the provider, then its key.
- **PATH and failures**: install.sh offers to put diffr on PATH and
points install failures at the issue tracker.
- **Steps**: setup shows each step as it runs.

## Before the install route goes live
- Release `diffr/0.1.18` after this and #1019 merge. install.sh installs
the newest `diffr/*` release; 0.1.17 has no `config init` or `upgrade`,
and the plugin needs 0.1.18.
- Then merge Fix-Fast/dev#1119, which points `install.dev.fast/diffr` at
`diffr/install.sh` on main.

## Testing
- `cargo fmt --check` and `cargo test`, including the CLI tests for
`DIFFR_CONFIG_DIR`, the `--help` guides, `config init --json`, `upgrade`
and `uninstall`.

Replaces #1039, #1040, #1054, #1056, #1057 and #1063.

Stack: #1065 → #1066 → #1019 → #1023 → #1024 → #1025 → #1026

https://claude.ai/code/session_01HNbERuYJjvvAjBN19zEDbo
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant