nu-lint 0.0.41

Linter for Nu shell scripts that helpfully suggests improvements
Documentation

Nu-Lint

Linter for the innovative Nu shell.

Learning to use a new shell is a radical change that can use some assistance. This project is aimed at helping new users of the Nu shell. Nu shell has a lot of interesting and useful features and this program will give you hints to use all the features of Nu.

For example, the rule prefer_pipeline_input in this program recommends to use pipelines instead of positional arguments:

def filter-positive [numbers] { 
    $numbers | where $it > 0 
}
def filter-positive [] { 
    where $it > 0 
}

All rules are optional and can be disabled with a configuration file. The rule definitions are designed to be compatible with:

Installation

Cross-platform

From crates.io:

cargo install nu-lint

Source

Build from source:

cargo install --path .
cargo install --git . "$THIS_GIT_URL"

VS Code extension

Available at VS Code Marketplace.

Nix

To install in Nix or NixOS, add to configuration.nix:

let
  nu-lint = pkgs.callPackage (pkgs.fetchFromGitHub {
    owner = "wvhulle";
    repo = "nu-lint";
    rev = "COMMIT_HASH";
    sha256 = ""; # nix will tell you the correct hash
  }) {};
in
{
  environment.systemPackages = [
    nu-lint
  ];
}

Usage

Basic:

nu-lint                                    # Lint working directory
nu-lint script.nu                          # Lint a file
nu-lint directory/                         # Lint directory
'let x =' | nu-lint                   # Pipe in over stdin

Apply fixes:

nu-lint --fix --dry-run   # Test
nu-lint --fix             # Apply

Output formats:

nu-lint script.nu --format text            # Human-readable (default)
nu-lint script.nu --format json            # JSON format
nu-lint script.nu --format vscode-json     # VS Code LSP-compatible JSON

Configuration

Show all rules:

nu-lint list-rules                         

Show all rule sets:

nu-lint list-sets

Create .nu-lint.toml in your project root (or any parent directory):

# Configure entire lint sets (e.g., "naming", "idioms", "pedantic")
[lints.sets]
naming = "deny"
idioms = "warn"

# Configure individual rules (overrides set settings)
[lints.rules]
snake_case_variables = "allow"
prefer_pipeline_input = "deny"

Available lint levels: allow, warn, deny.

The linter will automatically find and use this config file when you run it. Otherwise:

nu-lint --config custom.toml script.nu  

Rules

You can add, remove or change rules by forking this repo and opening a PR (see ./CONTRIBUTING.md).

License

MIT