fix: help system integration, build process optimization, and plugin rebuild efficiency ## Detailed Description This commit addresses critical issues in the help system discoverability, build process robustness, and plugin rebuild efficiency. ### 1. Help System Integration (New Feature) **Issue**: Version-update module recipes were not discoverable - Not shown in `just help modules` - Not referenced in `just help` - Not included in help navigation system - Users had to manually run `just --list` to find update commands **Solution**: - Added version-update module to all help outputs - Updated `justfiles/help.just` to document all 30+ version-update recipes - Created new `just commands` recipe as discoverable alias for `just --list` - Integrated version-update into help-all workflow **Impact**: - Version-update commands now fully discoverable via help system - Users can find update commands with: `just help modules`, `just help`, `just commands` - Improved overall help system navigation **Files Modified**: - `justfiles/help.just` (+23 lines) - Added version-update module to help sections - Added to modules list - Added to help-all workflow - New `commands` recipe showing all recipes by group ### 2. Build Process Fixes (Phase 3: Bin Archives) #### 2a. Plugin Archive Collection Bug **Issue**: "No plugins found to package" warning in Phase 3 - Collected 26 plugin binaries but reported 0 - Archive creation skipped because count was wrong **Root Cause**: `each` command returns null, so `| length` returned 0 ```nushell # ❌ OLD - each returns null let plugin_count = (ls nu_plugin_*/target/release/nu_plugin_* | each {|p| cp $p.name $"($temp_dir)/" } | length) # Returns 0! ``` **Solution**: Separated counting from copying with proper filtering ```nushell # ✅ NEW - count before operations let plugins_to_copy = (ls nu_plugin_*/target/release/nu_plugin_* | where type == "file") let plugin_count = ($plugins_to_copy | length) ``` **Impact**: - Now correctly collects and reports 26 plugins - Filters out .d dependency files automatically - Warning eliminated #### 2b. Tar Archive Path Handling **Issue**: Tar command failing silently with relative paths in subshell - `cd $temp_dir` changes context unpredictably - Relative path `../$archive_name` fails in subshell - Archive file not created despite exit code 0 **Root Cause**: Shell context and relative path issues in Nushell `do` block **Solution**: Used `tar -C` with absolute paths instead of `cd` ```nushell # ❌ OLD - unreliable context switching do { cd $temp_dir tar -czf ../$archive_name . } # ✅ NEW - absolute paths, no context switching tar -C $temp_dir -czf $archive_path . ``` **Additional Improvements**: - Absolute path construction using `pwd | path join` - Better error diagnostics with exit code and stderr output - File verification after creation **Impact**: - Tar archives now created successfully - Robust path handling across platforms - Clear error messages for debugging #### 2c. File Size Calculation Type Error **Issue**: Runtime error when calculating archive size ``` Error: The '/' operator does not work on values of type 'list<filesize>' ``` **Root Cause**: `ls` returns list of records, so `.size` was a list ```nushell # ❌ OLD - returns list<filesize> (ls $archive_path).size / 1024 / 1024 # ✅ NEW - returns filesize (ls $archive_path | get 0.size) / 1024 / 1024 ``` **Impact**: - Proper file size calculation in MB - No more type errors **Files Modified**: - `scripts/create_full_distribution.nu` (+58 lines, refactored plugin collection) - Fixed plugin counting logic - Improved path handling with absolute paths - Enhanced error diagnostics ### 3. Plugin Rebuild Optimization **Issue**: All plugins marked for rebuild even when dependencies unchanged - Step 4 (`update_all_plugins.nu`) touched all Cargo.toml files at 01:00:32 - Step 5 saw all files as "newer" than binaries - Marked ALL plugins for rebuild, though cargo only rebuilt changed ones **Root Cause**: Script always saved files, even when no changes made ```nushell # ❌ OLD - always saves, touching file timestamp $updated_content | to toml | save -f $cargo_toml ``` **Solution**: Only save if content actually changed ```nushell # ✅ NEW - compare before writing let original_toml = $content | to toml let new_toml = $updated_content | to toml if $original_toml != $new_toml { $updated_content | to toml | save -f $cargo_toml } ``` **Impact**: - Unchanged files preserve original timestamps - Only plugins with actual dependency changes are rebuilt - Efficient rebuild process with accurate file modification detection **Files Modified**: - `scripts/update_all_plugins.nu` (+12 lines, added content comparison) - Only touches files with real changes - Preserves timestamps for efficiency - Clearer logic and comments ### 4. Documentation **Files Modified**: - `CHANGELOG.md` (+56 lines) - Added comprehensive 2025-10-19 entry - Documented all fixes with root causes - Listed files modified and impact summary ## Technical Details ### Nushell Patterns Used 1. **Proper List Handling**: - `ls` returns list of records, access with `| get 0.size` - Filter with `where type == "file"` to exclude metadata 2. **Absolute Path Construction**: - `pwd | append "path" | path join` for cross-platform paths - Safer than string concatenation with `/` 3. **Content Comparison**: - Compare TOML string representation before saving - Preserves file timestamps for efficiency 4. **Error Diagnostics**: - Capture `stderr` from commands - Report exit codes and error messages separately ## Testing - [x] Help system shows version-update module - [x] `just commands` displays all recipes by group - [x] Phase 3 bin archive creation works - [x] Plugin collection reports correct count (26) - [x] Tar archives created successfully - [x] File size calculated correctly - [x] Plugin rebuild only touches changed files - [x] CHANGELOG updated with all changes ## Files Changed ``` 38 files changed, 2721 insertions(+), 2548 deletions(-) Core Changes: - justfiles/help.just (+23) Help system integration - scripts/create_full_distribution.nu (+58) Build process fixes - scripts/update_all_plugins.nu (+12) Rebuild optimization - CHANGELOG.md (+56) Documentation Dependency Updates: - All plugin Cargo.toml and Cargo.lock files (version consistency) ``` ## Breaking Changes None. These are bug fixes and optimizations that maintain backward compatibility. ## Migration Notes No migration needed. Improvements are transparent to users. ## Related Issues - Help system discoverability - Build process Phase 3 failures - Unnecessary plugin rebuilds - Build process reliability ## Checklist - [x] Changes follow Rust/Nushell idioms - [x] Code is well-commented - [x] Error handling is comprehensive - [x] Documentation is updated - [x] All changes tested - [x] No breaking changes introduced
Hashes for Nushell
A Nushell plugin that adds a collection of 63 cryptographic hash functions from Hashes project.
This plugin's implementation is based on code stolen from the official Nushell repository and on compile-time code generation with a build script.
Excess algorithms can be filtered off by selecting only specific features of the crate.
Installation
To install this plugin with all algorithms available run
cargo install nu_plugin_hashes
plugin add ($env.CARGO_HOME ++ /bin/nu_plugin_hashes)
or on Windows
cargo install nu_plugin_hashes
plugin add ($env.CARGO_HOME ++ /bin/nu_plugin_hashes.exe)
After loading the plugin, execute help hash to list newly added commands
~> help hash
Apply hash function.
...
Subcommands:
hash ascon - Hash a value using the ascon hash algorithm.
hash ascon-a - Hash a value using the ascon-a hash algorithm.
hash belt - Hash a value using the belt hash algorithm.
hash blake2b-512 - Hash a value using the blake2b-512 hash algorithm.
hash blake2s-256 - Hash a value using the blake2s-256 hash algorithm.
hash fsb160 - Hash a value using the fsb160 hash algorithm.
hash fsb224 - Hash a value using the fsb224 hash algorithm.
...
Features
If you only need some algorithms, disable default features and select only those you need
cargo install nu_plugin_hashes --no-default-features --features sha2,streebog
Then check what's installed
~> help hash
Apply hash function.
...
Subcommands:
hash md5 - Hash a value using the md5 hash algorithm.
hash sha224 - Hash a value using the sha224 hash algorithm.
hash sha256 - Hash a value using the sha256 hash algorithm.
hash sha384 - Hash a value using the sha384 hash algorithm.
hash sha512 - Hash a value using the sha512 hash algorithm.
hash sha512-224 - Hash a value using the sha512-224 hash algorithm.
hash sha512-256 - Hash a value using the sha512-256 hash algorithm.
hash streebog256 - Hash a value using the streebog256 hash algorithm.
hash streebog512 - Hash a value using the streebog512 hash algorithm.
Flags:
...
Hashes
The list of implemented algorithms provided by the plugin can be found in the Hashes project repository.
Almost all algorithms from this project are included in this plugin. The
exceptions are MD5 and SHA-256 as they are already present in Nushell, and
those algorithms, that don't implement the Digest trait or require additional
arguments for them to be run.
If you want to import only particular algorithms, build this plugin with those features, which names correspond to the crates, that supply the algorithms you want. Consult this table to match features with required algorithms.
If you disable the default features and forget to enable at least one of them, the plugin won't compile.
Implemetation details
All the functions are implemented via generic code that I borrowed from Nushell source file generic_digest.rs. Help page for each command is generated with a build script. Hashes of the test text for each example are generated during compilation by this script: the test text is fed to each hashing algorithm, and resulting bytes are inserted into examples. This approach isdifferent from Nushell's implementations, where examples are hardcoded as strings. Then, generated examples are tested with nu-plugin-test-support crate. This ensures that the code in examples always behaves exactly as printed.
TODO
Here is a list of things that could not be implemented with code generation
as they don't implement the Digest trait or require additional arguments
to be executed. I doubt that I will ever complete this list so you are welcome
to contribute.
License
This crate is licensed under MIT license.