diff --git a/.github/workflows/typos.yml b/.github/workflows/typos.yml index 2484787cb5..98ace3be57 100644 --- a/.github/workflows/typos.yml +++ b/.github/workflows/typos.yml @@ -10,4 +10,4 @@ jobs: uses: actions/checkout@v4.1.7 - name: Check spelling - uses: crate-ci/typos@v1.23.3 + uses: crate-ci/typos@v1.23.5 diff --git a/Cargo.lock b/Cargo.lock index bf665fc8b9..1c0fd9a954 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2868,7 +2868,7 @@ dependencies = [ [[package]] name = "nu" -version = "0.96.1" +version = "0.96.2" dependencies = [ "assert_cmd", "crossterm", @@ -2922,7 +2922,7 @@ dependencies = [ [[package]] name = "nu-cli" -version = "0.96.1" +version = "0.96.2" dependencies = [ "chrono", "crossterm", @@ -2957,7 +2957,7 @@ dependencies = [ [[package]] name = "nu-cmd-base" -version = "0.96.1" +version = "0.96.2" dependencies = [ "indexmap", "miette", @@ -2969,7 +2969,7 @@ dependencies = [ [[package]] name = "nu-cmd-extra" -version = "0.96.1" +version = "0.96.2" dependencies = [ "fancy-regex", "heck 0.5.0", @@ -2994,7 +2994,7 @@ dependencies = [ [[package]] name = "nu-cmd-lang" -version = "0.96.1" +version = "0.96.2" dependencies = [ "itertools 0.12.1", "nu-engine", @@ -3006,7 +3006,7 @@ dependencies = [ [[package]] name = "nu-cmd-plugin" -version = "0.96.1" +version = "0.96.2" dependencies = [ "itertools 0.12.1", "nu-engine", @@ -3017,7 +3017,7 @@ dependencies = [ [[package]] name = "nu-color-config" -version = "0.96.1" +version = "0.96.2" dependencies = [ "nu-ansi-term", "nu-engine", @@ -3029,7 +3029,7 @@ dependencies = [ [[package]] name = "nu-command" -version = "0.96.1" +version = "0.96.2" dependencies = [ "alphanumeric-sort", "base64 0.22.1", @@ -3139,7 +3139,7 @@ dependencies = [ [[package]] name = "nu-derive-value" -version = "0.96.1" +version = "0.96.2" dependencies = [ "convert_case", "proc-macro-error", @@ -3150,7 +3150,7 @@ dependencies = [ [[package]] name = "nu-engine" -version = "0.96.1" +version = "0.96.2" dependencies = [ "log", "nu-glob", @@ -3161,7 +3161,7 @@ dependencies = [ [[package]] name = "nu-explore" -version = "0.96.1" +version = "0.96.2" dependencies = [ "ansi-str", "anyhow", @@ -3186,14 +3186,14 @@ dependencies = [ [[package]] name = "nu-glob" -version = "0.96.1" +version = "0.96.2" dependencies = [ "doc-comment", ] [[package]] name = "nu-json" -version = "0.96.1" +version = "0.96.2" dependencies = [ "fancy-regex", "linked-hash-map", @@ -3206,7 +3206,7 @@ dependencies = [ [[package]] name = "nu-lsp" -version = "0.96.1" +version = "0.96.2" dependencies = [ "assert-json-diff", "crossbeam-channel", @@ -3227,7 +3227,7 @@ dependencies = [ [[package]] name = "nu-parser" -version = "0.96.1" +version = "0.96.2" dependencies = [ "bytesize", "chrono", @@ -3243,7 +3243,7 @@ dependencies = [ [[package]] name = "nu-path" -version = "0.96.1" +version = "0.96.2" dependencies = [ "dirs", "omnipath", @@ -3252,7 +3252,7 @@ dependencies = [ [[package]] name = "nu-plugin" -version = "0.96.1" +version = "0.96.2" dependencies = [ "log", "nix", @@ -3268,7 +3268,7 @@ dependencies = [ [[package]] name = "nu-plugin-core" -version = "0.96.1" +version = "0.96.2" dependencies = [ "interprocess", "log", @@ -3282,7 +3282,7 @@ dependencies = [ [[package]] name = "nu-plugin-engine" -version = "0.96.1" +version = "0.96.2" dependencies = [ "log", "nu-engine", @@ -3298,7 +3298,7 @@ dependencies = [ [[package]] name = "nu-plugin-protocol" -version = "0.96.1" +version = "0.96.2" dependencies = [ "bincode", "nu-protocol", @@ -3310,7 +3310,7 @@ dependencies = [ [[package]] name = "nu-plugin-test-support" -version = "0.96.1" +version = "0.96.2" dependencies = [ "nu-ansi-term", "nu-cmd-lang", @@ -3328,7 +3328,7 @@ dependencies = [ [[package]] name = "nu-pretty-hex" -version = "0.96.1" +version = "0.96.2" dependencies = [ "heapless", "nu-ansi-term", @@ -3337,7 +3337,7 @@ dependencies = [ [[package]] name = "nu-protocol" -version = "0.96.1" +version = "0.96.2" dependencies = [ "brotli", "byte-unit", @@ -3374,7 +3374,7 @@ dependencies = [ [[package]] name = "nu-std" -version = "0.96.1" +version = "0.96.2" dependencies = [ "log", "miette", @@ -3385,7 +3385,7 @@ dependencies = [ [[package]] name = "nu-system" -version = "0.96.1" +version = "0.96.2" dependencies = [ "chrono", "itertools 0.12.1", @@ -3403,7 +3403,7 @@ dependencies = [ [[package]] name = "nu-table" -version = "0.96.1" +version = "0.96.2" dependencies = [ "fancy-regex", "nu-ansi-term", @@ -3417,7 +3417,7 @@ dependencies = [ [[package]] name = "nu-term-grid" -version = "0.96.1" +version = "0.96.2" dependencies = [ "nu-utils", "unicode-width", @@ -3425,7 +3425,7 @@ dependencies = [ [[package]] name = "nu-test-support" -version = "0.96.1" +version = "0.96.2" dependencies = [ "nu-glob", "nu-path", @@ -3437,7 +3437,7 @@ dependencies = [ [[package]] name = "nu-utils" -version = "0.96.1" +version = "0.96.2" dependencies = [ "crossterm_winapi", "log", @@ -3463,7 +3463,7 @@ dependencies = [ [[package]] name = "nu_plugin_example" -version = "0.96.1" +version = "0.96.2" dependencies = [ "nu-cmd-lang", "nu-plugin", @@ -3473,7 +3473,7 @@ dependencies = [ [[package]] name = "nu_plugin_formats" -version = "0.96.1" +version = "0.96.2" dependencies = [ "eml-parser", "ical", @@ -3486,7 +3486,7 @@ dependencies = [ [[package]] name = "nu_plugin_gstat" -version = "0.96.1" +version = "0.96.2" dependencies = [ "git2", "nu-plugin", @@ -3495,7 +3495,7 @@ dependencies = [ [[package]] name = "nu_plugin_inc" -version = "0.96.1" +version = "0.96.2" dependencies = [ "nu-plugin", "nu-protocol", @@ -3504,7 +3504,7 @@ dependencies = [ [[package]] name = "nu_plugin_polars" -version = "0.96.1" +version = "0.96.2" dependencies = [ "chrono", "chrono-tz 0.9.0", @@ -3538,7 +3538,7 @@ dependencies = [ [[package]] name = "nu_plugin_query" -version = "0.96.1" +version = "0.96.2" dependencies = [ "gjson", "nu-plugin", @@ -3553,7 +3553,7 @@ dependencies = [ [[package]] name = "nu_plugin_stress_internals" -version = "0.96.1" +version = "0.96.2" dependencies = [ "interprocess", "serde", @@ -3679,7 +3679,7 @@ checksum = "830b246a0e5f20af87141b25c173cd1b609bd7779a4617d6ec582abaf90870f3" [[package]] name = "nuon" -version = "0.96.1" +version = "0.96.2" dependencies = [ "chrono", "fancy-regex", @@ -5589,9 +5589,9 @@ dependencies = [ [[package]] name = "shadow-rs" -version = "0.29.0" +version = "0.30.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a600f795d0894cda22235b44eea4b85c2a35b405f65523645ac8e35b306817a" +checksum = "d253e54681d4be0161e965db57974ae642a0b6aaeb18a999424c4dab062be8c5" dependencies = [ "const_format", "is_debug", @@ -5666,9 +5666,9 @@ checksum = "f27f6278552951f1f2b8cf9da965d10969b2efdea95a6ec47987ab46edfe263a" [[package]] name = "similar" -version = "2.5.0" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa42c91313f1d05da9b26f267f931cf178d4aba455b4c4622dd7355eb80c6640" +checksum = "1de1d4f81173b03af4c0cbed3c898f6bff5b870e4a7f5d6f4057d62a7a4b686e" [[package]] name = "simplelog" diff --git a/Cargo.toml b/Cargo.toml index 3d8e3a9385..e60acd2548 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,8 +10,8 @@ homepage = "https://www.nushell.sh" license = "MIT" name = "nu" repository = "https://github.com/nushell/nushell" -rust-version = "1.77.2" -version = "0.96.1" +rust-version = "1.78.0" +version = "0.96.2" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html @@ -183,22 +183,22 @@ windows-sys = "0.48" winreg = "0.52" [dependencies] -nu-cli = { path = "./crates/nu-cli", version = "0.96.1" } -nu-cmd-base = { path = "./crates/nu-cmd-base", version = "0.96.1" } -nu-cmd-lang = { path = "./crates/nu-cmd-lang", version = "0.96.1" } -nu-cmd-plugin = { path = "./crates/nu-cmd-plugin", version = "0.96.1", optional = true } -nu-cmd-extra = { path = "./crates/nu-cmd-extra", version = "0.96.1" } -nu-command = { path = "./crates/nu-command", version = "0.96.1" } -nu-engine = { path = "./crates/nu-engine", version = "0.96.1" } -nu-explore = { path = "./crates/nu-explore", version = "0.96.1" } -nu-lsp = { path = "./crates/nu-lsp/", version = "0.96.1" } -nu-parser = { path = "./crates/nu-parser", version = "0.96.1" } -nu-path = { path = "./crates/nu-path", version = "0.96.1" } -nu-plugin-engine = { path = "./crates/nu-plugin-engine", optional = true, version = "0.96.1" } -nu-protocol = { path = "./crates/nu-protocol", version = "0.96.1" } -nu-std = { path = "./crates/nu-std", version = "0.96.1" } -nu-system = { path = "./crates/nu-system", version = "0.96.1" } -nu-utils = { path = "./crates/nu-utils", version = "0.96.1" } +nu-cli = { path = "./crates/nu-cli", version = "0.96.2" } +nu-cmd-base = { path = "./crates/nu-cmd-base", version = "0.96.2" } +nu-cmd-lang = { path = "./crates/nu-cmd-lang", version = "0.96.2" } +nu-cmd-plugin = { path = "./crates/nu-cmd-plugin", version = "0.96.2", optional = true } +nu-cmd-extra = { path = "./crates/nu-cmd-extra", version = "0.96.2" } +nu-command = { path = "./crates/nu-command", version = "0.96.2" } +nu-engine = { path = "./crates/nu-engine", version = "0.96.2" } +nu-explore = { path = "./crates/nu-explore", version = "0.96.2" } +nu-lsp = { path = "./crates/nu-lsp/", version = "0.96.2" } +nu-parser = { path = "./crates/nu-parser", version = "0.96.2" } +nu-path = { path = "./crates/nu-path", version = "0.96.2" } +nu-plugin-engine = { path = "./crates/nu-plugin-engine", optional = true, version = "0.96.2" } +nu-protocol = { path = "./crates/nu-protocol", version = "0.96.2" } +nu-std = { path = "./crates/nu-std", version = "0.96.2" } +nu-system = { path = "./crates/nu-system", version = "0.96.2" } +nu-utils = { path = "./crates/nu-utils", version = "0.96.2" } reedline = { workspace = true, features = ["bashisms", "sqlite"] } crossterm = { workspace = true } @@ -227,9 +227,9 @@ nix = { workspace = true, default-features = false, features = [ ] } [dev-dependencies] -nu-test-support = { path = "./crates/nu-test-support", version = "0.96.1" } -nu-plugin-protocol = { path = "./crates/nu-plugin-protocol", version = "0.96.1" } -nu-plugin-core = { path = "./crates/nu-plugin-core", version = "0.96.1" } +nu-test-support = { path = "./crates/nu-test-support", version = "0.96.2" } +nu-plugin-protocol = { path = "./crates/nu-plugin-protocol", version = "0.96.2" } +nu-plugin-core = { path = "./crates/nu-plugin-core", version = "0.96.2" } assert_cmd = "2.0" dirs = { workspace = true } tango-bench = "0.5" @@ -313,4 +313,4 @@ bench = false # Run individual benchmarks like `cargo bench -- ` e.g. `cargo bench -- parse` [[bench]] name = "benchmarks" -harness = false \ No newline at end of file +harness = false diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 0000000000..3f161a77f9 --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,29 @@ +# Security Policy + +As a shell and programming language Nushell provides you with great powers and the potential to do dangerous things to your computer and data. Whenever there is a risk that a malicious actor can abuse a bug or a violation of documented behavior/assumptions in Nushell to harm you this is a *security* risk. +We want to fix those issues without exposing our users to unnecessary risk. Thus we want to explain our security policy. +Additional issues may be part of *safety* where the behavior of Nushell as designed and implemented can cause unintended harm or a bug causes damage without the involvement of a third party. + +## Supported Versions + +As Nushell is still under very active pre-stable development, the only version the core team prioritizes for security and safety fixes is the [most recent version as published on GitHub](https://github.com/nushell/nushell/releases/latest). +Only if you provide a strong reasoning and the necessary resources, will we consider blessing a backported fix with an official patch release for a previous version. + +## Reporting a Vulnerability + +If you suspect that a bug or behavior of Nushell can affect security or may be potentially exploitable, please report the issue to us in private. +Either reach out to the core team on [our Discord server](https://discord.gg/NtAbbGn) to arrange a private channel or use the [GitHub vulnerability reporting form](https://github.com/nushell/nushell/security/advisories/new). +Please try to answer the following questions: +- How can we reach you for further questions? +- What is the bug? Which system of Nushell may be affected? +- Do you have proof-of-concept for a potential exploit or have you observed an exploit in the wild? +- What is your assessment of the severity based on what could be impacted should the bug be exploited? +- Are additional people aware of the issue or deserve credit for identifying the issue? + +We will try to get back to you within a week with: +- acknowledging the receipt of the report +- an initial plan of how we want to address this including the primary points of contact for further communication +- our preliminary assessment of how severe we judge the issue +- a proposal for how we can coordinate responsible disclosure (e.g. how we ship the bugfix, if we need to coordinate with distribution maintainers, when you can release a blog post if you want to etc.) + +For purely *safety* related issues where the impact is severe by direct user action instead of malicious input or third parties, feel free to open a regular issue. If we deem that there may be an additional *security* risk on a *safety* issue we may continue discussions in a restricted forum. diff --git a/crates/nu-cli/Cargo.toml b/crates/nu-cli/Cargo.toml index 1be1470daf..54af510916 100644 --- a/crates/nu-cli/Cargo.toml +++ b/crates/nu-cli/Cargo.toml @@ -5,27 +5,27 @@ repository = "https://github.com/nushell/nushell/tree/main/crates/nu-cli" edition = "2021" license = "MIT" name = "nu-cli" -version = "0.96.1" +version = "0.96.2" [lib] bench = false [dev-dependencies] -nu-cmd-lang = { path = "../nu-cmd-lang", version = "0.96.1" } -nu-command = { path = "../nu-command", version = "0.96.1" } -nu-test-support = { path = "../nu-test-support", version = "0.96.1" } +nu-cmd-lang = { path = "../nu-cmd-lang", version = "0.96.2" } +nu-command = { path = "../nu-command", version = "0.96.2" } +nu-test-support = { path = "../nu-test-support", version = "0.96.2" } rstest = { workspace = true, default-features = false } tempfile = { workspace = true } [dependencies] -nu-cmd-base = { path = "../nu-cmd-base", version = "0.96.1" } -nu-engine = { path = "../nu-engine", version = "0.96.1" } -nu-path = { path = "../nu-path", version = "0.96.1" } -nu-parser = { path = "../nu-parser", version = "0.96.1" } -nu-plugin-engine = { path = "../nu-plugin-engine", version = "0.96.1", optional = true } -nu-protocol = { path = "../nu-protocol", version = "0.96.1" } -nu-utils = { path = "../nu-utils", version = "0.96.1" } -nu-color-config = { path = "../nu-color-config", version = "0.96.1" } +nu-cmd-base = { path = "../nu-cmd-base", version = "0.96.2" } +nu-engine = { path = "../nu-engine", version = "0.96.2" } +nu-path = { path = "../nu-path", version = "0.96.2" } +nu-parser = { path = "../nu-parser", version = "0.96.2" } +nu-plugin-engine = { path = "../nu-plugin-engine", version = "0.96.2", optional = true } +nu-protocol = { path = "../nu-protocol", version = "0.96.2" } +nu-utils = { path = "../nu-utils", version = "0.96.2" } +nu-color-config = { path = "../nu-color-config", version = "0.96.2" } nu-ansi-term = { workspace = true } reedline = { workspace = true, features = ["bashisms", "sqlite"] } diff --git a/crates/nu-cli/src/commands/history/history_.rs b/crates/nu-cli/src/commands/history/history_.rs index cdf85eea72..c270cef003 100644 --- a/crates/nu-cli/src/commands/history/history_.rs +++ b/crates/nu-cli/src/commands/history/history_.rs @@ -67,7 +67,7 @@ impl Command for History { } else { let history_reader: Option> = match history.file_format { HistoryFileFormat::Sqlite => { - SqliteBackedHistory::with_file(history_path.clone(), None, None) + SqliteBackedHistory::with_file(history_path.clone().into(), None, None) .map(|inner| { let boxed: Box = Box::new(inner); boxed @@ -77,7 +77,7 @@ impl Command for History { HistoryFileFormat::PlainText => FileBackedHistory::with_file( history.max_size as usize, - history_path.clone(), + history_path.clone().into(), ) .map(|inner| { let boxed: Box = Box::new(inner); @@ -156,58 +156,34 @@ fn create_history_record(idx: usize, entry: HistoryItem, long: bool, head: Span) //2. Create a record of either short or long columns and values let item_id_value = Value::int( - match entry.id { - Some(id) => { - let ids = id.to_string(); - match ids.parse::() { - Ok(i) => i, - _ => 0i64, - } - } - None => 0i64, - }, + entry + .id + .and_then(|id| id.to_string().parse::().ok()) + .unwrap_or_default(), head, ); let start_timestamp_value = Value::string( - match entry.start_timestamp { - Some(time) => time.to_string(), - None => "".into(), - }, + entry + .start_timestamp + .map(|time| time.to_string()) + .unwrap_or_default(), head, ); let command_value = Value::string(entry.command_line, head); let session_id_value = Value::int( - match entry.session_id { - Some(sid) => { - let sids = sid.to_string(); - match sids.parse::() { - Ok(i) => i, - _ => 0i64, - } - } - None => 0i64, - }, - head, - ); - let hostname_value = Value::string( - match entry.hostname { - Some(host) => host, - None => "".into(), - }, - head, - ); - let cwd_value = Value::string( - match entry.cwd { - Some(cwd) => cwd, - None => "".into(), - }, + entry + .session_id + .and_then(|id| id.to_string().parse::().ok()) + .unwrap_or_default(), head, ); + let hostname_value = Value::string(entry.hostname.unwrap_or_default(), head); + let cwd_value = Value::string(entry.cwd.unwrap_or_default(), head); let duration_value = Value::duration( - match entry.duration { - Some(d) => d.as_nanos().try_into().unwrap_or(0), - None => 0, - }, + entry + .duration + .and_then(|d| d.as_nanos().try_into().ok()) + .unwrap_or(0), head, ); let exit_status_value = Value::int(entry.exit_status.unwrap_or(0), head); diff --git a/crates/nu-cli/src/commands/keybindings_list.rs b/crates/nu-cli/src/commands/keybindings_list.rs index 350df7b820..abb5909a97 100644 --- a/crates/nu-cli/src/commands/keybindings_list.rs +++ b/crates/nu-cli/src/commands/keybindings_list.rs @@ -61,10 +61,12 @@ impl Command for KeybindingsList { .map(|option| call.has_flag(engine_state, stack, option)) .collect::, ShellError>>()?; + let no_option_specified = presence.iter().all(|present| !*present); + let records = all_options .iter() .zip(presence) - .filter(|(_, present)| *present) + .filter(|(_, present)| no_option_specified || *present) .flat_map(|(option, _)| get_records(option, call.head)) .collect(); diff --git a/crates/nu-cli/src/completions/command_completions.rs b/crates/nu-cli/src/completions/command_completions.rs index e37f8b2576..f594e3d667 100644 --- a/crates/nu-cli/src/completions/command_completions.rs +++ b/crates/nu-cli/src/completions/command_completions.rs @@ -99,10 +99,9 @@ impl CommandCompletion { suggestion: Suggestion { value: String::from_utf8_lossy(&x.0).to_string(), description: x.1, - style: None, - extra: None, span: reedline::Span::new(span.start - offset, span.end - offset), append_whitespace: true, + ..Suggestion::default() }, kind: Some(SuggestionKind::Command(x.2)), }) @@ -118,11 +117,9 @@ impl CommandCompletion { .map(move |x| SemanticSuggestion { suggestion: Suggestion { value: x, - description: None, - style: None, - extra: None, span: reedline::Span::new(span.start - offset, span.end - offset), append_whitespace: true, + ..Suggestion::default() }, // TODO: is there a way to create a test? kind: None, @@ -136,11 +133,9 @@ impl CommandCompletion { results.push(SemanticSuggestion { suggestion: Suggestion { value: format!("^{}", external.suggestion.value), - description: None, - style: None, - extra: None, span: external.suggestion.span, append_whitespace: true, + ..Suggestion::default() }, kind: external.kind, }) diff --git a/crates/nu-cli/src/completions/completer.rs b/crates/nu-cli/src/completions/completer.rs index 78398b4d19..e794354f09 100644 --- a/crates/nu-cli/src/completions/completer.rs +++ b/crates/nu-cli/src/completions/completer.rs @@ -443,14 +443,11 @@ pub fn map_value_completions<'a>( return Some(SemanticSuggestion { suggestion: Suggestion { value: s, - description: None, - style: None, - extra: None, span: reedline::Span { start: span.start - offset, end: span.end - offset, }, - append_whitespace: false, + ..Suggestion::default() }, kind: Some(SuggestionKind::Type(x.get_type())), }); @@ -460,14 +457,11 @@ pub fn map_value_completions<'a>( if let Ok(record) = x.as_record() { let mut suggestion = Suggestion { value: String::from(""), // Initialize with empty string - description: None, - style: None, - extra: None, span: reedline::Span { start: span.start - offset, end: span.end - offset, }, - append_whitespace: false, + ..Suggestion::default() }; // Iterate the cols looking for `value` and `description` diff --git a/crates/nu-cli/src/completions/completion_common.rs b/crates/nu-cli/src/completions/completion_common.rs index b3bca778a9..5469ba1326 100644 --- a/crates/nu-cli/src/completions/completion_common.rs +++ b/crates/nu-cli/src/completions/completion_common.rs @@ -10,9 +10,7 @@ use nu_protocol::{ levenshtein_distance, Span, }; use nu_utils::get_ls_colors; -use std::path::{ - is_separator, Component, Path, PathBuf, MAIN_SEPARATOR as SEP, MAIN_SEPARATOR_STR, -}; +use std::path::{is_separator, Component, Path, PathBuf, MAIN_SEPARATOR as SEP}; use super::SortBy; @@ -93,16 +91,16 @@ enum OriginalCwd { } impl OriginalCwd { - fn apply(&self, mut p: PathBuiltFromString) -> String { + fn apply(&self, mut p: PathBuiltFromString, path_separator: char) -> String { match self { Self::None => {} Self::Home => p.parts.insert(0, "~".to_string()), Self::Prefix(s) => p.parts.insert(0, s.clone()), }; - let mut ret = p.parts.join(MAIN_SEPARATOR_STR); + let mut ret = p.parts.join(&path_separator.to_string()); if p.isdir { - ret.push(SEP); + ret.push(path_separator); } ret } @@ -133,6 +131,14 @@ pub fn complete_item( ) -> Vec<(nu_protocol::Span, String, Option