SIGN IN SIGN UP

fix(config): run an EDITOR that carries arguments (#1878)

* fix(config): run an EDITOR that carries arguments

config edit passed the whole EDITOR/VISUAL value to spawn as the program
name with shell: false, so common settings such as `code --wait` failed
with ENOENT, and the uncaught rejection printed a raw Node stack trace.

Run the value the way git does: through sh -c '<editor> "$@"' with the
config path as a positional argument, and through cmd.exe on Windows so
.cmd shims resolve. A value that is itself the absolute path of an
existing file still runs directly, so unquoted paths with spaces keep
working. A failed start, a non-zero exit or a signal is now reported as
a one-line error and the command exits 1.

* fix(config): split EDITOR into argv instead of running a shell

Run the editor without a shell. The EDITOR or VISUAL value is split into a
program and arguments (double quotes everywhere; single quotes and backslash
escapes on POSIX; literal backslashes on Windows) and the config path is
appended as its own argument, spawned via cross-spawn with shell: false so
Windows .cmd shims such as code.cmd still resolve. Shell metacharacters in
the value are now inert.

Show the install hint only when the program is missing (ENOENT), not for
EACCES or EPERM. Move the EDITOR documentation from legacy docs/cli.md to
docs-lab/reference/cli.md.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

---------

Co-authored-by: Clay Good <hi@claygood.com>
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
D
Dwin Gharibi committed
2ef6fbde3da95f6e471bcb504d13711308091be0
Parent: 9f8dec5
Committed by GitHub <noreply@github.com> on 9/16/2026, 3:47:38 PM