fuzzrunx 0.1.6 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -2,33 +2,34 @@
2
2
 
3
3
  Auto-correct mistyped commands/subcommands and re-run them automatically (no prompt) when the fix is high-confidence (edit distance 1 or the CLI provides a single suggestion). Base command corrections skip dangerous commands like `rm` or `mv`.
4
4
 
5
- ### Quick run
6
-
7
- ```
8
- node bin/fuzzrun.js git commmmit -m "msg"
9
- ```
10
-
11
- Install (npm):
12
-
13
- ```
14
- npm i -g fuzzrunx
15
- ```
16
-
17
- On install, FuzzRun auto-enables shell hooks and will print:
18
- `FuzzRun is automatically enabled. Run "fuzzrun disable" to deactivate.`
19
-
20
- If you want to skip auto-enable, set `FUZZRUN_SKIP_ENABLE=1` during install.
21
- If auto-enable didn't run (scripts disabled or local install), running any command with `fuzzrun` will attempt a one-time auto-enable unless `FUZZRUN_SKIP_ENABLE=1` is set.
22
-
23
- ### Bash/Zsh hook (auto-run on typos)
24
-
25
- Add to your shell rc:
26
-
27
- ```bash
28
- FUZZRUN_BIN="/absolute/path/to/bin/fuzzrun.js"
29
- fuzzrun() { node "$FUZZRUN_BIN" "$@"; }
30
- command_not_found_handle() { fuzzrun "$@"; }
31
- git() { fuzzrun git "$@"; } # optional: wrap git to auto-fix subcommands
5
+ ### Quick run
6
+
7
+ ```
8
+ node bin/fuzzrun.js git commmmit -m "msg"
9
+ ```
10
+
11
+ Install (npm):
12
+
13
+ ```
14
+ npm i -g fuzzrunx
15
+ ```
16
+
17
+ On install, FuzzRun auto-enables shell hooks and will print:
18
+ `FuzzRun is automatically enabled. Run "fuzzrun disable" to deactivate.`
19
+
20
+ If you want to skip auto-enable, set `FUZZRUN_SKIP_ENABLE=1` during install.
21
+ If auto-enable didn't run (scripts disabled or local install), running any command with `fuzzrun` will attempt a one-time auto-enable unless `FUZZRUN_SKIP_ENABLE=1` is set.
22
+ On uninstall, FuzzRun automatically removes its shell hooks.
23
+
24
+ ### Bash/Zsh hook (auto-run on typos)
25
+
26
+ Add to your shell rc:
27
+
28
+ ```bash
29
+ FUZZRUN_BIN="/absolute/path/to/bin/fuzzrun.js"
30
+ fuzzrun() { node "$FUZZRUN_BIN" "$@"; }
31
+ command_not_found_handle() { fuzzrun "$@"; }
32
+ git() { fuzzrun git "$@"; } # optional: wrap git to auto-fix subcommands
32
33
  ```
33
34
 
34
35
  Notes: `command_not_found_handle` is bash-only; on zsh use `command_not_found_handler`. Keep `FUZZRUN_BIN` absolute.
@@ -37,20 +38,32 @@ Notes: `command_not_found_handle` is bash-only; on zsh use `command_not_found_ha
37
38
 
38
39
  Append to `Documents\PowerShell\Microsoft.PowerShell_profile.ps1`:
39
40
 
40
- ```powershell
41
- $fuzzrun = "C:\Users\HP\fuzzRun\bin\fuzzrun.js" # update path
42
- function global:fuzzrun { node $fuzzrun @args }
43
- $ExecutionContext.InvokeCommand.CommandNotFoundAction = {
41
+ ```powershell
42
+ $fuzzrun = "C:\Users\HP\fuzzRun\bin\fuzzrun.js" # update path
43
+ function global:fuzzrun { node $fuzzrun @args }
44
+ $ExecutionContext.InvokeCommand.CommandNotFoundAction = {
44
45
  param($commandName, $eventArgs)
45
46
  fuzzrun $commandName @($eventArgs.Arguments)
46
47
  }
47
- function global:git { fuzzrun git @args } # optional git wrapper
48
- ```
49
-
50
- ### Manage hooks
51
- - `fuzzrun enable` (add hooks to your shell profile)
52
- - `fuzzrun disable` (remove hooks)
53
- - `fuzzrun status` (show which profiles are enabled)
48
+ function global:git { fuzzrun git @args } # optional git wrapper
49
+ ```
50
+
51
+ ### Manage hooks
52
+ - `fuzzrun enable` (add hooks to your shell profile)
53
+ - `fuzzrun disable` (remove hooks)
54
+ - `fuzzrun status` (show which profiles are enabled)
55
+
56
+ ### Preview & stats
57
+ - `fuzzrun explain <command...>` — show the fix it *would* apply without running anything (dry-run). `fuzzrun --dry-run <command...>` works too.
58
+ - `fuzzrun stats` — see how many commands FuzzRun has rescued, broken down by type, plus your most frequent typos.
59
+
60
+ FuzzRun **learns**: every accepted correction is remembered in `~/.fuzzrun/state.json`, and that history is used to break ambiguous ties in favor of fixes you've chosen before.
61
+
62
+ ### Output & prompting
63
+ - Corrections are printed in color with a `⚡` marker. Set `NO_COLOR=1` (or `FUZZRUN_NO_COLOR=1`) to disable color; `FUZZRUN_FORCE_COLOR=1` to force it.
64
+ - By default, edit-distance-1 fixes auto-run and weaker (distance ≥ 2) fixes ask first.
65
+ - `FUZZRUN_PROMPT=1` — always ask before applying any fix.
66
+ - `FUZZRUN_YES=1` — never ask; auto-run every fix.
54
67
 
55
68
  ### How it works
56
69
  - Runs the command once; if it fails with "command not found" or "unknown subcommand", tries a one-edit-away fix or the CLI's own suggestion and re-runs automatically.
@@ -58,11 +71,12 @@ function global:git { fuzzrun git @args } # optional git wrapper
58
71
  - Skips auto-run when risky flags are present (`--force`, `--hard`, `-rf`, etc.) and blocks dangerous bases (`rm`, `mv`, `dd`, etc.).
59
72
  - Subcommand suggestions are preloaded for popular CLIs (git, npm/yarn/pnpm, pip, docker, kubectl, gh) plus "did you mean" parsing.
60
73
  - Context-aware fixes for `git checkout/switch <branch>` and `npm/yarn/pnpm run <script>` after a failure.
74
+ - Fuzzy flag correction for common long flags (e.g. `git commit --mesage` → `--message`); never corrects *into* a destructive flag.
61
75
 
62
- ### Config
63
- - `FUZZRUN_MAX_DISTANCE=1` (set to 2 if you want more aggressive matching)
64
- - `FUZZRUN_ALLOW_ANY_SUBCOMMANDS=1` (allow subcommand fixes for any base that prints suggestions)
65
- - `FUZZRUN_PREFER_BASES=git,npm,docker` (breaks ties in favor of preferred commands)
76
+ ### Config
77
+ - `FUZZRUN_MAX_DISTANCE=1` (set to 2 if you want more aggressive matching)
78
+ - `FUZZRUN_ALLOW_ANY_SUBCOMMANDS=1` (allow subcommand fixes for any base that prints suggestions)
79
+ - `FUZZRUN_PREFER_BASES=git,npm,docker` (breaks ties in favor of preferred commands)
66
80
 
67
81
  ### Limits
68
82
  - Only one retry; only unique matches; no prompt.
package/bin/fuzzrun.js CHANGED
@@ -1,6 +1,6 @@
1
- #!/usr/bin/env node
2
- 'use strict';
3
-
4
- const { main } = require('../src/cli');
5
-
6
- main();
1
+ #!/usr/bin/env node
2
+ 'use strict';
3
+
4
+ const { main } = require('../src/cli');
5
+
6
+ main();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fuzzrunx",
3
- "version": "0.1.6",
3
+ "version": "0.2.0",
4
4
  "description": "Auto-correct mistyped commands and subcommands and re-run them safely.",
5
5
  "bin": {
6
6
  "fuzzrun": "bin/fuzzrun.js"
@@ -9,6 +9,8 @@
9
9
  "license": "MIT",
10
10
  "scripts": {
11
11
  "start": "node bin/fuzzrun.js",
12
- "postinstall": "node scripts/postinstall.js"
12
+ "test": "node --test",
13
+ "postinstall": "node scripts/postinstall.js",
14
+ "postuninstall": "node scripts/postuninstall.js"
13
15
  }
14
16
  }
@@ -1,36 +1,36 @@
1
- 'use strict';
2
-
3
- const fs = require('fs');
4
- const os = require('os');
5
- const path = require('path');
6
- const installer = require('../src/installer');
7
-
8
- const skip = process.env.FUZZRUN_SKIP_ENABLE === '1';
9
-
10
- function getStatePath() {
11
- return path.join(os.homedir(), '.fuzzrun', 'state.json');
12
- }
13
-
14
- function writeState(next) {
15
- const filePath = getStatePath();
16
- fs.mkdirSync(path.dirname(filePath), { recursive: true });
17
- fs.writeFileSync(filePath, JSON.stringify(next, null, 2), 'utf8');
18
- }
19
-
20
- if (skip) {
21
- process.stderr.write('fuzzrun: auto-enable skipped\n');
22
- process.exit(0);
23
- }
24
-
25
- const foregroundScripts =
26
- process.env.npm_config_foreground_scripts === 'true' ||
27
- process.env.npm_config_foreground_scripts === '1';
28
-
29
- try {
30
- installer.enable({});
31
- process.stderr.write('FuzzRun is automatically enabled. Run "fuzzrun disable" to deactivate.\n');
32
- writeState({ bannerShown: foregroundScripts, enableSucceeded: true });
33
- } catch (err) {
34
- process.stderr.write(`fuzzrun: auto-enable failed: ${err.message}\n`);
35
- writeState({ bannerShown: false, enableSucceeded: false, lastError: err.message });
36
- }
1
+ 'use strict';
2
+
3
+ const fs = require('fs');
4
+ const os = require('os');
5
+ const path = require('path');
6
+ const installer = require('../src/installer');
7
+
8
+ const skip = process.env.FUZZRUN_SKIP_ENABLE === '1';
9
+
10
+ function getStatePath() {
11
+ return path.join(os.homedir(), '.fuzzrun', 'state.json');
12
+ }
13
+
14
+ function writeState(next) {
15
+ const filePath = getStatePath();
16
+ fs.mkdirSync(path.dirname(filePath), { recursive: true });
17
+ fs.writeFileSync(filePath, JSON.stringify(next, null, 2), 'utf8');
18
+ }
19
+
20
+ if (skip) {
21
+ process.stderr.write('fuzzrun: auto-enable skipped\n');
22
+ process.exit(0);
23
+ }
24
+
25
+ const foregroundScripts =
26
+ process.env.npm_config_foreground_scripts === 'true' ||
27
+ process.env.npm_config_foreground_scripts === '1';
28
+
29
+ try {
30
+ installer.enable({});
31
+ process.stderr.write('FuzzRun is automatically enabled. Run "fuzzrun disable" to deactivate.\n');
32
+ writeState({ bannerShown: foregroundScripts, enableSucceeded: true });
33
+ } catch (err) {
34
+ process.stderr.write(`fuzzrun: auto-enable failed: ${err.message}\n`);
35
+ writeState({ bannerShown: false, enableSucceeded: false, lastError: err.message });
36
+ }
@@ -0,0 +1,10 @@
1
+ 'use strict';
2
+
3
+ const installer = require('../src/installer');
4
+
5
+ try {
6
+ installer.disable();
7
+ process.stderr.write('FuzzRun hooks removed. Restart your terminal if needed.\n');
8
+ } catch (err) {
9
+ process.stderr.write(`fuzzrun: postuninstall cleanup failed: ${err.message}\n`);
10
+ }