Use when changing an engine-wide config value — currently `diff.tool`, the command `/skill-engine:review` prints for inspecting a proposed-vs-live diff.
Installs into .claude/skills of the current project.
Are you the author of Config Set?
Add the live security badge to your README. It updates with every re-scan.
[](https://www.skillsdirectory.com/skills/nick-railsback-config-set)
---
name: config-set
description: Use when changing an engine-wide config value — currently `diff.tool`, the command `/skill-engine:review` prints for inspecting a proposed-vs-live diff.
---
# Config set
Persist an engine-wide configuration value. The single key the engine reads today is `diff.tool` — the command `/skill-engine:review` prints when surfacing how to inspect a proposed-vs-live diff. The default value is `git diff --no-index --color`; users with a preferred diff tool override it once and the choice persists across sessions.
## Argument shape
`/skill-engine:config-set <key> "<value>"`
Example invocations:
```
/skill-engine:config-set diff.tool "delta"
/skill-engine:config-set diff.tool "git diff --no-index --color"
/skill-engine:config-set diff.tool "code --diff"
```
The `<value>` is taken verbatim; quote it so shell-splitting does not eat embedded spaces. The engine does not validate that the configured command exists on the user's PATH — that is the user's responsibility. A misconfigured command surfaces as a runtime failure when `/skill-engine:review` prints it and the user runs it.
## Resolution of the config file
The config file lives at `$CLAUDE_PLUGIN_DATA/config.json`. The directory is created if absent.
When `$CLAUDE_PLUGIN_DATA` is unset, surface:
```
$CLAUDE_PLUGIN_DATA is unset. The engine's plugin-data tree is not reachable from this shell. Run the skill from a Claude Code session where the plugin is installed, or set $CLAUDE_PLUGIN_DATA to the engine's plugin-data directory.
```
Exit non-zero. Do not write a config file to a fallback location — the engine's other surfaces (`/skill-engine:review`) key off `$CLAUDE_PLUGIN_DATA`, and writing to a different path would create a config that the readers never find.
## The write
Read the existing `config.json` (or initialize an empty object if absent). Merge the new key/value into it, preserving any other keys present. Write back with `schema_version: 1` if not already set.
Example file shape after `/skill-engine:config-set diff.tool "delta"`:
```json
{
"schema_version": 1,
"diff.tool": "delta"
}
```
The flat key shape (`diff.tool` as one string, not nested) keeps the file shallow and matches the argument the user typed. Future keys (`diff.binary`, `cache.location`, etc.) follow the same shape.
## Exit message
```
Set diff.tool = "<value>" in $CLAUDE_PLUGIN_DATA/config.json.
```
## What this skill does NOT do
- It does not list current values. A separate `config-list` skill would be the symmetric surface; it is out of scope for the v0.3.0 review workflow.
- It does not unset values. Hand-edit `config.json` to remove a key, or set it back to the engine default.
- It does not validate the diff tool against the user's shell environment. The engine treats `<value>` as opaque.
- It does not gate keys against a schema. Any `<key>` accepted by the argument parser is written; readers (`/skill-engine:review`) read the keys they know and ignore the rest.
- It does not enforce read-only-ness on user-configured diff tools. The doctrine constraint "no engine git mutations" binds the engine, not user config (the `git.readonly` lint codifies engine-codebase read-only-ness).