Add -e/--edit flag: open config file in $EDITOR
New module src/editor.ts handles the flag end-to-end:
- editorCommand(editor, path) returns the sh -c argv that lets the
shell tokenize multi-word $EDITOR values like 'code --wait'.
Extracted so editor.test.ts can verify construction without
actually launching an editor.
- editConfig(path) checks $EDITOR is set, checks the target file
exists, spawns 'sh -c <editor> "$@" -- <path>' with stdio
inherited, and exits with the editor's status code.
Refuses (CliError -> exit 2) when:
- $EDITOR is unset or empty.
- The target config file doesn't exist. (Same recovery hint as
elsewhere: 'run move once or reinstall'.)
src/cli.ts adds the flag to the parser and printHelp(). src/move.ts
dispatches it after --version and before config-load. Resolution
mirrors the loader: --config <path> wins, else defaultConfigPath().
8 new tests in src/editor.test.ts cover the pure helper and both
refusal paths; the spawn success path is verified via manual
'EDITOR=true move -e' (would otherwise kill the test process).
README Usage block, Configuration section (new Editing subsection),
and Files table all updated to match.
This commit is contained in:
@@ -84,6 +84,7 @@ Usage: move [options]
|
||||
Options:
|
||||
-h, --help Show this help and exit.
|
||||
-v, --version Print version and exit.
|
||||
-e, --edit Open the config file in $EDITOR and exit.
|
||||
-C, --config <path> Load defaults from a JSON config file.
|
||||
Default path: see the Configuration section.
|
||||
-m, --move-interval <seconds> Idle time before a sweep fires. Default: 240.
|
||||
@@ -155,6 +156,24 @@ and units mirror the CLI flags exactly: `moveInterval` and
|
||||
`checkInterval` are seconds, `stepDelay` is milliseconds, `stepCount` is
|
||||
pixels, `verbose` is a boolean.
|
||||
|
||||
### Editing
|
||||
|
||||
```sh
|
||||
move -e # or --edit
|
||||
move --edit --config /path/to/another.json
|
||||
```
|
||||
|
||||
Opens the active config file in `$EDITOR` (honors flags in the value,
|
||||
so `EDITOR="code --wait"` and `EDITOR=vim` both work). Refuses with
|
||||
exit `2` if:
|
||||
|
||||
- `$EDITOR` is unset or empty.
|
||||
- The target file doesn't exist. (Run `move` once or reinstall to
|
||||
re-seed the default file.)
|
||||
|
||||
The editor's own exit code is propagated, so you can chain
|
||||
`move -e && move` to validate-by-running after every edit.
|
||||
|
||||
### Validation
|
||||
|
||||
The loader is strict:
|
||||
@@ -275,6 +294,8 @@ move --help
|
||||
| `src/cli.ts` | Argument parsing, validation, and help/version output. |
|
||||
| `src/config.ts` | `Config` type (carries every tunable, including `verbose`), `DEFAULT_CONFIG` (derived from `scripts/config.default.json`), `defaultConfigPath`, and the layered `resolveConfig` overlay. |
|
||||
| `src/configFile.ts` | Optional JSON config-file loader with strict schema validation. |
|
||||
| `src/editor.ts` | `move --edit`: opens the active config file in `$EDITOR`. |
|
||||
| `src/errors.ts` | Shared error types (`CliError`). |
|
||||
| `src/keeper.ts` | Synthetic-activity sweep and idle-watch loop. |
|
||||
| `package.json` | Bun project manifest. Single runtime dep: `@nut-tree-fork/nut-js`. |
|
||||
| `tsconfig.json` | Strict TypeScript config tuned for Bun (ESNext, bundler resolution). |
|
||||
|
||||
Reference in New Issue
Block a user