- Cross-platform lockfiles (schema v2).
quiver.locknow pins the Nushell runtime version (when the manifest declares anu-version) and records plugin and nu download artifacts per target triple. At lock time quiver eagerly pins the download URL andasset_sha256for every platform listed in a release's signed checksums file, so the lockfile is identical no matter which OS runsqv install— a Linux install no longer rewrites what a macOS install produced. Each platform additionally records its own extracted-binarysha256for local cache-tamper detection. Plugins whose releases lack a multi-platform checksums file fall back to pinning the current platform only. qv install --frozencan now install the pinned Nushell version and plugin binaries on a fresh platform using the per-platform artifacts recorded in the lockfile, verifying each download against its pinned, signedasset_sha256.
- The lockfile schema is now version 2. Existing v1 lockfiles are read transparently and rewritten to v2 on the next
qv install; the per-platform security hash for plugins (asset_sha256) remains the verification anchor.
qv install --frozenno longer reuses an already-cached plugin binary without verification when the lockfile has no recorded extractedsha256for the current platform (e.g. when the lock was generated on a different OS). In that case it now forces a fresh, signed download and verifies it against the pinnedasset_sha256, so a cached binary is never trusted blindly. Frozen installs are now strictly verified on every platform.- On Windows,
qv runno longer fails withAccess is denied. (os error 5)when the account lacks the symlink-creation privilege. Quiver now creates a hard link for.nu-env/bin/entries before falling back to a file copy, so the project-localnubinary and plugins are executable without Administrator rights or Developer Mode. cloneinstall mode no longer errors withOperation not supportedon filesystems without copy-on-write support (ext4 without reflink, overlayfs, tmpfs — common on CI runners). Module materialization now reflinks per file via thereflink-copycrate and transparently falls back to a standard copy, instead of shelling out tocp --reflink=always.
- Default
install_modenow mirrors uv's link modes:clone(copy-on-write) on macOS, andhardlinkon Linux and Windows. Previously Linux defaulted toclone, which failed on filesystems without reflink support. Override withinstall_modein~/.config/quiver/config.nuon.
- Dependency fetching and installation now runs in parallel via
rayon. Module clones, plugin asset downloads, and module exports all proceed concurrently, significantly reducing install times for projects with multiple dependencies.
qv runnow correctly invokes.nu-env/bin/nuinstead of falling back to the systemnubinary. Previously, the project-local Nushell binary was ignored, meaning scripts could run against the wrong Nushell version.
- Warn users if a dependency requires a
nu-versionincompatible with the package'snu-version. - Use the
tui-scrollviewcrate for scrollviews in the TUI. This fixes a few bugs with the previous implementation.
- A few more situations where the TUI was getting jumbled with
eprintln!commands.
- Updated dependencies.
- TUI was getting messed up with the log since I was using
eprintln!instead of UI elements. - Fixed an issue where it wouldn't warn the user if a
nupackage.tomlwas present.
- Running
qvin a non-project directory will open the TUI and offer to create a new quiver project. Previously it just showed the TUI without any helpful information. - Run
qv -gto edit your global quiver dependencies in the TUI.
- BREAKING: The package manifest is now
nupackage.nuoninstead ofnupackage.toml. The lockfile is also innuonformat. Existing projects must migrate:open nupackage.toml | to nuon --indent 2 | save -f nupackage.nuon rm nupackage.toml rm quiver.lock qv install
- BREAKING: The global Quiver config is now
config.nuon. Navigate to your global quiver config dir and run the following to migrate:open config.toml | to nuon --indent 2 | save -f config.nuon rm config.toml rm quiver.lock qv install -g
- Quiver will warn users with migration instructions when a legacy
nupackage.tomlorconfig.tomlis detected. - Updated the
Cargo.lock. Among other things, this includes the most recent commits to leaves so Nu syntax highlighting in the TUI is better than ever.
- You can now run commands from within the TUI and the results will be shown in the log at the bottom (previously running a command like adding a dep would close the TUI). The command log is hidden by default, can be toggled with
/, and is shown automatically while TUI-triggered commands run. - The TUI Add flow now lets repository modules and plugins choose how to pin the dependency before adding it: auto-detect, tag, branch, or revision.
- The TUI now supports clickable header tabs for switching between Dependencies, Graph, and Add.
- TUI README rendering now uses
leavesfor true Markdown rendering and syntax highlighting for code blocks. - TUI panes and dialogs now use rounded borders, and dependency detail labels are styled for easier scanning.
- The TUI Add page now gives the repository README preview the main pane instead of splitting it with the built-in plugin list.
- The TUI Add tab now opens built-in plugin selection in a focused dialog via
b. - TUI remove confirmation now accepts Enter to confirm and Esc to cancel.
- TUI mouse movement and button release no longer steal focus; focus changes on click or scroll instead.
qvnow launches a TUI where you can manage dependencies for your Quiver project. It includes a dependency graph, README and info viewer for installed dependencies, and an interactive mode to view dependency README's from github before adding them.qv lspnow uses a Ratatui/Crossterm interactive picker, so editor selection works on Windows too.
- Release builds now vendor libgit2 through the
git2crate, avoiding failures from missing or stale system libgit2 installations.
- Project-local commands now discover the nearest enclosing
nupackage.tomlby walking up from the current working directory, so commands likeqv run amazing.nuwork from subdirectories of a Quiver project.
- Improved Windows compatibility for Quiver-managed Nushell binaries by consistently using the platform-specific
.nu-env/bin/nupath (nu.exeon Windows) acrossqvx, generated project env files, plugin registration, and editor LSP configs. - Global Quiver config and lockfile paths now use the platform config directory on windows and
~/.configon macOS/linux. qv lspnow fails clearly on Windows when invoked without explicit editor names, instead of attempting to use the Unix-only interactive picker (hopefully switch to ratatui for this at some point).
qvxnow accepts--nu-version <requirement>and writes that requirement into its ephemeral environment manifest.- When
--nu-versionis not supplied,qvxnow reads the remote module'snupackage.tomlwhen present and reuses itspackage.nu-versionrequirement.
qvxnow runs the environment-local.nu-env/bin/nuwhen Quiver installs or links one, instead of always requiringnuto already be onPATH.
- New
qvxcommand to run remote Nu modules as a tool with an ephemeral env.
hardlinkmode now falls back tocopyinstead of failing.- copy operations now fall back to manual streaming copy when
std::fs::copyhitsPermissionDenied - CI-oriented overrides:
QUIVER_SKIP_NU_INSTALL=1skips.nu-env/bin/nucreation entirely.QUIVER_NU_BIN=/path/to/nuforces Quiver to use a specific Nushell binary.
- GitHub release lookups now:
- send
Authorization: Bearer ...whenGITHUB_TOKENorGH_TOKENis present - cache release metadata within the process
- include the response body and
X-RateLimit-*headers on HTTP 403s
- send
- Global plugin installation. Global plugins are automatically registered to your default
plugin.msgpackzupon installation. They are listed under the[plugins]table in your globalconfig.tomlfor quiver.
- Global module dependencies are now listed under a
[modules]table in the quiver's globalconfig.toml.
- Fixed args for lsp configs. Somehow the previous version worked for Nu <=0.110.
- Since the standard module project structure is
<module-name>/<module-name>, modules are now extracted to.nu-env/modules/<module-name>with the package information going to.nu-env/modules/<module-name>-<version>.dist-info, like in Python. You now only need to typeuse nu-salesforce *in your script instead ofuse nu-salesforce/nu-salesforce *.
- Nu plugins are now registered whenever they are installed, whether that is through
qv run,qv add-plugin, orqv install. This means you can literally just clone a quiver project and runqv run your-project/amazing_things.nuand it will work, even if you are using Nu plugins.
qv runproperly sets the--plugin-configwhen runningnu.- Some issues with plugins being stale in the lockfile when the
nu-versionchanged in thenupackage.toml.
- Quiver will always download the version of nu specified for a project, even if that version matches your current global installation in PATH. Why? Because if we symlink to your version in PATH at Nu 0.110.0, and you update to Nu 0.111.0, the symlink in your project's
.nu-env/bin/will now be at 0.111.0 while your project is still at 0.110.0. - Quiver is now licensed under MIT or Apache 2.0, at your option.
- The logs generated by quiver are more concise, accurate, and helpful
- Added fail-closed checksum verification for downloaded Nushell/plugin release assets.
- Hardened install security by rejecting insecure
http://git sources. - Reworked archive extraction to avoid shell-based extraction and block unsafe archive entries.
- Improved plugin install reliability (semver tag selection,
.tar.xzsupport, stale lockfile detection fixes).
qv install --allow-unsigned(explicit insecure override).qv install --no-build-fallback(disable plugin source-build fallback).[security] require_signed_assets = trueconfig support (default enabled).- Lockfile metadata for plugin release assets:
asset_sha256asset_url
--frozennow enforces strict security behavior:- signed assets required
- unsigned override disabled
- build fallback disabled
- Git cache directory naming now uses SHA-256 of the URL (collision-resistant).
- Cached repo
originis validated to prevent mismatch/reuse of wrong repository. - Core Nushell plugins with a Nu version are installed directly into the shared plugin installs directory.
- Reject insecure dependency sources using
http://(manifest and CLI normalization paths). - Added dependency/plugin/binary name validation to reduce path traversal and unsafe names.
- Checksum source detection supports:
SHA256SUMS,SHA256SUMS.txt,checksums.txt<asset>.sha256
- Checksum parsing supports common formats (POSIX, BSD, single-hash lines).
- Archive extraction protections added (including path traversal/symlink safety checks).
- Plugin installer now handles
.tar.xzrelease assets. - “Latest tag” lookup is now semver-aware (fixes lexicographic tag ordering bugs).
- Stale lockfile detection improved for dependency/plugin changes (including plugin bin changes).
- Plugin linking behavior improved for idempotence and target consistency.
- README now documents supply-chain security model and CI recommendation:
qv install --frozen --no-build-fallback
- Added plugin dependencies via
[dependencies.plugins]andqv add-plugin. - Added support for Nushell core plugins as first-class dependencies (for example
qv add-plugin polars). - Added plugin-aware
qv listandqv removebehavior for project dependencies. - Added
qv init --nu-version <requirement>to pin Nushell version requirements at project creation time. - Added semver enforcement for
package.nu-version, including automatic Nushell install from GitHub releases when no matching local binary is available. - Added plugin post-install guidance (
plugin add/plugin use) after dependency installation. - Added progress bars and colored terminal output for network/download operations.
- Added configurable
install_modein global config (clone,hardlink,copy) for module installation strategy. qv initnow ensures.nu-env/is ignored by Git by creating or updating.gitignore.
- Quiver install artifacts now live under
~/.local/share/quiver/installs/instead of cache paths. - Default install mode is now
cloneon macOS/Linux (with fallback tocopy) andhardlinkon Windows. - Environment generation now uses
.nu-env/config.nu(plus.nu-env/plugins.msgpackz) and aliasesnuwith both--configand--plugin-config. - Core plugin resolution now prefers binaries that match the selected project Nushell install.
- Fixed handling for specific Nushell version downloads and project activation wiring.
- Fixed scaffolding output in generated
mod.nucomments for current environment behavior.
- Removed an unused function from config handling.
- Added repository-local agent guidance in
AGENTS.md.
- Added
qv runto run your nu scripts with the package environment and nu version in.nu-env/bin/. - Added a virtual
nusymlink in the environment bin. This is a step towards managing your version ofnuwith quiver. - Added
qv lspto generate project specific profiles for helix and/or zed since we need to pass inenv.nuso modules can be discovered by the lsp.
- Moved Nushell environment artifacts to
nu-env/, including themodules/subdirectory. - Improved
activate.nuto export a definition ofnuthat loads theenv.nuwith the$NU_LIB_DIRSproperly filled.
- Improved
activate.nureliability.
Nuance is now Quiver, with the executable being qv.
- Removed script dependency installation from quiver.
- Removed
add-script/remove-scriptcommands and.nu_scriptsactivation flow.
- Simplified install, list, hook, and global config flows to module-only behavior.
- Kept lockfile artifact kind support forward-compatible for future dependency kinds (for example plugins).
- Improved project scaffolding by placing
mod.nuin a subdirectory. - Updated hook and instructions for using modules in the scaffolded
mod.nu.
- Script removal functionality.
- Capitalization in README.
- Added first-class script dependencies via
[dependencies.scripts]withnuance add-scriptandnuance remove-script. - Added script installation into
.nu_scripts/from a specific path in a git repo or gist clone URL. - Added lockfile artifact kinds (
module/script) and scriptpathtracking for reproducible frozen installs.
- Switched module declarations from
[dependencies]to[dependencies.modules]. - Updated
activate.nugeneration andnuance hookoutput to support both module and script dependency paths. - Updated module install/activation to detect real module entry paths (including
nupm-style nested layouts) by reading
nupm.nuonmetadata hints and scanning formod.nu, then generatingexport usestatements with the discovered path (for examplenu-salesforce/nu-salesforce).
- Added global module management via
--global/-gfornuance install,nuance add, andnuance remove. - Added generated
.nu_modules/activate.nuoutput fromnuance initandnuance installto make project module activation easier. - Added
nuance hookto print a Nushell env-change hook for automatic project activation. - Added configurable default git provider support for
owner/reposhorthand innuance addviadefault_git_provider.
- Updated README install docs to include Homebrew, shell script, and
miseinstallation methods. - Updated README with badges and general formatting improvements.
- Initial public release.