├── examples └── flake │ ├── .gitignore │ ├── env-vars │ ├── libs │ └── foo │ │ └── mod.nu │ └── flake.nix ├── .gitignore ├── .helix └── languages.toml ├── garnix.yaml ├── plugin-specifics.nix ├── LICENSE.txt ├── .github └── workflows │ └── nightly-updates.yml ├── nix-src ├── nushell.nix ├── nu-libs-and-plugins.nix ├── lib.nix └── nushell-with.nix ├── nu-src ├── patch-deps.nu ├── extract-env.nu └── update-plugin-list.nu ├── flake.lock ├── flake.nix ├── README.md └── plugin-list.toml /examples/flake/.gitignore: -------------------------------------------------------------------------------- 1 | flake.lock 2 | -------------------------------------------------------------------------------- /examples/flake/env-vars: -------------------------------------------------------------------------------- 1 | FOO_REQUIRED_VERSION=^0.132 2 | -------------------------------------------------------------------------------- /examples/flake/libs/foo/mod.nu: -------------------------------------------------------------------------------- 1 | export def version [] { 2 | "0.132.5" 3 | } 4 | 5 | export def say_hello [] { 6 | "Hello from foo" 7 | } 8 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Devenv 2 | .devenv* 3 | devenv.local.nix 4 | 5 | # direnv 6 | .direnv 7 | 8 | # pre-commit 9 | .pre-commit-config.yaml 10 | 11 | # nix builds 12 | result 13 | -------------------------------------------------------------------------------- /.helix/languages.toml: -------------------------------------------------------------------------------- 1 | [[language]] 2 | name = "nix" 3 | auto-format = true 4 | formatter.command = "nixfmt" 5 | 6 | # Do not use user's nushell config when starting nu as an LSP server 7 | [language-server.nu-lsp] 8 | command = "nu" 9 | args = ["-n", "--lsp"] 10 | -------------------------------------------------------------------------------- /garnix.yaml: -------------------------------------------------------------------------------- 1 | builds: 2 | include: 3 | - 'packages.x86_64-linux.nushell' 4 | - 'packages.x86_64-linux.nushellMCP' 5 | - 'packages.x86_64-linux.nushellWith' 6 | - 'packages.x86_64-linux.nushellWithStdPlugins' 7 | - 'checks.x86_64-linux.*' 8 | - 'packages.aarch64-darwin.nushell' 9 | - 'packages.aarch64-darwin.nushellWith' 10 | - 'packages.aarch64-darwin.nushellWithStdPlugins' 11 | -------------------------------------------------------------------------------- /plugin-specifics.nix: -------------------------------------------------------------------------------- 1 | { 2 | sysdeps = 3 | pkgs: 4 | # Declare the non-rust libs (from nixpkgs) that each plugin packaged on crates.io needs to build 5 | # 6 | # Deps are to be added here on a case-by-case fashion 7 | with pkgs; { 8 | audio_hook = [ alsa-lib ]; 9 | binaryview = [ xorg.libX11 ]; 10 | cassandra_query = [ 11 | cassandra-cpp-driver 12 | cryptodev 13 | openssl 14 | libuv 15 | ]; 16 | cloud = [ openssl ]; 17 | dbus = [ dbus ]; 18 | fetch = [ openssl ]; 19 | from_dhall = [ openssl ]; 20 | gstat = [ openssl ]; 21 | plotters = [ fontconfig ]; 22 | polars = [ openssl ]; 23 | post = [ openssl ]; 24 | prometheus = [ openssl ]; 25 | query = [ 26 | openssl 27 | curl 28 | ]; 29 | s3 = [ openssl ]; 30 | twitch = [ openssl ]; 31 | ws = [ openssl ]; 32 | }; 33 | 34 | # These plugins won't be built: 35 | known-broken = [ 36 | "from_dhall" 37 | "unzip" 38 | ]; 39 | } 40 | -------------------------------------------------------------------------------- /LICENSE.txt: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy 4 | of this software and associated documentation files (the "Software"), to deal 5 | in the Software without restriction, including without limitation the rights 6 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | copies of the Software, and to permit persons to whom the Software is 8 | furnished to do so, subject to the following conditions: 9 | 10 | The above copyright notice and this permission notice shall be included in all 11 | copies or substantial portions of the Software. 12 | 13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 19 | SOFTWARE. 20 | 21 | -------------------------------------------------------------------------------- /.github/workflows/nightly-updates.yml: -------------------------------------------------------------------------------- 1 | name: nightly-updates 2 | 3 | on: 4 | schedule: 5 | - cron: "0 0 * * *" 6 | workflow_dispatch: 7 | 8 | jobs: 9 | update-locks-and-plugins: 10 | runs-on: ubuntu-latest 11 | permissions: 12 | contents: write 13 | steps: 14 | - uses: actions/checkout@v4 15 | - uses: DeterminateSystems/determinate-nix-action@v3 16 | - name: Set up jj 17 | run: | 18 | nix profile add nixpkgs#jujutsu 19 | jj config set --user user.name "Nightly updater" 20 | jj config set --user user.email "foo@bar.baz" 21 | jj git init --colocate 22 | jj git fetch --remote origin 23 | jj bookmark track $(jj log --no-graph -r "remote_bookmarks(glob:'nu*')" -T "remote_bookmarks ++ ' '") 24 | - name: Update branches 25 | run: | 26 | for b in $(jj log --no-graph -r "bookmarks(glob:'nu*')" -T "local_bookmarks ++ ' '"); do 27 | jj new "$b" -m "Update $b branch" 28 | jj bookmark move --from "$b" --to @ 29 | nix flake update --accept-flake-config 30 | nix run ".#update-plugin-list" --accept-flake-config 31 | done 32 | - name: Push branches with changes 33 | run: | 34 | jj git push -r 'remote_bookmarks().. ~ empty()' 35 | -------------------------------------------------------------------------------- /nix-src/nushell.nix: -------------------------------------------------------------------------------- 1 | { 2 | craneLib, 3 | lib, 4 | pkg-config, 5 | python3, 6 | rustPlatform, 7 | zlib, 8 | xorg, 9 | nghttp2, 10 | libgit2, 11 | stdenv, 12 | zstd, 13 | nushell-src, 14 | # Extra features to enable (in addition to defaults, unless noDefaultFeatures is true) 15 | features ? [], 16 | # Whether to disable default features 17 | noDefaultFeatures ? false, 18 | }: 19 | let 20 | nativeBuildInputs = [ 21 | pkg-config 22 | ] 23 | ++ lib.optionals (stdenv.hostPlatform.isLinux) [ python3 ] 24 | ++ lib.optionals stdenv.hostPlatform.isDarwin [ rustPlatform.bindgenHook ]; 25 | 26 | buildInputs = [ 27 | zstd 28 | ] 29 | ++ lib.optionals stdenv.hostPlatform.isDarwin [ zlib ] 30 | ++ lib.optionals (stdenv.hostPlatform.isLinux) [ xorg.libX11 ] 31 | ++ lib.optionals (stdenv.hostPlatform.isDarwin) [ 32 | nghttp2 33 | libgit2 34 | ]; 35 | 36 | featureArgs = 37 | lib.optionalString noDefaultFeatures "--no-default-features" 38 | + lib.optionalString (features != []) " --features ${lib.concatStringsSep "," features}"; 39 | 40 | craneArgs = { 41 | inherit nativeBuildInputs buildInputs; 42 | src = nushell-src; 43 | pname = "nushell"; 44 | version = "0.107.0"; 45 | doCheck = false; 46 | } // lib.optionalAttrs (featureArgs != "") { 47 | cargoExtraArgs = featureArgs; 48 | }; 49 | 50 | cargoArtifacts = craneLib.buildDepsOnly craneArgs; 51 | in 52 | craneLib.buildPackage (craneArgs // { inherit cargoArtifacts; }) 53 | -------------------------------------------------------------------------------- /nu-src/patch-deps.nu: -------------------------------------------------------------------------------- 1 | # Prepend a PATH to a nushell file, writing result someplace else 2 | def patchNuFile [deps: list, path: list, inFile: path, outFile: path] { 3 | # `use` directives must remain at the top of the file 4 | let contents = open -r $inFile 5 | let new_contents = [ 6 | $"const NU_LIB_DIRS = ($deps | to nuon)" 7 | $"export-env {$env.PATH = \($env.PATH | prepend ($path | to nuon))}" 8 | $contents 9 | ] 10 | $new_contents | str join "\n\n" | save -r $outFile 11 | } 12 | 13 | # Recursively add PATH to each .nu file in a directory, writing result someplace else 14 | def patchNuDir [deps: list, path: list, inDir: path, outDir: path] { 15 | cd $inDir 16 | for inFile in (ls -a **/*) { 17 | let outFile = $"($outDir)/($inFile.name)" 18 | let outParent = $outFile | path dirname 19 | if (not ($outParent | path exists)) { 20 | mkdir $outParent 21 | } 22 | if ($inFile.name | path parse | get extension) == "nu" { 23 | patchNuFile $deps $path $inFile.name $outFile 24 | } else if ($inFile.type == "file") { 25 | cp $inFile.name $outFile 26 | } 27 | } 28 | } 29 | 30 | # Prepend a PATH to each .nu file (recursively) in some folder $inDir, writing result to $env.out 31 | def main [ 32 | inDir: path, # Source directory 33 | args: string, # a JSON obj 34 | ] { 35 | let args = $args | from json 36 | mkdir $env.out 37 | patchNuDir $args.dependencies $args.path $inDir $env.out 38 | } 39 | -------------------------------------------------------------------------------- /nu-src/extract-env.nu: -------------------------------------------------------------------------------- 1 | # These are always rejected, whatever the user settings, because 2 | # they prevent the env from functioning correctly 3 | const HIDDEN = [ 4 | HOME FILE_PWD CURRENT_FILE PWD SHELL SHLVL 5 | name shell shellHook 6 | TMP TEMP TMPDIR TEMPDIR 7 | NIX_SSL_CERT_FILE 8 | SSL_CERT_FILE 9 | "NU_.*" 10 | ] 11 | 12 | export def extract-from-env [ 13 | selected: list 14 | rejected: list 15 | ] { 16 | let rejected = $HIDDEN ++ $rejected 17 | 18 | $env | 19 | transpose k v | 20 | where {|e| ( 21 | ($e.v | describe) in [string "list"] 22 | and 23 | ($selected | any {$e.k =~ $"^($in)$"}) 24 | and 25 | (not ($rejected | any {$e.k =~ $"^($in)$"})) 26 | )} | 27 | transpose -rd 28 | } 29 | 30 | export def merge-deep-all [ 31 | --strategy (-s) = "prepend" 32 | paths: list 33 | ] { 34 | match $paths { 35 | [] => { 36 | $in 37 | } 38 | [$p ..$rest] => { 39 | merge deep -s $strategy (open $p) | merge-deep-all -s $strategy $rest 40 | } 41 | } 42 | } 43 | 44 | export def --env merge-into-env [ 45 | --strategy (-s) = "prepend" 46 | paths: list 47 | ] { 48 | load-env ( 49 | $env | 50 | transpose k v | 51 | where {($in.v | describe) == "list"} | 52 | transpose -rd | 53 | merge-deep-all -s $strategy $paths 54 | ) 55 | } 56 | 57 | def main [ 58 | --selected (-s): string = "['.*']" 59 | --rejected (-r): string = "[]" 60 | --out (-o): path 61 | ] { 62 | extract-from-env ($selected | from nuon) ($rejected | from nuon) | save $out 63 | } 64 | -------------------------------------------------------------------------------- /examples/flake/flake.nix: -------------------------------------------------------------------------------- 1 | # - Run the dummy script with `nix run .` 2 | # - Run the nushell env with `nix run .#myNushell` 3 | 4 | { 5 | description = "Example of how to use nushellWith"; 6 | 7 | nixConfig = { 8 | extra-substituters = [ "https://cache.garnix.io" ]; 9 | extra-trusted-public-keys = [ "cache.garnix.io:CTFPyKSLcx5RMJKfLo5EEPUObbA78b0YQ2DTCJXqr9g=" ]; 10 | }; 11 | 12 | inputs = { 13 | nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable"; 14 | flake-utils.url = "github:numtide/flake-utils"; 15 | 16 | nushellWith.url = "../.."; # Replace with "github:YPares/nushellWith"; 17 | # It's preferable not to set nushellWith.inputs.nixpkgs.follows, because this would 18 | # quite likely invalidate the garnix cache and trigger a lot of rebuilds on your machine 19 | }; 20 | 21 | outputs = 22 | { 23 | nixpkgs, 24 | flake-utils, 25 | nushellWith, 26 | ... 27 | }: 28 | flake-utils.lib.eachDefaultSystem ( 29 | system: 30 | let 31 | pkgs = import nixpkgs { 32 | inherit system; 33 | overlays = [ nushellWith.overlays.default ]; 34 | }; 35 | myNushell = pkgs.nushellWith { 36 | plugins.nix = with pkgs.nushellPlugins; [ semver ]; 37 | libraries.source = [ 38 | ./libs 39 | ]; 40 | env-vars-file = ./env-vars; 41 | }; 42 | in 43 | { 44 | packages.myNushellEnv = myNushell; 45 | packages.default = myNushell.writeNuScriptBin "dummy-script" '' 46 | use foo 47 | 48 | foo say_hello | print 49 | ''; 50 | 51 | checks.default = myNushell.runNuCommand "dummy-check" { } '' 52 | use foo 53 | 54 | if (foo version | semver match-req $env.FOO_REQUIRED_VERSION) { 55 | "OK" | save $env.out 56 | } else { 57 | error make {msg: "foo doesn't match expected version"} 58 | } 59 | ''; 60 | } 61 | ); 62 | } 63 | -------------------------------------------------------------------------------- /nu-src/update-plugin-list.nu: -------------------------------------------------------------------------------- 1 | #! /usr/bin/env -S nu -n 2 | 3 | use std/formats "from jsonl" 4 | 5 | def search-crates-io-rec [qs] { 6 | let r = http get https://crates.io/api/v1/crates($qs) 7 | $r.crates | append ( 8 | match $r.meta?.next_page? { 9 | null => [] 10 | $qs_next => { 11 | search-crates-io-rec $qs_next 12 | } 13 | } 14 | ) 15 | } 16 | 17 | export def list-latest-compatible-versions [wanted_nu_version] { 18 | search-crates-io-rec "?q=nu_plugin_&per_page=100" | 19 | where name =~ "^nu_plugin_" | 20 | select name | 21 | par-each {|crate| 22 | let versions = http get https://index.crates.io/nu/_p/($crate.name) | 23 | from jsonl | 24 | each {|ver| 25 | let nu_plugin_dep = $ver.deps | where name == "nu-plugin" | get -o 0.req 26 | { 27 | key: ($crate.name | str replace "nu_plugin_" "") 28 | value: { 29 | name: $crate.name 30 | version: $ver.vers 31 | checksum: $ver.cksum 32 | nu-plugin-dep: $nu_plugin_dep 33 | broken: ($nu_plugin_dep == null or not ($wanted_nu_version | semver match-req $nu_plugin_dep)) 34 | } 35 | } 36 | } 37 | match ($versions | where not value.broken | slice (-1)..) { 38 | [$ver] => $ver 39 | _ => ($versions | last) 40 | } 41 | } | sort-by key | transpose -rd 42 | } 43 | 44 | const self = path self | path basename 45 | 46 | # Fetch from crates.io the list of packages named nu_plugin_* 47 | # and write their details (name, version, checksum) to a TOML file 48 | def main [out: path = "plugin-list.toml"] { 49 | let locked_nu_ref = open -r ($self | path join .. flake.lock) | 50 | from json | get -o nodes.nushell-src.original.ref | default "refs/heads/main" 51 | let wanted_nu_version = ( 52 | http get $"https://raw.githubusercontent.com/nushell/nushell/($locked_nu_ref)/Cargo.toml" | get package.version 53 | ) 54 | 55 | print $"Updating plugin list from crates.io and finding latest versions compatible with Nu ($wanted_nu_version) \(from nushell's github ref '($locked_nu_ref)')..." 56 | [ 57 | $"## THIS FILE IS GENERATED AUTOMATICALLY BY ($self)" 58 | "## DO NOT EDIT MANUALLY" 59 | "" 60 | ...(list-latest-compatible-versions $wanted_nu_version | to toml | lines) 61 | ] | save --raw -f $out 62 | } 63 | -------------------------------------------------------------------------------- /nix-src/nu-libs-and-plugins.nix: -------------------------------------------------------------------------------- 1 | # This flake exposes some existing nushell libraries (packaged with their dependencies) 2 | # 3 | # When adding a library/plugin here, don't forget to add its inputs to the main flake.nix 4 | { 5 | flake-inputs, 6 | pkgs, # Overriden pkgs, with nushell & craneLib 7 | }: 8 | let 9 | nushellLibraries = 10 | let # Shortcut to build a nu library without too much fuss: 11 | simpleNuLib = 12 | name: extraArgs: 13 | pkgs.nushell.makeNuLibrary ( 14 | { 15 | inherit name; 16 | src = flake-inputs."${name}-src"; 17 | } 18 | // extraArgs 19 | ); 20 | in 21 | { 22 | nu-batteries = simpleNuLib "nu-batteries" { }; 23 | 24 | webserver-nu = simpleNuLib "webserver-nu" { 25 | path = with pkgs; [ 26 | "${netcat}/bin" 27 | "${coreutils}/bin" 28 | ]; 29 | }; 30 | }; 31 | 32 | nushellPlugins = 33 | let 34 | pluginsBaseBuildInputs = 35 | with pkgs; 36 | [ pkg-config ] 37 | ; 38 | nativeBuildInputs = 39 | with pkgs; 40 | lib.optionals (stdenv.hostPlatform.isDarwin) [ 41 | iconv 42 | ]; 43 | 44 | pluginSpecifics = import ../plugin-specifics.nix; 45 | 46 | buildPluginFromCratesIo = 47 | shortName: 48 | { name, broken, ... }@infoFromToml: 49 | let 50 | src = pkgs.craneLib.downloadCargoPackage ( 51 | infoFromToml 52 | // { 53 | source = "registry+https://github.com/rust-lang/crates.io-index"; 54 | } 55 | ); 56 | buildInputs = pluginsBaseBuildInputs ++ ((pluginSpecifics.sysdeps pkgs).${shortName} or [ ]); 57 | cargoArtifacts = pkgs.craneLib.buildDepsOnly { 58 | inherit src buildInputs nativeBuildInputs; 59 | doCheck = false; 60 | }; 61 | in 62 | pkgs.craneLib.buildPackage { 63 | inherit src buildInputs nativeBuildInputs cargoArtifacts; 64 | doCheck = false; 65 | } 66 | // { 67 | meta.broken = broken || builtins.elem shortName pluginSpecifics.known-broken; 68 | }; 69 | 70 | in 71 | # All the plugins from crates.io: 72 | builtins.mapAttrs (shortName: buildPluginFromCratesIo shortName) ( 73 | builtins.fromTOML (builtins.readFile ../plugin-list.toml) 74 | ); 75 | 76 | in 77 | { 78 | inherit nushellLibraries nushellPlugins; 79 | } 80 | -------------------------------------------------------------------------------- /flake.lock: -------------------------------------------------------------------------------- 1 | { 2 | "nodes": { 3 | "crane": { 4 | "locked": { 5 | "lastModified": 1765145449, 6 | "narHash": "sha256-aBVHGWWRzSpfL++LubA0CwOOQ64WNLegrYHwsVuVN7A=", 7 | "owner": "ipetkov", 8 | "repo": "crane", 9 | "rev": "69f538cdce5955fcd47abfed4395dc6d5194c1c5", 10 | "type": "github" 11 | }, 12 | "original": { 13 | "owner": "ipetkov", 14 | "repo": "crane", 15 | "type": "github" 16 | } 17 | }, 18 | "nixpkgs": { 19 | "locked": { 20 | "lastModified": 1765270179, 21 | "narHash": "sha256-g2a4MhRKu4ymR4xwo+I+auTknXt/+j37Lnf0Mvfl1rE=", 22 | "owner": "NixOS", 23 | "repo": "nixpkgs", 24 | "rev": "677fbe97984e7af3175b6c121f3c39ee5c8d62c9", 25 | "type": "github" 26 | }, 27 | "original": { 28 | "owner": "NixOS", 29 | "ref": "nixpkgs-unstable", 30 | "repo": "nixpkgs", 31 | "type": "github" 32 | } 33 | }, 34 | "nu-batteries-src": { 35 | "flake": false, 36 | "locked": { 37 | "lastModified": 1760054757, 38 | "narHash": "sha256-pFKGR1QDKuLc8F53H5hQjP/+NeYPJpIu/MGCSjS3iLk=", 39 | "owner": "nome", 40 | "repo": "nu-batteries", 41 | "rev": "187797585d9f4dd6a2b696d0572eb2b2f2aacd23", 42 | "type": "github" 43 | }, 44 | "original": { 45 | "owner": "nome", 46 | "repo": "nu-batteries", 47 | "type": "github" 48 | } 49 | }, 50 | "nushell-src": { 51 | "flake": false, 52 | "locked": { 53 | "lastModified": 1760528800, 54 | "narHash": "sha256-8OMTscMObV+IOSgOoTSzJvZTz6q/l2AjrOb9y3p2tZY=", 55 | "owner": "nushell", 56 | "repo": "nushell", 57 | "rev": "da141be11b3acaa55b39321e5f9651d02aa2ed6f", 58 | "type": "github" 59 | }, 60 | "original": { 61 | "owner": "nushell", 62 | "ref": "0.108.0", 63 | "repo": "nushell", 64 | "type": "github" 65 | } 66 | }, 67 | "root": { 68 | "inputs": { 69 | "crane": "crane", 70 | "nixpkgs": "nixpkgs", 71 | "nu-batteries-src": "nu-batteries-src", 72 | "nushell-src": "nushell-src", 73 | "webserver-nu-src": "webserver-nu-src" 74 | } 75 | }, 76 | "webserver-nu-src": { 77 | "flake": false, 78 | "locked": { 79 | "lastModified": 1763371940, 80 | "narHash": "sha256-/0O/uKJaecIEAO2B/fThNzn0WeD+zX4j+23HIlqA71s=", 81 | "owner": "Jan9103", 82 | "repo": "webserver.nu", 83 | "rev": "0827c216101a541e73f2102603ea7f02c4d3e5c5", 84 | "type": "github" 85 | }, 86 | "original": { 87 | "owner": "Jan9103", 88 | "repo": "webserver.nu", 89 | "type": "github" 90 | } 91 | } 92 | }, 93 | "root": "root", 94 | "version": 7 95 | } 96 | -------------------------------------------------------------------------------- /nix-src/lib.nix: -------------------------------------------------------------------------------- 1 | crane: rec { 2 | nushellWith = 3 | { pkgs, ... }@args: 4 | let 5 | nushellEnv = import ./nushell-with.nix crane args; 6 | in 7 | nushellEnv 8 | // { 9 | inherit (mkLib (pkgs // { nushell = nushellEnv; })) 10 | runNuCommand 11 | runNuScript 12 | writeNuScriptBin 13 | writeNushellApplication 14 | ; 15 | }; 16 | 17 | # A nushell version of pkgs.runCommand 18 | # 19 | # Use a inlined Nu script to build a derivation. 20 | # This script should write to $env.out 21 | runNuCommand = 22 | pkgs: name: bins: command: 23 | pkgs.runCommand name bins '' 24 | ${pkgs.nushell}/bin/nu ${ 25 | pkgs.lib.escapeShellArgs [ 26 | "-c" 27 | command 28 | ] 29 | } 30 | ''; 31 | 32 | # Call a Nu script, passing it arguments, to build a derivation. 33 | # This script should write to $env.out 34 | runNuScript = 35 | pkgs: name: bins: scriptPath: args: 36 | pkgs.runCommand name bins '' 37 | ${pkgs.nushell}/bin/nu ${scriptPath} ${pkgs.lib.escapeShellArgs args} 38 | ''; 39 | 40 | # A nushell version of pkgs.writeScriptBin 41 | # 42 | # Build a derivation that executes the given inlined nushell script 43 | writeNuScriptBin = 44 | pkgs: name: contents: 45 | pkgs.writeScriptBin name '' 46 | #!${pkgs.lib.getExe pkgs.nushell} 47 | 48 | ${contents} 49 | ''; 50 | 51 | # A nushell version of pkgs.writeShellApplication 52 | # 53 | # Build a derivation that executes the given inlined nushell script, 54 | # and can add runtimeInputs that this script can use 55 | writeNushellApplication = 56 | pkgs: args: 57 | pkgs.writeShellApplication ( 58 | args 59 | // { 60 | text = '' 61 | #!${pkgs.lib.getExe pkgs.nushell} 62 | 63 | ${args.text} 64 | ''; 65 | } 66 | ); 67 | 68 | # Patch a nushell library so it refers to a specific PATH and can use its dependencies 69 | makeNuLibrary = 70 | { 71 | # Nixpkgs imported: 72 | pkgs, 73 | # Name of the library: 74 | name, 75 | # Folder containing the library: 76 | src, 77 | # Nu libraries this lib depends on: 78 | dependencies ? [ ], 79 | # Binary dependencies (list of folders to add to the PATH): 80 | path ? [ ], 81 | }: 82 | runNuScript pkgs name { } ../nu-src/patch-deps.nu [ 83 | src 84 | (builtins.toJSON { inherit dependencies path; }) 85 | ]; 86 | 87 | # Extract the build env of a derivation as a file 88 | extractBuildEnv = 89 | { 90 | pkgs, # Nixpkgs imported 91 | drv, # The derivation to override 92 | preBuildHook ? "", # Bash code to set extra env vars, e.g. by sourcing a file 93 | selected ? [ ".*" ], # Which env vars to keep (regexes) 94 | rejected ? [ ], # After selection, which env vars to remove (regexes) 95 | format ? "nuon", # A file extension. Which format to use for the env file 96 | }: 97 | let 98 | toNuonList = list: "\"[${pkgs.lib.strings.escapeShellArgs list}]\""; 99 | in 100 | drv.overrideAttrs { 101 | name = "${drv.name}-env.${format}"; 102 | buildCommand = '' 103 | ${preBuildHook} 104 | ${pkgs.nushell}/bin/nu -n ${../nu-src/extract-env.nu} \ 105 | -s ${toNuonList selected} -r ${toNuonList rejected} -o $out 106 | ''; 107 | }; 108 | 109 | # Make a nushell module that, when imported with 'use' or 'overlay use', 110 | # will add to the current env the contents of some env files (which can be 111 | # any format usable by nushell 'open' command) 112 | makeNuModuleExporting = 113 | { 114 | pkgs, # Nixpkgs imported 115 | env-files, # The json/toml/yaml/nuon env files that the produced module should export 116 | merge-strategy ? "prepend", # How list-like env vars (notably PATH) should be dealt with 117 | }: 118 | pkgs.writeText "env.nu" '' 119 | use ${../nu-src/extract-env.nu} merge-into-env 120 | 121 | export-env { 122 | merge-into-env --strategy ${merge-strategy} [${pkgs.lib.strings.concatStringsSep " " env-files}] 123 | } 124 | ''; 125 | 126 | # Set pkgs once for all the above functions 127 | mkLib = 128 | pkgs: 129 | let 130 | withPkgs = f: args: f ({ inherit pkgs; } // args); 131 | in 132 | { 133 | nushellWith = withPkgs nushellWith; 134 | runNuCommand = runNuCommand pkgs; 135 | runNuScript = runNuScript pkgs; 136 | writeNuScriptBin = writeNuScriptBin pkgs; 137 | writeNushellApplication = writeNushellApplication pkgs; 138 | makeNuLibrary = withPkgs makeNuLibrary; 139 | extractBuildEnv = withPkgs extractBuildEnv; 140 | makeNuModuleExporting = withPkgs makeNuModuleExporting; 141 | }; 142 | } 143 | -------------------------------------------------------------------------------- /flake.nix: -------------------------------------------------------------------------------- 1 | { 2 | description = "Make a nushell instance with specific plugins and/or nushell libraries"; 3 | 4 | nixConfig = { 5 | extra-substituters = [ "https://cache.garnix.io" ]; 6 | extra-trusted-public-keys = [ "cache.garnix.io:CTFPyKSLcx5RMJKfLo5EEPUObbA78b0YQ2DTCJXqr9g=" ]; 7 | }; 8 | 9 | inputs = { 10 | crane.url = "github:ipetkov/crane"; 11 | nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable"; 12 | 13 | # Latest Nushell stable version: 14 | nushell-src = { 15 | url = "github:nushell/nushell/0.108.0"; 16 | flake = false; 17 | }; 18 | 19 | # Nu libraries' sources: 20 | nu-batteries-src = { 21 | url = "github:nome/nu-batteries"; 22 | flake = false; 23 | }; 24 | webserver-nu-src = { 25 | url = "github:Jan9103/webserver.nu"; 26 | flake = false; 27 | }; 28 | }; 29 | 30 | outputs = 31 | { 32 | self, 33 | crane, 34 | nixpkgs, 35 | nushell-src, 36 | ... 37 | }@flake-inputs: 38 | let 39 | # nixpkgs.lib.systems.flakeExposed, minus powerpc64le-linux 40 | supported-systems = [ 41 | "x86_64-linux" 42 | "aarch64-linux" 43 | "x86_64-darwin" 44 | "armv6l-linux" 45 | "armv7l-linux" 46 | "i686-linux" 47 | "aarch64-darwin" 48 | "riscv64-linux" 49 | "x86_64-freebsd" 50 | ]; 51 | in 52 | { 53 | lib = import ./nix-src/lib.nix crane; 54 | 55 | # Makes the flake directly usable as a function: 56 | __functor = _: self.lib.nushellWith; 57 | 58 | overlays.default = 59 | finalPkgs: prevPkgs: 60 | let 61 | craneLib = crane.mkLib prevPkgs; 62 | in 63 | self.lib.mkLib finalPkgs 64 | // { 65 | inherit craneLib; 66 | nushell = finalPkgs.callPackage ./nix-src/nushell.nix { inherit craneLib nushell-src; }; 67 | nushellWithStdPlugins = finalPkgs.nushellWith { 68 | name = "nushell-with-std-plugins"; 69 | plugins.nix = with finalPkgs.nushellPlugins; [ 70 | formats 71 | gstat 72 | polars 73 | query 74 | ]; 75 | }; 76 | nushellMCP = finalPkgs.nushellWith { 77 | name = "nushell-mcp"; 78 | features = [ "mcp" ]; 79 | }; 80 | } 81 | // import ./nix-src/nu-libs-and-plugins.nix { 82 | inherit flake-inputs; 83 | pkgs = finalPkgs; 84 | }; 85 | 86 | packages = nixpkgs.lib.genAttrs supported-systems ( 87 | system: 88 | let 89 | pkgs = import nixpkgs { 90 | inherit system; 91 | overlays = [ self.overlays.default ]; 92 | }; 93 | in 94 | { 95 | inherit (pkgs) nushell nushellWithStdPlugins nushellMCP; 96 | # packages cannot export functions. So we hack around by providing 97 | # a derivation that can be used like a function: 98 | nushellWith = pkgs.nushellWithStdPlugins // { 99 | __functor = _: pkgs.nushellWith; 100 | }; 101 | } 102 | // pkgs.nushellLibraries 103 | // nixpkgs.lib.mapAttrs' (name: value: { 104 | name = "nu_plugin_" + name; 105 | inherit value; 106 | }) pkgs.nushellPlugins 107 | ); 108 | 109 | apps = nixpkgs.lib.genAttrs supported-systems ( 110 | system: 111 | let 112 | pkgs = import nixpkgs { inherit system; }; 113 | # We use nu & semver plugin straight from nixpkgs in order to avoid bootstrap problems 114 | # The update-plugin-list.nu script is simple enough to work with any Nushell version >=0.106 115 | nuWithSemver = self.lib.nushellWith { 116 | inherit pkgs; 117 | plugins.nix = [ pkgs.nushellPlugins.semver ]; 118 | }; 119 | script = nuWithSemver.writeNuScriptBin "update-plugin-list" ( 120 | builtins.readFile ./nu-src/update-plugin-list.nu 121 | ); 122 | in 123 | { 124 | update-plugin-list = { 125 | type = "app"; 126 | program = pkgs.lib.getExe script; 127 | }; 128 | } 129 | ); 130 | 131 | checks = nixpkgs.lib.genAttrs supported-systems ( 132 | system: 133 | let 134 | pkgs = import nixpkgs { 135 | inherit system; 136 | overlays = [ self.overlays.default ]; 137 | }; 138 | nonBrokenPlugins = pkgs.lib.filterAttrs (_: deriv: !deriv.meta.broken) pkgs.nushellPlugins; 139 | in 140 | { 141 | allStdPlugins = pkgs.nushellWithStdPlugins.runNuCommand "check-all-std-plugins" { } '' 142 | use std/assert 143 | assert ((plugin list | length) == 4) "4 plugins should be found" 144 | assert (plugin list | all {$in.status == "running"}) "All plugins should be running" 145 | "OK" | save $env.out 146 | ''; 147 | } 148 | // nixpkgs.lib.mapAttrs ( 149 | # For each plugin, check that it can be added to nushell without errors 150 | plugin-name: plugin-deriv: 151 | let 152 | nu = pkgs.nushellWith { 153 | name = "nushell-with-${plugin-name}"; 154 | plugins.nix = [ plugin-deriv ]; 155 | }; 156 | in 157 | nu.runNuCommand "check-${plugin-name}" { } '' 158 | use std/assert 159 | assert ((plugin list | length) == 1) "The plugin should be found" 160 | assert ((plugin list).0.status == "running") "The plugin should be found" 161 | "OK" | save $env.out 162 | '' 163 | ) nonBrokenPlugins 164 | ); 165 | }; 166 | } 167 | -------------------------------------------------------------------------------- /nix-src/nushell-with.nix: -------------------------------------------------------------------------------- 1 | crane: 2 | { 3 | # Obtained from `import nixpkgs {...}` 4 | # Expected to contain a 'nushell' derivation 5 | pkgs, 6 | # How to name the produced derivation 7 | name ? "nushell-wrapper", 8 | # Which plugins to use. Can contain `nix` and `source` attributes (both lists) 9 | plugins ? { }, 10 | # Which nushell libraries to use. Can contain a `source` attribute (a list) 11 | libraries ? { }, 12 | # Which nix paths to add to the PATH, so your shell can use to nix-provided executables 13 | path ? [ ], 14 | # Which Nu experimental options to activate/desactivate 15 | # Each attr must be the name of a Nu experimental option, associated to a bool 16 | experimental-options ? { }, 17 | # Whether to append to the PATH of the parent process or overwrite it for more hermeticity 18 | keep-path ? true, 19 | # A fixed config.nu file to read at startup 20 | config-nu ? null, 21 | # Should we additionally read the user's config at startup, ie: 22 | # 23 | # - source the $HOME/.config/nushell/{config,env}.nu files 24 | # - keep default locations in $NU_LIB_DIRS ($HOME/.config/nushell/scripts and $HOME/.local/share/nushell/completions) 25 | # 26 | # If a config-nu has been given AND source-user-config is true, the former will be sourced BEFORE the latter. 27 | source-user-config ? true, 28 | # Which env.nu file to set at build time (deprecated. Use config-nu for everything instead) 29 | env-nu ? null, 30 | # A sh script describing env vars to add to the nushell process 31 | env-vars-file ? null, 32 | # If true, the produced nu wrapper will put itself in the PATH, so that calling 'nu' within nushell will result in the same environment 33 | self-in-path ? true, 34 | # Extra features to enable for nushell build (in addition to defaults, unless noDefaultFeatures is true) 35 | features ? [], 36 | # Whether to disable default features when building nushell 37 | noDefaultFeatures ? false, 38 | }: 39 | with pkgs.lib; 40 | let 41 | craneLib = crane.mkLib pkgs; 42 | 43 | # Build a custom nushell with specific features if requested, otherwise use pkgs.nushell 44 | nushell = 45 | if features != [] || noDefaultFeatures then 46 | pkgs.nushell.override { inherit features noDefaultFeatures; } 47 | else 48 | pkgs.nushell; 49 | 50 | plugins-with-defs = { 51 | nix = [ ]; 52 | source = [ ]; 53 | } 54 | // plugins; 55 | 56 | libs-with-defs = { 57 | source = [ ]; 58 | } 59 | // libraries; 60 | 61 | # Build the plugins in plugins.source 62 | crane-pkgs = map (src: craneLib.buildPackage { inherit src; }) plugins-with-defs.source; 63 | 64 | plugin-env = pkgs.buildEnv { 65 | name = "${name}-plugin-env"; 66 | paths = plugins-with-defs.nix ++ crane-pkgs; 67 | # Creating and saving the plugin list along with the env: 68 | postBuild = '' 69 | ${nushell}/bin/nu -n --no-std-lib -c \ 70 | "try {ls $out/bin} catch {[]} | where name =~ nu_plugin_ | get name | save $out/plugins.nuon" 71 | ''; 72 | }; 73 | 74 | plugin-env-deriv-name = builtins.replaceStrings [ "/nix/store/" ] [ "" ] plugin-env.outPath; 75 | 76 | edited-config-nu = pkgs.writeText "${name}-config.nu" '' 77 | const NU_LIB_DIRS = ( 78 | ${if source-user-config then ''$NU_LIB_DIRS ++'' else ""} 79 | [${concatStringsSep " " libs-with-defs.source}] 80 | ) 81 | 82 | ${if config-nu != null then builtins.readFile config-nu else ""} 83 | 84 | ${ 85 | if source-user-config then 86 | '' 87 | const def_user_config_file = $nu.default-config-dir | path join config.nu 88 | source (if ($def_user_config_file | path exists) {$def_user_config_file}) 89 | '' 90 | else 91 | "" 92 | } 93 | ''; 94 | 95 | experimental-options-str = builtins.concatStringsSep "," ( 96 | builtins.attrValues ( 97 | builtins.mapAttrs ( 98 | name: value: 99 | let 100 | valueStr = if value then "true" else "false"; 101 | in 102 | "${name}=${valueStr}" 103 | ) experimental-options 104 | ) 105 | ); 106 | 107 | # Nushell needs to be able to write the plugin database (--plugin-config) 108 | # somewhere, even if that dabase is meant to be readonly afterwards 109 | # 110 | # For now we store it in /tmp under the same hash than the 111 | # plugin-env derivation in order to avoid conflicts 112 | wrapper-script = '' 113 | #!${pkgs.runtimeShell} 114 | 115 | self="$(dirname "$(readlink -f "$0")")" 116 | export PATH="${ 117 | concatStringsSep ":" ( 118 | path ++ (if self-in-path then [ "$self" ] else [ ]) ++ (if keep-path then [ "$PATH" ] else [ ]) 119 | ) 120 | }" 121 | 122 | ${if env-vars-file != null then "set -a; source ${env-vars-file}; set +a" else ""} 123 | 124 | plugin_db_dir="/tmp/${plugin-env-deriv-name}" 125 | mkdir -p "$plugin_db_dir" 126 | 127 | ${ 128 | if experimental-options != { } then 129 | "export NU_EXPERIMENTAL_OPTIONS='${experimental-options-str}'" 130 | else 131 | "" 132 | } 133 | 134 | exec ${nushell}/bin/nu \ 135 | --plugins "$(<${plugin-env}/plugins.nuon)" \ 136 | --plugin-config "$plugin_db_dir/plugin-db" \ 137 | --config "${edited-config-nu}" \ 138 | ${ 139 | if env-nu != null then 140 | "--env-config '${builtins.warn "nushellWith: usage of the `env-nu` parameter is deprecated" env-nu}'" 141 | else if source-user-config then 142 | "" 143 | else 144 | "--env-config /dev/null" 145 | } \ 146 | "$@" 147 | ''; 148 | 149 | deriv = pkgs.writeTextFile { 150 | inherit name; 151 | text = wrapper-script; 152 | executable = true; 153 | destination = "/bin/nu"; 154 | }; 155 | 156 | in 157 | deriv // { inherit plugin-env; } 158 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | [![built with garnix](https://img.shields.io/endpoint.svg?url=https%3A%2F%2Fgarnix.io%2Fapi%2Fbadges%2FYPares%2FnushellWith%3Fbranch%3Dnu0.108)](https://garnix.io/repo/YPares/nushellWith) 2 | 3 | # nushellWith 4 | 5 | Build an isolated [nushell](https://www.nushell.sh/) environment with a specific 6 | set of plugins and nu libraries. 7 | 8 | Various Nushell versions and their own compatible plugin set are provided 9 | through different branches on this repository. 10 | 11 | The simplest way to use this flake is via the `nixpkgs` overlay it provides: 12 | 13 | ```nix 14 | { 15 | inputs = { 16 | nushellWith.url = "github:YPares/nushellWith/nu0.108"; # Select which branch (nushell version) to track 17 | # Activating nushellWith.inputs.nixpkgs.follows is *not* recommended 18 | 19 | nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable"; 20 | }; 21 | 22 | outputs = {nushellWith, nixpkgs, ...}: 23 | let pkgs = import nixpkgs { 24 | system = ...; 25 | overlays = [ nushellWith.overlays.default ]; 26 | }; 27 | in { 28 | # Get some stable Nushell version built from nushell's official GitHub repo 29 | # (Nu version depends on which nushellWith branch you use): 30 | nu = pkgs.nushell; 31 | 32 | # A pre-made nushell environment that contains the plugins vendored by the Nushell team: 33 | nuWithStd = pkgs.nushellWithStdPlugins; 34 | 35 | # Create a derivation that packages a Nu library: 36 | myNuLib = pkgs.makeNuLibrary { 37 | name = "my-nu-lib"; 38 | src = ./path/to/folder/containing/lib; 39 | dependencies = [other-nu-lib ...]; 40 | path = ["${pkgs.some-tool}/bin" ...]; 41 | }; 42 | 43 | # Create a Nu environment with specific plugins and libs: 44 | myNushellEnv = pkgs.nushellWith { 45 | name = "my-nushell-wrapper"; 46 | # Choose ANY plugin from crates.io that works with selected nushell version: 47 | plugins.nix = with pkgs.nushellPlugins; [ 48 | formats polars semver skim ... 49 | ]; 50 | # ...or directly use a rust crate which will be built by Nix: 51 | plugins.source = [ 52 | ./some-nu-plugin-crate-without-sysdeps 53 | ]; 54 | # Use libraries packaged by makeNuLibrary, or just use a local folder that 55 | # contains standalone nu modules: 56 | libraries.source = [ 57 | myNuLib 58 | ./folder/containing/nu/modules/without/deps 59 | pkgs.nushellLibraries.nu-batteries 60 | ]; 61 | # Activate/deactivate some Nu experimental options: 62 | experimental-options = { 63 | pipefail = true; 64 | } 65 | # For a more isolated env: 66 | config-nu = ./some/config.nu; # Use a fixed config.nu when nushell starts 67 | source-user-config = false; # Do not additionally read the user's ~/.config/nushell/config.nu 68 | keep-path = false; # Do not expose the parent process' PATH 69 | }; 70 | 71 | # Make an executable out of a Nu script which runs in myNushellEnv: 72 | someNuApp = myNushellEnv.writeNuScriptBin "foo" '' 73 | # ...inlined Nu code that can use the above plugins and libraries... 74 | ''; 75 | # ...or just in vanilla Nushell: 76 | otherNuApp = pkgs.writeNuScriptBin "foo" '' 77 | # ...Nu code... 78 | ''; 79 | 80 | # Use Nu commands that need to access that new env to build derivations: 81 | someDerivation = myNushellEnv.runNuCommand "foo" {} '' 82 | # ...inlined nushell code that can use the above plugins and libraries 83 | # and writes to $env.out... 84 | ''; 85 | otherDerivation = myNushellEnv.runNuScript "bar" {} ./script-that-needs-plugins-and-libs.nu [scriptArg1 scriptArg2 ...]; 86 | }; 87 | } 88 | ``` 89 | 90 | See also the [`examples`](./examples) folder. 91 | 92 | ## Outputs of this flake 93 | 94 | - [`overlays.default`](./flake.nix), to be used as shown above 95 | - [`lib.*`](./nix-src/lib.nix): the underlying implementation of the functions 96 | provided by the overlay. There are just the same, but with an extra `pkgs` 97 | argument each time 98 | - [`packages..*`](./nix-src/nu-libs-and-plugins.nix): the same 99 | derivations as the `pkgs.nushell`, `pkgs.nushellWithStdPlugins`, 100 | `pkgs.nushellLibraries.*` and `pkgs.nushellPlugins.*` provided by the overlay, 101 | but all merged in the same attrset, and with an extra `nu_plugin_` prefix for 102 | the attributes corresponding to plugins. 103 | 104 | ## About the packaged nushell libraries & plugins 105 | 106 | This flake provides as Nix derivations some nushell libraries and plugins, so 107 | you don't have to write nix derivations for them and deal with their own 108 | dependencies. All plugins from crates.io (ie. every crate named `nu_plugin_*`) 109 | are procedurally packaged, but their system dependencies have to be added on a 110 | [case-by-case fashion](./plugin-specifics.nix). 111 | 112 | The [plugin list](./plugin-list.toml) that is used to generate the plugin 113 | derivations is fetched from crates.io. To update it, run: 114 | 115 | ```sh 116 | nix run ".#update-plugin-list" 117 | ``` 118 | 119 | at the root of this repository. Plugins that require too old a version of the 120 | `nu-protocol` crate will be marked as `broken` and will neither be built nor 121 | checked. The Garnix CI which check that all the non-broken plugins can be built 122 | and loaded in latest Nushell on Linux x86_64. The CI will also build Nushell and 123 | the standard plugins on OSX ARM64. 124 | 125 | The `update-plugin-list` script will directly determine the wanted nushell 126 | version from the nushell branch referenced in the `flake.lock` file, so that 127 | plugin list is always constructed with respect to the currently locked nushell 128 | version. 129 | 130 | PRs to add new entries to the list of 131 | [packaged libraries & plugins](./nix-src/nu-libs-and-plugins.nix) are very much 132 | welcome. 133 | 134 | ## About the binary cache 135 | 136 | Installing Nushell and plugins via the `packages` output is a bit less 137 | convenient because everything has to be mashed together under the `packages` 138 | attribute, but it can better exploit the cache provided by Garnix. To use it, 139 | add the following to your own `flake.nix`: 140 | 141 | ```nix 142 | { 143 | nixConfig = { 144 | extra-substituters = [ "https://cache.garnix.io" ]; 145 | extra-trusted-public-keys = [ "cache.garnix.io:CTFPyKSLcx5RMJKfLo5EEPUObbA78b0YQ2DTCJXqr9g=" ]; 146 | }; 147 | 148 | inputs = ... ; 149 | outputs = ... ; 150 | } 151 | ``` 152 | 153 | ## Limitations & important notes 154 | 155 | Only plugins written in Rust can be passed to `plugins.source`, and they will be 156 | built by [`crane`](https://github.com/ipetkov/crane). `plugins.nix` on the other 157 | hand accepts any derivation that builds a proper plugin, ie. that builds a 158 | `$out/bin/nu_plugin_*` executable which implements the 159 | [nu-plugin protocol](https://www.nushell.sh/contributor-book/plugins.html). In 160 | both cases, the plugin executable is automatically discovered by `nushellWith`. 161 | -------------------------------------------------------------------------------- /plugin-list.toml: -------------------------------------------------------------------------------- 1 | ## THIS FILE IS GENERATED AUTOMATICALLY BY update-plugin-list 2 | ## DO NOT EDIT MANUALLY 3 | 4 | [audio_hook] 5 | name = "nu_plugin_audio_hook" 6 | version = "0.105.1" 7 | checksum = "2bde459d7edc9fd14c5ab50e79266de4a974aef5c8a5f30e7720c65f9e9ed843" 8 | nu-plugin-dep = "^0.105.1" 9 | broken = true 10 | 11 | [average] 12 | name = "nu_plugin_average" 13 | version = "0.14.0" 14 | checksum = "12aa2f0550a4a3144a9ac77e6ad348b558e1d6b6983bcd52af4b93a654553192" 15 | nu-plugin-dep = "^0.14.0" 16 | broken = true 17 | 18 | [bash_env] 19 | name = "nu_plugin_bash_env" 20 | version = "0.17.3" 21 | checksum = "ac25af8113d1aad5ca5a6f479c0350c1e09949259022b711043685e42405cb4c" 22 | nu-plugin-dep = "^0.100.0" 23 | broken = true 24 | 25 | [binaryview] 26 | name = "nu_plugin_binaryview" 27 | version = "0.44.0" 28 | checksum = "7547272a6e31a014d98cb5fd016291591e1f0c1c8bd07aba715305711d4c64fe" 29 | nu-plugin-dep = "^0.44.0" 30 | broken = true 31 | 32 | [bio] 33 | name = "nu_plugin_bio" 34 | version = "0.85.0" 35 | checksum = "ac0588919e944534a6931e485d721215636b6c6775762312c7efb4d988ffae16" 36 | nu-plugin-dep = "^0.85.0" 37 | broken = true 38 | 39 | [browse] 40 | name = "nu_plugin_browse" 41 | version = "0.1.0" 42 | checksum = "0cb86687a350a51191778b64b2277d6c1f47828a2599193375b4642604b53d80" 43 | nu-plugin-dep = "^0.108.0" 44 | broken = false 45 | 46 | [cassandra_query] 47 | name = "nu_plugin_cassandra_query" 48 | version = "0.3.0" 49 | checksum = "5df6f7c80e58e21c8df46c0ef4198492994841994bc7aac8e62bb0cd949c9513" 50 | nu-plugin-dep = "^0.101.0" 51 | broken = true 52 | 53 | [charset] 54 | name = "nu_plugin_charset" 55 | version = "0.1.2" 56 | checksum = "d386b6b4ea638a4b987e5f6fcd856ae2aeba3f58c05a2ec933a685bd4b0dffdb" 57 | nu-plugin-dep = "^0.83.1" 58 | broken = true 59 | 60 | [chart] 61 | name = "nu_plugin_chart" 62 | version = "0.44.0" 63 | checksum = "faa81d3fb6a142abb8077cf2b6c9327ecab57c19d41f1d0e5c8883620243db16" 64 | nu-plugin-dep = "^0.44.0" 65 | broken = true 66 | 67 | [chipa_touch] 68 | name = "nu_plugin_chipa_touch" 69 | version = "0.1.0" 70 | checksum = "6f51bfc04ffa40d1b81bdcd9f2ce25308b2fccd063043fba77dd7b6a5aad5cab" 71 | nu-plugin-dep = "^0.107.0" 72 | broken = true 73 | 74 | [clipboard] 75 | name = "nu_plugin_clipboard" 76 | version = "0.102.0" 77 | checksum = "78b47281a130fda6b15c60ccf4fbaf8dcf50ad4ab927de01162c0047bc0ea1cd" 78 | nu-plugin-dep = "^0.102.0" 79 | broken = true 80 | 81 | [cloud] 82 | name = "nu_plugin_cloud" 83 | version = "0.2.9" 84 | checksum = "b3c3ea03f6bd8049c79dfed228b6a8d101694fe585c5116c223183e6b72e9cff" 85 | nu-plugin-dep = "^0.106" 86 | broken = true 87 | 88 | [compress] 89 | name = "nu_plugin_compress" 90 | version = "0.2.9" 91 | checksum = "5d1135d8a9aa606399c6ff9fe7578dd39cdae678b04925525a4ccdf7b4b78191" 92 | nu-plugin-dep = "^0.108.0" 93 | broken = false 94 | 95 | [dbus] 96 | name = "nu_plugin_dbus" 97 | version = "0.14.0" 98 | checksum = "6ae027e03533d66d5bdd063dd3a8c3ae272622c9ea482089278233fbd3025ce8" 99 | nu-plugin-dep = "^0.101.0" 100 | broken = true 101 | 102 | [dcm] 103 | name = "nu_plugin_dcm" 104 | version = "0.8.0" 105 | checksum = "361f557acb2082ce95ee63bdf83d9caeddfb87921cd1d0b0eefdca102fe66ff7" 106 | nu-plugin-dep = "^0.108.0" 107 | broken = false 108 | 109 | [desktop_notifications] 110 | name = "nu_plugin_desktop_notifications" 111 | version = "1.2.8" 112 | checksum = "8c50f3a845478968c2c124000bd104e92c8bb0a320842bcf14b48288c931d11c" 113 | nu-plugin-dep = "^0.102.0" 114 | broken = true 115 | 116 | [dialog] 117 | name = "nu_plugin_dialog" 118 | version = "0.2.0" 119 | checksum = "bdec9788ddc07b4cc3cf7aff1e631976d2c506c831786aa791519ae0823b78d0" 120 | nu-plugin-dep = "^0.78.0" 121 | broken = true 122 | 123 | [dns] 124 | name = "nu_plugin_dns" 125 | version = "4.0.5" 126 | checksum = "004d6a90fb40c079aa894c31122f64b8cce13333a1f98fee8e97b50095cfae9e" 127 | nu-plugin-dep = "^0.108.0" 128 | broken = false 129 | 130 | [emoji] 131 | name = "nu_plugin_emoji" 132 | version = "0.17.0" 133 | checksum = "ecc50db3a8dc853348a3fd635a188b0001397b98866345da4f1bf2b681f4f9b9" 134 | nu-plugin-dep = "^0.108.0" 135 | broken = false 136 | 137 | [endecode] 138 | name = "nu_plugin_endecode" 139 | version = "0.108.0" 140 | checksum = "83c79709d31ccaca7c938b3d0fa67ab4b979d087271322d667bbf07d4b632f2f" 141 | nu-plugin-dep = "^0.108.0" 142 | broken = false 143 | 144 | [explore_ir] 145 | name = "nu_plugin_explore_ir" 146 | version = "0.6.0" 147 | checksum = "172896b7312371c23ecf123eef6b47f9a798d015d2183cd339be5b957eae0c4a" 148 | nu-plugin-dep = "^0.101.0" 149 | broken = true 150 | 151 | [fetch] 152 | name = "nu_plugin_fetch" 153 | version = "0.36.0" 154 | checksum = "89c4c4185f5658606033b2cedc96d657567b6e2a2ee1c40708da1fa9d93428fe" 155 | nu-plugin-dep = "^0.36.0" 156 | broken = true 157 | 158 | [file] 159 | name = "nu_plugin_file" 160 | version = "0.19.1" 161 | checksum = "492d4d8675760f51de84998c7dcdb74ce098db77450719cb75cd5789eb8d8ba9" 162 | nu-plugin-dep = "^0.108.0" 163 | broken = false 164 | 165 | [file_dialog] 166 | name = "nu_plugin_file_dialog" 167 | version = "0.18.0" 168 | checksum = "39302c116ea9d7446c88c2c27ca8d9823d4a416dc16ca1689935933f2f01ff38" 169 | nu-plugin-dep = "^0.108.0" 170 | broken = false 171 | 172 | [formats] 173 | name = "nu_plugin_formats" 174 | version = "0.108.0" 175 | checksum = "46777355fdcc9e8c6f418985dcd30bbbc3610fb0e5a9b38ae9115ba4a1e0aaac" 176 | nu-plugin-dep = "^0.108.0" 177 | broken = false 178 | 179 | [from_beancount] 180 | name = "nu_plugin_from_beancount" 181 | version = "2.0.0" 182 | checksum = "8135f1d225729210a640c17b58739377e535dd9c8e7cc7d03921facbceab87d6" 183 | nu-plugin-dep = "^0.76" 184 | broken = true 185 | 186 | [from_bencode] 187 | name = "nu_plugin_from_bencode" 188 | version = "0.11.0" 189 | checksum = "babe88d96a5b6a74c7141f51175be4985a81c1ff6af6f161d8c7eecf164e966a" 190 | nu-plugin-dep = "^0.93" 191 | broken = true 192 | 193 | [from_bson] 194 | name = "nu_plugin_from_bson" 195 | version = "0.44.0" 196 | checksum = "8d9b5b6d5f9a3af961449ca8466dcac8c5fb9ac9612c5a1d403646ec71c4b3c2" 197 | nu-plugin-dep = "^0.44.0" 198 | broken = true 199 | 200 | [from_dhall] 201 | name = "nu_plugin_from_dhall" 202 | version = "0.0.1" 203 | checksum = "b164dd796476b56187d1ad49ac38732e510ef06857917c38c48e2f4c306390eb" 204 | nu-plugin-dep = "~0" 205 | broken = false 206 | 207 | [from_mp4] 208 | name = "nu_plugin_from_mp4" 209 | version = "0.44.0" 210 | checksum = "e996d0e29836c4d014a7dc5cd56996960e3fab049bc4449de2b033d069504166" 211 | nu-plugin-dep = "^0.44.0" 212 | broken = true 213 | 214 | [from_parquet] 215 | name = "nu_plugin_from_parquet" 216 | version = "0.0.0" 217 | checksum = "8d69234ac8077792e022a46c10a8ed7c5635c53405e2d414a9c110eefe86a6e1" 218 | nu-plugin-dep = "^0.26.0" 219 | broken = true 220 | 221 | [from_sqlite] 222 | name = "nu_plugin_from_sqlite" 223 | version = "0.44.0" 224 | checksum = "abf7ebf576ff1387f6003250e7923e122827971e1d468cb0e6d258746acdb185" 225 | nu-plugin-dep = "^0.44.0" 226 | broken = true 227 | 228 | [from_sse] 229 | name = "nu_plugin_from_sse" 230 | version = "0.101.0" 231 | checksum = "c3597446def61a102f4a20ec5b8fc07554727902c370887f23353a6b49a8f260" 232 | nu-plugin-dep = "^0.101.0" 233 | broken = true 234 | 235 | [gstat] 236 | name = "nu_plugin_gstat" 237 | version = "0.108.0" 238 | checksum = "2c4882aebe52cab63a08846b07ccbe89409eb74db5692242037769539f01854f" 239 | nu-plugin-dep = "^0.108.0" 240 | broken = false 241 | 242 | [hashes] 243 | name = "nu_plugin_hashes" 244 | version = "0.1.9" 245 | checksum = "fe043e6186196ae6c75f2d016457e4e359ad6dcb586bccd919b8a30b87a9248c" 246 | nu-plugin-dep = "^0.107.0" 247 | broken = true 248 | 249 | [hcl] 250 | name = "nu_plugin_hcl" 251 | version = "0.108.0" 252 | checksum = "75e0811c67c7c947a743fd84d450de35b7b9869ec28e23a8e90d3ae33a0aaeae" 253 | nu-plugin-dep = "^0.108.0" 254 | broken = false 255 | 256 | [highlight] 257 | name = "nu_plugin_highlight" 258 | version = "1.4.10+0.108.0" 259 | checksum = "77557ab87307df48d77718603dfc1e977644b1152cd86cea5a287b6f642e0d83" 260 | nu-plugin-dep = "^0.108.0" 261 | broken = false 262 | 263 | [hmac] 264 | name = "nu_plugin_hmac" 265 | version = "0.22.0" 266 | checksum = "7cbd6e6a9bc0fb0393f8f342f219a076cfd27c7af8533c6c5c8d7d1558303573" 267 | nu-plugin-dep = "^0.108.0" 268 | broken = false 269 | 270 | [id3] 271 | name = "nu_plugin_id3" 272 | version = "0.3.0" 273 | checksum = "d6aca7021893530bf8122760d09b221d045742ccffb805b54f5c5fb50e5331c7" 274 | nu-plugin-dep = "^0.26.0" 275 | broken = true 276 | 277 | [inc] 278 | name = "nu_plugin_inc" 279 | version = "0.108.0" 280 | checksum = "1b9ca399cdd72de82f23ace3bc970a27bc61ff8393c108c30cff796f86d74bf3" 281 | nu-plugin-dep = "^0.108.0" 282 | broken = false 283 | 284 | [json_path] 285 | name = "nu_plugin_json_path" 286 | version = "0.18.0" 287 | checksum = "5424d55162a3315090f2f0f7c56e13426d6eb54dc002928da761319ce68fe69a" 288 | nu-plugin-dep = "^0.108.0" 289 | broken = false 290 | 291 | [jwalk] 292 | name = "nu_plugin_jwalk" 293 | version = "0.20.0" 294 | checksum = "d2d3e73096d2312c4c4dcd4a77f0e26d92bcedf7ba11d2b8c338bf3fe4010247" 295 | nu-plugin-dep = "^0.108.0" 296 | broken = false 297 | 298 | [ls_colorize] 299 | name = "nu_plugin_ls_colorize" 300 | version = "1.0.0+0.108.0" 301 | checksum = "a85876d56b38da3cb745e3c6cb297e16efcf69a309ed0dbf5a78fb7393a15d52" 302 | nu-plugin-dep = "^0.108.0" 303 | broken = false 304 | 305 | [match] 306 | name = "nu_plugin_match" 307 | version = "0.44.0" 308 | checksum = "756a3165e505d135baacaba52e1235bab357bbe8748a9547448d738c044c7ac1" 309 | nu-plugin-dep = "^0.44.0" 310 | broken = true 311 | 312 | [mongo] 313 | name = "nu_plugin_mongo" 314 | version = "0.1.8" 315 | checksum = "2ee0ee725f6ff9d53939efee24232f7f802a01673e7e25d4fb8969ffee8ed461" 316 | nu-plugin-dep = "^0.107" 317 | broken = true 318 | 319 | [net] 320 | name = "nu_plugin_net" 321 | version = "1.10.0" 322 | checksum = "f92c838da0eaa5672d2d46a5d6a3ca300c0a46ebfa0da14a4dee05a7b751e166" 323 | nu-plugin-dep = "^0.104.0" 324 | broken = true 325 | 326 | [nuts] 327 | name = "nu_plugin_nuts" 328 | version = "0.1.0" 329 | checksum = "dd3138d5b50ed7df40863c0699aff352f91943cca86d1d9b2c6f5cef214479ea" 330 | nu-plugin-dep = "^0.103.0" 331 | broken = true 332 | 333 | [nw_ulid] 334 | name = "nu_plugin_nw_ulid" 335 | version = "0.1.1" 336 | checksum = "f71fc6cd1114345e2daaedc610e7f448f3bf8099cab92c02b1897dc9de16dba7" 337 | nu-plugin-dep = "^0.106.1" 338 | broken = true 339 | 340 | [parquet] 341 | name = "nu_plugin_parquet" 342 | version = "0.18.0" 343 | checksum = "b8a8fe57bd093868d108219280afecd6c3841ff3e33b9cd9e3fdb5c4dba09b3a" 344 | nu-plugin-dep = "^0.108.0" 345 | broken = false 346 | 347 | [periodic_table] 348 | name = "nu_plugin_periodic_table" 349 | version = "0.2.12" 350 | checksum = "31db4cb69156bc7eb84653b36c06384833835da40842ed8677709ca220783ff4" 351 | nu-plugin-dep = "^0.106.1" 352 | broken = true 353 | 354 | [plist] 355 | name = "nu_plugin_plist" 356 | version = "0.96.0" 357 | checksum = "da9cd35bb47c4721ceb8ae4182cd1a9afc72481067c7a5e6ae99b943db53d562" 358 | nu-plugin-dep = "^0.96" 359 | broken = true 360 | 361 | [plot] 362 | name = "nu_plugin_plot" 363 | version = "0.74.0" 364 | checksum = "4fb363dcf2ba88a1446af269aa4a57743a39405bb52be57d14246fc9d01f3a59" 365 | nu-plugin-dep = "^0.74.0" 366 | broken = true 367 | 368 | [plotters] 369 | name = "nu_plugin_plotters" 370 | version = "0.2.3+0.108.0" 371 | checksum = "f5a42a4bf9dbce288be31655ada0353e99e228f050dddb188ad4319b39590693" 372 | nu-plugin-dep = "^0.108.0" 373 | broken = false 374 | 375 | [polars] 376 | name = "nu_plugin_polars" 377 | version = "0.108.0" 378 | checksum = "5467429347956d41a13640853eb9a9dd0b00acac5decb6579ed63638a26d2c3e" 379 | nu-plugin-dep = "^0.108.0" 380 | broken = false 381 | 382 | [port_extension] 383 | name = "nu_plugin_port_extension" 384 | version = "0.102.1" 385 | checksum = "b035c1c68ee1a0156a34b6f94689b216eb43a2fc0cec2420ed7f96b91e169133" 386 | nu-plugin-dep = "^0.102.0" 387 | broken = true 388 | 389 | [port_list] 390 | name = "nu_plugin_port_list" 391 | version = "1.4.7" 392 | checksum = "cc84569d24dddcacf6a010da44836545e958dbb2e47ef6c41b1b7bd4d4d6b166" 393 | nu-plugin-dep = "^0.102.0" 394 | broken = true 395 | 396 | [port_scan] 397 | name = "nu_plugin_port_scan" 398 | version = "1.2.8" 399 | checksum = "13ccfd2e71d13032b2375fac00378fcd3c529c3d4df64a095824324c403862f2" 400 | nu-plugin-dep = "^0.102.0" 401 | broken = true 402 | 403 | [post] 404 | name = "nu_plugin_post" 405 | version = "0.36.0" 406 | checksum = "46308b92be95b365317f57fcddd3e9c667d026b62488f4f470b1a82304813638" 407 | nu-plugin-dep = "^0.36.0" 408 | broken = true 409 | 410 | [prometheus] 411 | name = "nu_plugin_prometheus" 412 | version = "0.9.0" 413 | checksum = "de9bb8d552d67df18934bb33fee801553abd55f7fbb1fa6e75006dba8c345b23" 414 | nu-plugin-dep = "^0.104.0" 415 | broken = true 416 | 417 | [ps] 418 | name = "nu_plugin_ps" 419 | version = "0.36.0" 420 | checksum = "7d659fd05ebc0053f2ed931162a39b96041b7a7a201bc07dbf3050bd755386c3" 421 | nu-plugin-dep = "^0.36.0" 422 | broken = true 423 | 424 | [qr] 425 | name = "nu_plugin_qr" 426 | version = "0.1.0" 427 | checksum = "f0195a95517c57add6413d25fee4176fd214dd7c699ebb7f2b890fb458f31a13" 428 | nu-plugin-dep = "^0.83.1" 429 | broken = true 430 | 431 | [qr_maker] 432 | name = "nu_plugin_qr_maker" 433 | version = "1.0.3" 434 | checksum = "60a445997b691d92a546015c21cd77bd2c4a7b60b7260fe797a867f04a1de9b4" 435 | nu-plugin-dep = "^0.90.1" 436 | broken = true 437 | 438 | [query] 439 | name = "nu_plugin_query" 440 | version = "0.108.0" 441 | checksum = "bf57ea762edec5b64baa55f35602039344d9f8c76fb0efdf00877f53c989d713" 442 | nu-plugin-dep = "^0.108.0" 443 | broken = false 444 | 445 | [query_git] 446 | name = "nu_plugin_query_git" 447 | version = "0.17.0" 448 | checksum = "793771a8a422e09c56bb4ff9a0f2675fdab167eba0834ea46effff901ca8856f" 449 | nu-plugin-dep = "^0.108.0" 450 | broken = false 451 | 452 | [query_json] 453 | name = "nu_plugin_query_json" 454 | version = "0.44.0" 455 | checksum = "e2831553e1dd54862ad3be5f8c4bfad003265dcbf85fd66029f97dac517decfb" 456 | nu-plugin-dep = "^0.44.0" 457 | broken = true 458 | 459 | [regex] 460 | name = "nu_plugin_regex" 461 | version = "0.17.0" 462 | checksum = "1cfb02c0bb5a739e64fa965cacb873b0f162a369124b3f3e282480465c365b67" 463 | nu-plugin-dep = "^0.108.0" 464 | broken = false 465 | 466 | [roaring] 467 | name = "nu_plugin_roaring" 468 | version = "0.1.6" 469 | checksum = "8f87745fdb0d92342e695e4318ba639c0355cf3830b679baab6cb4e80dacd243" 470 | nu-plugin-dep = "^0.108.0" 471 | broken = false 472 | 473 | [ron] 474 | name = "nu_plugin_ron" 475 | version = "0.1.1" 476 | checksum = "65fbd3aae350085bd4cfed4cf83ee78150953a1ff830dc93a88a09c58412a136" 477 | nu-plugin-dep = "^0.85.0" 478 | broken = true 479 | 480 | [rpm] 481 | name = "nu_plugin_rpm" 482 | version = "0.3.6" 483 | checksum = "4c97d6a0d8199d783e9fd05d17f0417344b2dc066576d67477934104fbfa25ec" 484 | nu-plugin-dep = "^0.108.0" 485 | broken = false 486 | 487 | [s3] 488 | name = "nu_plugin_s3" 489 | version = "0.44.0" 490 | checksum = "54be0dde1828e27864daefb61b87cfe842038a0a7831389f474a22f2c725ba46" 491 | nu-plugin-dep = "^0.44.0" 492 | broken = true 493 | 494 | [secret] 495 | name = "nu_plugin_secret" 496 | version = "0.4.0" 497 | checksum = "585e49293c7ac4856907a1b31fbd71a772ad9b4128b1c7c76b27c2f7a187b2cd" 498 | nu-plugin-dep = "^0.106.1" 499 | broken = true 500 | 501 | [selector] 502 | name = "nu_plugin_selector" 503 | version = "0.44.0" 504 | checksum = "5eb7a810316795d6276a7c91e065d99a0d6b876079579cd871b2d91db20f25da" 505 | nu-plugin-dep = "^0.44.0" 506 | broken = true 507 | 508 | [semver] 509 | name = "nu_plugin_semver" 510 | version = "0.11.8" 511 | checksum = "ff8522b26ede0da6b5c2a8b5c37d23e9681e2a4c353b2911c962db32e82c6590" 512 | nu-plugin-dep = "^0.108.0" 513 | broken = false 514 | 515 | [skim] 516 | name = "nu_plugin_skim" 517 | version = "0.20.1" 518 | checksum = "afb58b926397de69cc0d1a4770ea4ee3579bac366ed116e49a1d27362f067740" 519 | nu-plugin-dep = "^0.108" 520 | broken = false 521 | 522 | [sled] 523 | name = "nu_plugin_sled" 524 | version = "0.1.3" 525 | checksum = "182fe6e6cf0acf8b0db82d5440e2db7884667981c206fee04c49a2e037569bd2" 526 | nu-plugin-dep = "^0.104.0" 527 | broken = true 528 | 529 | [start] 530 | name = "nu_plugin_start" 531 | version = "0.44.0" 532 | checksum = "06a6397a29dbc8c53294c853d9cea881a60f816b331d4810e3deb7e24b581709" 533 | nu-plugin-dep = "^0.44.0" 534 | broken = true 535 | 536 | [str] 537 | name = "nu_plugin_str" 538 | version = "0.14.0" 539 | checksum = "3ca144db60a6d98112d5d63ca062e5f436a84359e597603a6e3f5f5c168b1331" 540 | nu-plugin-dep = "^0.14.0" 541 | broken = true 542 | 543 | [str_similarity] 544 | name = "nu_plugin_str_similarity" 545 | version = "0.7.0" 546 | checksum = "e333acc2e62df6224fa0ba1342e7bacfe81820cf859d057c8b309d1dda3f9e2e" 547 | nu-plugin-dep = "^0.98.0" 548 | broken = true 549 | 550 | [strutils] 551 | name = "nu_plugin_strutils" 552 | version = "0.16.0" 553 | checksum = "7eebe0364394e169547fa873608334dd8ecdd1ed90a6e833553be792773ec622" 554 | nu-plugin-dep = "^0.108.0" 555 | broken = false 556 | 557 | [sum] 558 | name = "nu_plugin_sum" 559 | version = "0.11.0" 560 | checksum = "78050ee8f2916f1834e7c7cf9c770dafeeac082983e11dffe3b0e63345fb1528" 561 | nu-plugin-dep = "^0.11.0" 562 | broken = true 563 | 564 | [sys] 565 | name = "nu_plugin_sys" 566 | version = "0.36.0" 567 | checksum = "4fe5fe35c8c6b4bcae73dbf97c5a3d24fd79473caa2ab7a74f4a158dd4785a1e" 568 | nu-plugin-dep = "^0.36.0" 569 | broken = true 570 | 571 | [template] 572 | name = "nu_plugin_template" 573 | version = "0.108.0" 574 | checksum = "a22d01eba099feea71e2c6ff46b60e5f72fa6c9ed240dbef631a62716a33018b" 575 | nu-plugin-dep = "^0.108.0" 576 | broken = false 577 | 578 | [textview] 579 | name = "nu_plugin_textview" 580 | version = "0.44.0" 581 | checksum = "87ddbf1478b6b5df6606fde8381e1c6e188182b570ab2851facdc9d0b784559d" 582 | nu-plugin-dep = "^0.44.0" 583 | broken = true 584 | 585 | [to_bson] 586 | name = "nu_plugin_to_bson" 587 | version = "0.44.0" 588 | checksum = "90b57decddafbbfc1806af008dcedf246e3c552284ab6fd0f6c732a831487d00" 589 | nu-plugin-dep = "^0.44.0" 590 | broken = true 591 | 592 | [to_sqlite] 593 | name = "nu_plugin_to_sqlite" 594 | version = "0.44.0" 595 | checksum = "5235f72e4527a769fb5db529f3b5a1bc27c8655a226cb657ee5bebd78b1aa919" 596 | nu-plugin-dep = "^0.44.0" 597 | broken = true 598 | 599 | [to_xlsx] 600 | name = "nu_plugin_to_xlsx" 601 | version = "0.3.0" 602 | checksum = "ba5730101e0ad9317454612601a7ac37e20bc67646ec85e97dca0f075924816d" 603 | nu-plugin-dep = "^0.106.1" 604 | broken = true 605 | 606 | [tracer] 607 | name = "nu_plugin_tracer" 608 | version = "0.3.0" 609 | checksum = "b4b2c5b6088c17b9976331631b4057229db580c7e7614d290b00cf6fa643227f" 610 | nu-plugin-dep = "" 611 | broken = true 612 | 613 | [tree] 614 | name = "nu_plugin_tree" 615 | version = "0.44.0" 616 | checksum = "8b22efa7e2dca32bf79b732cb024189b15649662b24a5b48edcc0175f5b93521" 617 | nu-plugin-dep = "^0.44.0" 618 | broken = true 619 | 620 | [twitch] 621 | name = "nu_plugin_twitch" 622 | version = "0.1.1" 623 | checksum = "e7a43800bd302e0eeff09d6ca3908bf3f10c3315bc4f8ae2006aa7f012531707" 624 | nu-plugin-dep = "^0.106" 625 | broken = true 626 | 627 | [ulid] 628 | name = "nu_plugin_ulid" 629 | version = "0.17.0" 630 | checksum = "30c191200b8ab40e64a7206c920cc634bc19fd575ced0de7099a6e11b00f610e" 631 | nu-plugin-dep = "^0.108.0" 632 | broken = false 633 | 634 | [units] 635 | name = "nu_plugin_units" 636 | version = "0.1.8" 637 | checksum = "11a9082524998583048bc119bebd9fc00e92074bfa8ddaf71bbf0a2c702e0fe0" 638 | nu-plugin-dep = "^0.106.1" 639 | broken = true 640 | 641 | [unzip] 642 | name = "nu_plugin_unzip" 643 | version = "0.2.1" 644 | checksum = "c63786a75a714727d842a0b1da060b40251944b54c7a483eb548a7ebad146291" 645 | nu-plugin-dep = "^0" 646 | broken = false 647 | 648 | [vec] 649 | name = "nu_plugin_vec" 650 | version = "1.1.6" 651 | checksum = "98f297f831420e10a56998c0d8c6834c849b481e00d76ebf03372e7d516a1d1c" 652 | nu-plugin-dep = "^0.105.1" 653 | broken = true 654 | 655 | [ws] 656 | name = "nu_plugin_ws" 657 | version = "1.0.6" 658 | checksum = "68326861e0151db6fe02e6c8a511848993f83a661163015a20e0b639b4a273d4" 659 | nu-plugin-dep = "^0.107.0" 660 | broken = true 661 | 662 | [x509] 663 | name = "nu_plugin_x509" 664 | version = "0.1.7" 665 | checksum = "884c6a58ab4246331590d96c0f942406ef60965fbdd7a50b56cebe52d64782d1" 666 | nu-plugin-dep = "^0.108.0" 667 | broken = false 668 | 669 | [xpath] 670 | name = "nu_plugin_xpath" 671 | version = "0.44.0" 672 | checksum = "b089d09367b7282db1c9425560eae5b4ba507478627f4ca385e9df6457840ba3" 673 | nu-plugin-dep = "^0.44.0" 674 | broken = true 675 | --------------------------------------------------------------------------------