# Description
This PR improves the installation process of Nushell's Windows Terminal
Profile by adding proper quoting when refilling the path to `nu.exe` and
`nu.ico`.
**Crossref:**
https://github.com/microsoft/terminal/issues/6082#issuecomment-1001226003
**Affected lines:**
222c307648/wix/main.wxs (L278-L282)
Currently, when any part of the installation path of `nu.exe` contains
spaces, the auto-generated profile would contain a truncated path due to
improper quoting. At best, this would cause failures when launching the
profile. At worst, this could lead to executable hijacks.
Assume this default-generated profile with the username "Mantle Bao":
```json
{
"profiles": [
{
"guid": "{47302f9c-1ac4-566c-aa3e-8cf29889d6ab}",
"name": "Nushell",
"commandline": "C:\\Users\\Mantle Bao\\AppData\\Local\\Programs\\nu\\bin\\nu.exe",
"icon": "C:\\Users\\Mantle Bao\\AppData\\Local\\Programs\\nu\\nu.ico",
"startingDirectory": "%USERPROFILE%"
}
]
}
```
And a file named "Mantle" exists under `C:\Users\`:
```nushell
> sudo nu -c `touch C:\Users\Mantle`
> ls `C:\Users\` | find "Mantle" | select name type
╭───┬─────────────────────────────────────────────────┬──────╮
│ # │ name │ type │
├───┼─────────────────────────────────────────────────┼──────┤
│ 0 │ C:\Users\Mantle │ file │
│ 1 │ C:\Users\Mantle Bao │ dir │
╰───┴─────────────────────────────────────────────────┴──────╯
>
```
Launching this profile produces this error in Windows Terminal
1.22.11141.0:
```plain-text
[error 2147942593 (0x800700c1) when launching `C:\Users\Mantle Bao\AppData\Local\Programs\nu\bin\nu.exe']
```

[Looking
up](https://learn.microsoft.com/en-us/windows/win32/debug/system-error-code-lookup-tool)
this error code would yield its name as `ERROR_BAD_EXE_FORMAT`, since
the Windows shell will try to execute `C:\\Users\\Mantle` but not the
actual `nu.exe`.
## Hijacking PoC

# User-Facing Changes
None. It should only affect the installation phase without any
user-facing changes.
# Tests + Formatting
This PR does not modify Rust or Nu code, and all its improvements belong
to the packaging system. Thus, no conventional tests or formatting
apply. But in case there exists preferred ways to test the packaging
process, please inform me of those, and I would make appropriate
changes.
# After Submitting
None. It should only affect the installation phase without any
post-submission edits.
<!--
if this PR closes one or more issues, you can automatically link the PR
with
them by using one of the [*linking
keywords*](https://docs.github.com/en/issues/tracking-your-work-with-issues/linking-a-pull-request-to-an-issue#linking-a-pull-request-to-an-issue-using-a-keyword),
e.g.
- this PR should close #xxxx
- fixes #xxxx
you can also mention related issues, PRs or discussions!
-->
# Description
<!--
Thank you for improving Nushell. Please, check our [contributing
guide](../CONTRIBUTING.md) and talk to the core team before making major
changes.
Description of your pull request goes here. **Provide examples and/or
screenshots** if your changes affect the user experience.
-->
Publishing Nushell to winget has always been a challenge for us, and to
this day, many issues remain unresolved—and some seem almost impossible
to fix. The road to solving these problems may be winding and long, but
it's time for us to set out on this journey.
This PR try to fix the Windows arm64 release binaries and some `winget`
related issues:
- [x] Fixes https://github.com/nushell/nushell/issues/14815: build
Windows arm64 binaries by Windows arm64 runner
- [x] Upgrade WiX Toolset to latest 6.0 version: WiX 3 we used currently
doesn't support arm64 arch and [WiX v4 Security Fixes End Date is
2025/02/05](https://docs.firegiant.com/wix/)
- [x] Update the **nightly** workflow to make it work for all future
releases
- [x] Update the **release** workflow to make it work for all future
releases
- [x] Fixes https://github.com/nushell/nushell/issues/15698
- [x] Fixes https://github.com/nushell/nushell/issues/13719 so that
Nushell should be possible to be installed via winget with both user and
machine scope
- [x] Fixes https://github.com/nushell/nushell/issues/5927
- [x] Try to fix https://github.com/nushell/nushell/issues/14786
- [x] Fixes https://github.com/nushell/nushell/issues/9537
## Related but not planed issues:
- Related https://github.com/nushell/nushell/issues/13017
- Related https://github.com/nushell/nushell/issues/8053
# User-Facing Changes
<!-- List of all changes that impact the user experience here. This
helps us keep track of breaking changes. -->
- Nushell should be possible to be installed via winget with both user
and machine scope and The default should be user scope
- User scope install by winget: `winget install Nushell.Nushell`
- User scope install by msiexec: `msiexec /i
nu-0.104.1-x86_64-pc-windows-msvc.msi /quiet /qn`
- Machine scope install by winget: `winget install Nushell.Nushell
--override 'ALLUSERS=1'`
- Machine scope install by msiexec: `msiexec /i
nu-0.104.1-x86_64-pc-windows-msvc.msi ALLUSERS=1`
- Note that `--scope` flag for `winget install` does not work use
`--override` instead
- Default user scope install dir:
`$'($nu.home-path)\AppData\Local\Programs\nu\'`
- Default machine scope install dir: `C:\Program Files\nu\`
- When a standard user runs the installer and selects "Install for
everyone" (per-machine installation), Windows will automatically trigger
a UAC prompt, the user can enter admin credentials and the installation
will proceed with elevated privileges
- [hustcer/setup-nu](https://github.com/hustcer/setup-nu) should work
for `windows-11-arm` runners
# Tests + Formatting
<!--
Don't forget to add tests that cover your changes.
Make sure you've run and fixed any issues with these commands:
- `cargo fmt --all -- --check` to check standard code formatting (`cargo
fmt --all` applies these changes)
- `cargo clippy --workspace -- -D warnings -D clippy::unwrap_used` to
check that you're using the standard code style
- `cargo test --workspace` to check that all tests pass (on Windows make
sure to [enable developer
mode](https://learn.microsoft.com/en-us/windows/apps/get-started/developer-mode-features-and-debugging))
- `cargo run -- -c "use toolkit.nu; toolkit test stdlib"` to run the
tests for the standard library
> **Note**
> from `nushell` you can also use the `toolkit` as follows
> ```bash
> use toolkit.nu # or use an `env_change` hook to activate it
automatically
> toolkit check pr
> ```
-->
The latest MSI builds are available here:
https://github.com/nushell/nightly/releases/tag/v0.104.1
Actually all the nightly releases were built with latest changes
included: https://github.com/nushell/nightly/releases
`winget` and `msiexec` install tests goes here:
https://github.com/nushell/integrations/pull/49https://github.com/nushell/integrations/actions/runs/14974621061https://github.com/nushell/integrations/actions/runs/14974621054
### Test winget install locally:
- git clone git@github.com:nushell/integrations.git
- User scope install: `winget install -m
manifests\n\Nushell\Nushell\0.104.1\`
- Run: `use tests\common.nu *; check-user-install`
- Machine scope install: `winget install -m
manifests\n\Nushell\Nushell\0.104.1\ --override 'ALLUSERS=1'`
- Run: `use tests\common.nu *; check-local-machine-install`
# After Submitting
<!-- If your PR had any user-facing changes, update [the
documentation](https://github.com/nushell/nushell.github.io) after the
PR is merged, if necessary. This will help us keep the docs up to date.
-->
@fdncred I suggest releasing a patch version after merging this PR (only
the changes of this PR will be included) to ensure that the winget
release process works properly. This way, we can be more confident when
releasing version 0.105.0.
References:
-
https://learn.microsoft.com/en-us/windows/win32/msi/single-package-authoring
-
https://learn.microsoft.com/en-us/windows/package-manager/winget/source#add
-
https://github.com/microsoft/winget-pkgs/blob/master/doc/tools/SandboxTest.md
- https://docs.firegiant.com/quick-start/
-
https://docs.firegiant.com/wix3/tutorial/getting-started/putting-it-to-use/#_top
-
https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/msiexec#set-public-properties
# Description
This PR:
* Updates to the latest cargo-wix
* Changes install method from perMachine to perUser
* Updates HKCU Path vs HKLM Path
* Updates Windows Terminal Fragment Json to be compatible with [their
spec](https://learn.microsoft.com/en-us/windows/terminal/json-fragment-extensions).
* Updates License year from 2022 to 2024
The result of these changes makes our Windows installer no longer prompt
with a UAC dialog and installs the binaries into
`%LocalAppData%\Programs\nu\bin`.
All of this is an attempt to make WinGet releases less error prone.
# User-Facing Changes
<!-- List of all changes that impact the user experience here. This
helps us keep track of breaking changes. -->
# Tests + Formatting
<!--
Don't forget to add tests that cover your changes.
Make sure you've run and fixed any issues with these commands:
- `cargo fmt --all -- --check` to check standard code formatting (`cargo
fmt --all` applies these changes)
- `cargo clippy --workspace -- -D warnings -D clippy::unwrap_used` to
check that you're using the standard code style
- `cargo test --workspace` to check that all tests pass (on Windows make
sure to [enable developer
mode](https://learn.microsoft.com/en-us/windows/apps/get-started/developer-mode-features-and-debugging))
- `cargo run -- -c "use std testing; testing run-tests --path
crates/nu-std"` to run the tests for the standard library
> **Note**
> from `nushell` you can also use the `toolkit` as follows
> ```bash
> use toolkit.nu # or use an `env_change` hook to activate it
automatically
> toolkit check pr
> ```
-->
# After Submitting
<!-- If your PR had any user-facing changes, update [the
documentation](https://github.com/nushell/nushell.github.io) after the
PR is merged, if necessary. This will help us keep the docs up to date.
-->
# Description
The command used to edit the Windows Terminal profiling was failing due
to the `open file | save -f file` metadata safeguard introduced in this
version. With this, the installer is now fixed again.
# Description
Update wix/msi to include nu_plugin_polars. 🤞🏻
# User-Facing Changes
<!-- List of all changes that impact the user experience here. This
helps us keep track of breaking changes. -->
# Tests + Formatting
<!--
Don't forget to add tests that cover your changes.
Make sure you've run and fixed any issues with these commands:
- `cargo fmt --all -- --check` to check standard code formatting (`cargo
fmt --all` applies these changes)
- `cargo clippy --workspace -- -D warnings -D clippy::unwrap_used` to
check that you're using the standard code style
- `cargo test --workspace` to check that all tests pass (on Windows make
sure to [enable developer
mode](https://learn.microsoft.com/en-us/windows/apps/get-started/developer-mode-features-and-debugging))
- `cargo run -- -c "use std testing; testing run-tests --path
crates/nu-std"` to run the tests for the standard library
> **Note**
> from `nushell` you can also use the `toolkit` as follows
> ```bash
> use toolkit.nu # or use an `env_change` hook to activate it
automatically
> toolkit check pr
> ```
-->
# After Submitting
<!-- If your PR had any user-facing changes, update [the
documentation](https://github.com/nushell/nushell.github.io) after the
PR is merged, if necessary. This will help us keep the docs up to date.
-->
# Description
As suggested by @WindSoilder, since plugins can now contain both simple
commands that produce `Value` and commands that produce `PipelineData`
without having to choose one or the other for the whole plugin, this
change merges `stream_example` into `example`.
# User-Facing Changes
All of the example plugins are renamed.
# Tests + Formatting
- 🟢 `toolkit fmt`
- 🟢 `toolkit clippy`
- 🟢 `toolkit test`
- 🟢 `toolkit test stdlib`
# After Submitting
- [ ] Check nushell/nushell.github.io for any docs that match the
command names changed
# Description
Revert installation context of windows terminal profile to per-system,
since installation context of other features are per-system, and having
different installation context creates unnecessary inconsistency.
Installation context change of windows terminal profile to per-user
(#9322) was made to resolve the recent installer verification failure on
winget submission PRs, but the cause of this problem seems to be in
another place (#9513).
For more details, refer discussions in #5812 and #9322.
# User-Facing Changes
Windows terminal profile for nushell will be installed in system
context.
Installation path will be changed as below:
- before: `C:\Users\<user>\AppData\Local\Microsoft\Windows
Terminal\Fragments\nu\nu.json`
- to: `C:\ProgramData\Microsoft\Windows Terminal\Fragments\nu\nu.json`
# Tests + Formatting
Confirmed successful installation of nushell and windows terminal
profile file in windows using below installer that created by release ci
workflow. It also contains changes made in #9513.
Release ci workflow:
https://github.com/wolimst/nushell/actions/runs/5357440849
Installer: https://github.com/wolimst/nushell/releases/tag/0.81.0-test
# Description
Change installation context of the windows terminal profile to
`per-user` from `per-system`.
This change is made because installation validation fails in winget ci
while executing custom action to replace the installation path of
`nu.exe` and `nu.ico` in the windows terminal profile file.
Refer discussions in #5812 and
https://github.com/microsoft/winget-pkgs/pull/106977
- Installation path of the windows terminal profile is changed as below:
- from: `C:\ProgramData\Microsoft\Windows Terminal\Fragments\nu\nu.json`
- to: `C:\Users\<user>\AppData\Local\Microsoft\Windows
Terminal\Fragments\nu\nu.json`
- Custom action to replace the installation path of `nu.exe` and
`nu.ico` in the json file will be executed without privilege escalation
This change is expected to eliminate the validation failure in winget ci
(need to wait until next release to be sure about it), however, it
creates some inconsistency in installation context.
- The windows terminal profile is installed in `per-user` context, other
files / PATH env variable are installed in `per-system` context.
- Building the installer shows a warning about this: `warning LGHT1076 :
ICE91: The file 'WindowsTerminalProfileFile' will be installed to the
per user directory 'WindowsTerminalProfileAppFolder' that doesn't vary
based on ALLUSERS value. This file won't be copied to each user's
profile even if a per machine installation is desired.`
which means: WT profile will be installed only for the user that
executed the installer and it won't be installed for other users in the
system. However, the installer is configured to use `per-system`
context, therefore, other files (such as nushell binary `nu.exe`) will
be installed for all users.
It might be better if we provide options for installation context
(`per-user` or `per-system`) as requested in #5927 in the future, if
that doesn't cause problems in winget ci.
# User-Facing Changes
- Installation path of windows terminal profile will be changed as
above.
- Windows Terminal profile will be installed only for the user that
installed nushell as stated above. The profile should be manually added
for other users if needed.
# Tests + Formatting
No test is added since this change is related to installation process in
Windows and does not contain source code changes.
Following checks are done manually.
### Environment
- OS: Windows 11 Pro 22H2
- Built the installer by referring `.github/workflows/release-pkg.nu`
script
### Checks
- Install: WT profile should be created in
`C:\Users\<user>\AppData\Local\Microsoft\Windows
Terminal\Fragments\nu\nu.json` and it should contain correct path for
`nu.exe` and `nu.ico`.
- [x] Install (WT profile feature enabled)
- [x] Install (WT profile enabled) -> Manually remove the WT profile
file -> Re-run the installer and Repair
- Uninstall: WT profile should be removed.
- [x] Install (WT profile enabled) -> Uninstall
- [x] Install (WT profile enabled) -> Re-run the installer and Modify
(WT profile disabled)
# After Submitting
No relevant documentation to update.
# Description
Nothing changed, just fix some typos
# Tests + Formatting
Don't forget to add tests that cover your changes.
Make sure you've run and fixed any issues with these commands:
- `cargo fmt --all -- --check` to check standard code formatting (`cargo
fmt --all` applies these changes)
- `cargo clippy --workspace -- -D warnings -D clippy::unwrap_used -A
clippy::needless_collect` to check that you're using the standard code
style
- `cargo test --workspace` to check that all tests pass
# After Submitting
If your PR had any user-facing changes, update [the
documentation](https://github.com/nushell/nushell.github.io) after the
PR is merged, if necessary. This will help us keep the docs up to date.
Co-authored-by: Stefan Holderbach <sholderbach@users.noreply.github.com>
* Show icon in Windows 'Add/Remove Programs' control panel
* Add install option for Windows Terminal profile
* Re-create icon because the icon was not shwon in Windows Terminal
Procedure: opened the original file with GIMP and simply overwrited it
* add query json plugin for experimentation
* add some error handling
* closer but Kind::Array is still horked
* unravel the table so the output looks right
* clippy
* added the ability to use gjson modifiers
* first step of making selector
* wip
* wip tests working
* probably good enough for a first pass
* oops, missed something.
* and something else...
* grrrr version errors
* WIP - wix
* Updated wxs to have less. Added less.exe.
* removed binary less.exe since we're downloading it
updated wxs to point to output/* for less.exe
Co-authored-by: Darren Schroeder <fdncred@hotmail.com>