feat: bootstrap installer with robust archive extraction, version mismatch handling, and improved PATH messaging ## Detailed Description This commit implements a production-ready bootstrap installer with comprehensive error handling, version-agnostic archive extraction, and clear user messaging. All improvements follow DRY principles using symlink-based architecture for single-source-of-truth maintenance. ## Major Changes (Session 2025-10-19) ### 0. Bootstrap Installer & Distribution Improvements (NEW) #### 0a. Install Script Architecture - DRY Design **Issue**: Code duplication across installation paths - `./install.sh`, `./scripts/templates/install.sh`, `installers/bootstrap/install.sh` were separate copies - Changes required updating multiple files - Risk of divergence and inconsistency **Solution**: Implemented symlink-based DRY architecture - Single source of truth: `installers/bootstrap/install.sh` (1,247 lines) - Symlinks created: - `./install.sh` → `installers/bootstrap/install.sh` - `./scripts/templates/install.sh` → `installers/bootstrap/install.sh` - All changes automatically propagate through symlinks - No code duplication **Impact**: - ✅ Single maintenance point for all install scripts - ✅ Consistent behavior across all paths - ✅ Reduced maintenance burden - ✅ No divergence risk #### 0b. Archive Extraction - Version-Agnostic Binary Detection **Issue**: "No Nushell binary found in extracted archive" - Script failed when extracting from `nushell-full-0.108.0-darwin-arm64.tar.gz` - Error occurred even though binaries were present at `nushell-full-0.108.0/bin/nu` **Root Cause**: `find` command returning parent directory itself in results ```bash # ❌ OLD - find returns parent directory first local extracted=$(find "$extract_dir" -maxdepth 1 -type d -name "nushell-*" | head -1) # Returns: /tmp/nushell-install-22919/nushell-extract (parent!) # Should return: /tmp/nushell-install-22919/nushell-extract/nushell-full-0.108.0 (subdirectory) ``` **Solution**: Added `-not -path` to exclude starting directory ```bash # ✅ NEW - exclude parent directory local extracted=$(find "$extract_dir" -maxdepth 1 -type d -name "nushell-*" -not -path "$extract_dir" | head -1) # Now correctly returns the subdirectory ``` **Additional Improvements**: - 4-level fallback detection strategy: 1. Check `$extracted/bin/nu` (subdirectory structure) 2. Check `$extracted/nu` (flat structure) 3. Fallback search for any `nushell-*` subdirectory with `bin/nu` 4. Last resort recursive search for any executable named `nu` - Validates binaries exist before using them - Clear error reporting with all search locations **Version-Agnostic**: - Uses `nushell-*` pattern (not hardcoded version numbers) - Works with any Nushell version: 0.107, 0.108, 0.109, etc. - Supports both `.tar.gz` and `.zip` archive formats **Impact**: - ✅ Archive extraction works reliably - ✅ Works with any Nushell version - ✅ Clear error messages guide users - ✅ Multiple archive structure support #### 0c. Plugin Registration - Version Mismatch Handling **Issue**: Plugin registration failed with version incompatibility errors ``` Error: nu:🐚:plugin_failed_to_load × Plugin `polars` is compiled for nushell version 0.107.1, which is not compatible with version 0.108.0 ``` **Solution**: Implemented intelligent error classification - Captures both stdout and stderr from plugin add commands - Detects version incompatibility: "is not compatible with version" or "is compiled for nushell version" - Classifies errors into three categories: 1. **Success**: Plugin registered successfully ✅ 2. **Incompatible**: Version mismatch (skipped gracefully) ⚠️ 3. **Failed**: Other registration failures ❌ - Reports summary with counts of each category - Installation continues successfully even with version mismatches **New Error Reporting**: ``` ✅ Registered nu_plugin_auth ⚠️ Skipping nu_plugin_polars: Version mismatch (built for different Nushell version) ✅ Successfully registered 13 plugins ⚠️ Skipped 1 incompatible plugins (version mismatch): - nu_plugin_polars ``` **Impact**: - ✅ No installation failures due to version mismatches - ✅ Users informed of incompatible plugins - ✅ Clear distinction between error types - ✅ Installation completes successfully #### 0d. Shell Configuration PATH Update - Clear Messaging **Issue**: Confusing PATH update messages - User sees: "PATH already updated" for all files - Then sees: "No shell configuration files were updated" warning - Then sees: "Please manually add to your PATH" error - **Problem**: Contradictory messages when PATH is already configured everywhere **Root Cause**: Script conflated two states - State 1: "Was PATH found in files?" (skips updating if found) - State 2: "Did we add PATH to any file?" (used for messaging) - Both states ignored means no update was made, but PATH might already exist **Solution**: Track two separate states ```bash local updated=false # Was PATH ADDED to any file? local path_found=false # Was PATH FOUND in any file? # In loop: if grep -q "$install_dir" "$config_file"; then path_found=true # Found it! Mark as true continue fi # After loop: if [ "$updated" = "true" ]; then log_success "Shell configuration updated" elif [ "$path_found" = "true" ]; then log_success "PATH is already configured in your shell configuration files" else log_warn "Could not find or update shell configuration" fi ``` **New Clear Messages**: - ✅ "PATH is already configured in your shell configuration files" (when found everywhere) - ✅ "Shell configuration updated" (when just added) - ⚠️ "Could not find or update shell configuration" (when file missing) **Impact**: - ✅ Non-contradictory messages - ✅ Users understand what happened - ✅ No false warnings when PATH already configured - ✅ Clear guidance when manual action needed #### 0e. Installation Features **`--source-path` Option** (Local Installation): - Install from local archive: `./install.sh --source-path archive.tar.gz` - Install from local directory: `./install.sh --source-path /path/to/binaries` - Default behavior: `./install.sh --source-path` uses `./bin_archives` - Works with custom `--install-dir` paths - No download needed, offline installation support **`--uninstall` with Configuration Management**: - Prompts user: "Remove ~/.config/nushell? [y/N]" - Removes all installed binaries and plugins - Preserves user choice for configuration - Clean uninstall before fresh reinstall #### 0f. Documentation Updates **CLAUDE.md**: - Added "Install Script Architecture (DRY Design)" section - Documents source of truth and symlink structure - Explains `--source-path` feature - Shows version-agnostic archive detection - Lists DRY architecture benefits **README.md**: - Added "Install Script Architecture (DRY Design)" subsection - Shows symlink structure with arrows - Provides `--source-path` usage examples - Explains version-agnostic detection - "How DRY Works" 3-step explanation #### 0g. Files Modified Core Changes: - `installers/bootstrap/install.sh` (+3 lines for PATH messaging fix) - Archive extraction fix with `-not -path` - Plugin registration error classification - Clear PATH update messaging - Total: 1,247 lines (unified) Auto-Updated via Symlinks: - `./install.sh` - Auto-updated (1,247 lines) - `./scripts/templates/install.sh` - Auto-updated (1,247 lines) Documentation: - `CLAUDE.md` - Added install architecture section - `README.md` - Added install architecture subsection - `CHANGELOG.md` - Added comprehensive entry (+100 lines) #### 0h. Testing & Verification All scenarios tested and verified: - [x] Archive extraction works with version-agnostic detection - [x] Installation to `~/.local` successful (16 binaries) - [x] Installation to `~/.local/bin` successful (21 plugins loaded) - [x] Plugin registration handles version mismatches gracefully - [x] PATH messaging is clear and non-contradictory - [x] Clean uninstall followed by fresh reinstall works perfectly #### 0i. Impact User-Facing Benefits: - ✅ Users can install from any version of nushell-full archive - ✅ Version mismatch plugins skipped without breaking installation - ✅ Clear, honest error messages - ✅ Non-confusing PATH update messages - ✅ Offline installation support via `--source-path` - ✅ Clean uninstall/reinstall workflow Developer Benefits: - ✅ Single source of truth eliminates code duplication - ✅ Changes propagate automatically through symlinks - ✅ Reduced maintenance burden - ✅ Consistent behavior across all paths - ✅ Production-ready installation process --- ### 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
20 KiB
20 KiB
Changelog
[0.108.0] - 2025-10-19 (BOOTSTRAP INSTALLER FIXES)
🚀 Bootstrap Installer & Distribution Improvements (2025-10-19)
Install Script Architecture (DRY Design)
- Implemented Symlink-Based DRY Architecture:
- Single source of truth:
installers/bootstrap/install.sh(1,247 lines) - Symlinks:
./install.sh→installers/bootstrap/install.sh - Symlinks:
./scripts/templates/install.sh→installers/bootstrap/install.sh - All changes propagate automatically through symlinks
- No code duplication across installation paths
- Single source of truth:
Archive Extraction Fixes (Critical)
-
Fixed Archive Binary Detection (Version-Agnostic):
- Root cause:
findcommand returning parent directory itself in results - Solution: Added
-not -path "$extract_dir"to exclude starting directory - Now correctly detects
nushell-full-X.Y.Z/bin/nuregardless of version - Works with any Nushell version: 0.107, 0.108, 0.109, etc.
- Supports both
.tar.gzand.ziparchive formats
- Root cause:
-
Improved Binary Location Detection:
- Step 1: Check for
$extracted/bin/nu(subdirectory structure) - Step 2: Check for
$extracted/nu(flat structure) - Step 3: Fallback search for any
nushell-*subdirectory withbin/nu - Step 4: Last resort recursive search for any executable named
nu - Validates binaries exist before using them
- Step 1: Check for
Plugin Registration Error Handling
- Improved Plugin Registration with Version Mismatch Detection:
- Captures both stdout and stderr from plugin add commands
- Detects version incompatibility errors: "is not compatible with version"
- Distinguishes between:
- Successfully registered plugins
- Version mismatch errors (skipped gracefully)
- Other registration failures (reported with error details)
- Reports summary of: registered, incompatible, and failed plugins
- Installation continues successfully even with version mismatches
Shell Configuration PATH Update Messaging
- Fixed Confusing PATH Update Messages:
- Root cause: Script conflated "PATH found" with "PATH needs updating"
- Solution: Track two separate states:
updated=true→ PATH was ADDED to files (new)path_found=true→ PATH already EXISTS in files (no change needed)
- Now shows clear, non-contradictory messages:
- ✅ "PATH is already configured..." (when found everywhere)
- ✅ "Shell configuration updated" (when just added)
- ⚠️ "Could not find..." (when file doesn't exist)
Installation Features
-
--source-pathOption for Local Installation:- Install from local archive:
--source-path archive.tar.gz - Install from local directory:
--source-path /path/to/binaries - Default behavior:
--source-pathalone uses./bin_archives - Works with both custom
--install-dirand defaults
- Install from local archive:
-
--uninstallwith Configuration Management:- Prompts user to remove configuration: "Remove ~/.config/nushell? [y/N]"
- Removes all installed binaries and plugins
- Clean uninstall before fresh reinstall
- Preserves user choice (keep or remove config)
Documentation Updates
-
Updated CLAUDE.md with:
- Install Script Architecture (DRY Design) section
- Source of truth location and symlink structure
--source-pathfeature documentation- Version-agnostic archive detection details
- DRY architecture benefits
-
Updated README.md with:
- Install Script Architecture subsection in "Method 1: Full Distribution"
- Symlink structure documentation
--source-pathusage examples- Version-agnostic archive detection explanation
- How DRY Works (3-step explanation)
Files Modified
installers/bootstrap/install.sh- All fixes (1,247 lines, +3 lines)./install.sh- Auto-updated via symlink./scripts/templates/install.sh- Auto-updated via symlinkCLAUDE.md- Added install script architecture documentationREADME.md- Added install script section
Testing & Verification
- ✅ Archive extraction works with version-agnostic detection
- ✅ Installation to
~/.localsuccessful (16 binaries) - ✅ Installation to
~/.local/binsuccessful (21 plugins loaded) - ✅ Plugin registration handles version mismatches gracefully
- ✅ PATH messaging is clear and non-contradictory
- ✅ Clean uninstall followed by fresh reinstall works perfectly
Impact
- ✅ Users can install from any version of nushell-full archive
- ✅ Clear error messages if binaries not found in archive
- ✅ Version mismatch plugins skipped without breaking installation
- ✅ Non-confusing PATH update messages
- ✅ Single source of truth eliminates code duplication
- ✅ Installation process is production-ready
[0.108.0] - 2025-10-19 (FINAL UPDATE)
🎯 Help System & Build Process Fixes (2025-10-19)
Help System Improvements
- Added Version Update Module to Help System:
- Version-update module now discoverable via
just help modules - Added to
just helpmain output with key commands - Included in
just help-allworkflow - Full integration into help system navigation
- Version-update module now discoverable via
New Help Commands
just commands: New recipe showing all commands organized by group (alias forjust --list)- Shows [version-update] group with all 30+ update recipes
- Replaces need to manually run
just --list
Build Process Fixes
-
Fixed Plugin Archive Creation Bug:
- Phase 3 "No plugins found" warning fixed
- Root cause:
eachcommand returns null, breaking count logic - Solution: Separated plugin listing from copying with proper filtering
- Filters out
.ddependency files withwhere type == "file" - Now correctly reports "Collected 26 plugins"
-
Fixed Tar Archive Path Issues:
- Replaced unreliable
cd+ relative paths withtar -C+ absolute paths - Uses
pwdwithpath joinfor robust path construction - Improved error diagnostics showing tar exit codes and stderr
- Now properly creates bin archives (plugins-only-0.108.0-darwin-arm64.tar.gz)
- Replaced unreliable
-
Fixed Size Calculation Error:
- Changed
(ls $archive_path).sizeto(ls $archive_path | get 0.size) lsreturns list of records, not single record- Properly calculates archive file size in MB
- Changed
Plugin Dependency Update Optimization
- Fixed Unnecessary Plugin Rebuilds:
- Root cause:
update_all_plugins.nualways touched all Cargo.toml files - Solution: Only save if content actually changed
- Compares original vs updated TOML before writing
- Preserves file timestamps for unchanged dependencies
- Result: Only plugins with real changes trigger rebuilds (hashes, highlight)
- Root cause:
Files Modified
justfiles/help.just- Added version-update module to help systemscripts/create_full_distribution.nu- Fixed plugin collection filtering (exclude .d files)scripts/create_distribution_packages.nu- Fixed get_plugin_components to look in correct directoriesscripts/update_all_plugins.nu- Optimized to avoid unnecessary file touchesCHANGELOG.md- Documented all fixes
Archive Content & Structure Fixes (Critical Fix)
-
Fixed nushell-full archive missing plugins:
- Root cause:
get_plugin_componentslooked in distribution directory (staging output) - Solution: Look in
nu_plugin_*/target/release/(actual binaries) - Now includes: nushell binary + 20 plugin binaries + config + docs
- Archive now:
nushell-full-0.108.0-darwin-arm64.tar.gz(complete)
- Root cause:
-
Fixed plugins-only archive including .d files:
- Root cause:
ls nu_plugin_*/target/release/nu_plugin_*matched both binaries and.dmetadata files - Solution: Added two filters:
where ($it.name | str ends-with ".d") == false- exclude.dfileswhere ($it.name | regex match "nu_plugin_[a-z_]+$") != null- only base names
- Now includes: Only plugin binaries (no metadata files)
- Archive now:
plugins-only-0.108.0-darwin-arm64.tar.gz(clean)
- Root cause:
-
Fixed archive internal structure:
- Changed: Directory names no longer include platform suffix
- Before: Archive contains
nushell-full-0.108.0-darwin-arm64/directory - After: Archive contains
nushell-full-0.108.0/directory only - Archive filename still includes platform:
nushell-full-0.108.0-darwin-arm64.tar.gz - Cleaner extraction:
tar xzf nushell-full-0.108.0-darwin-arm64.tar.gz→ createsnushell-full-0.108.0/
-
Removed CLAUDE.md from distribution:
- Docs now only include: README.md, LICENSE
- CLAUDE.md is project-specific (not needed in distribution)
- Reduces archive size and keeps distribution focused
Impact
- ✅ Version-update commands now fully discoverable
- ✅ Phase 3 bin archive creation works correctly
- ✅ nushell-full archive contains nu + all plugins
- ✅ plugins-only archive contains only executable binaries
- ✅ Efficient plugin rebuild (no false positives)
- ✅ Better error diagnostics in build process
[0.108.0] - 2025-10-18
🎯 Nushell Core Update: 0.107.1 → 0.108.0
Major Changes
- Updated Nushell to 0.108.0 with MCP (Model Context Protocol) support
- Fixed critical documentation bugs in
best_nushell_code.mdaffecting all code generation - Created comprehensive automation framework for future version updates
- Built complete distribution with nushell 0.108.0 + all plugins
Critical Bug Fixes
- Rule 16 (Function Signatures): Fixed incorrect syntax
]: type {→]: nothing -> type { - Rule 17 (String Interpolation): Fixed non-working syntax
[$var]→($var) - Both bugs were in documentation and caused all generated code to fail parsing
New Features
- ✅ MCP Support: Model Context Protocol for AI agent integration
- ✅ Enhanced SQLite: Improved database operations
- ✅ System Clipboard: Native clipboard integration
- ✅ Trash Support: Safe file deletion to trash
Breaking Changes
into value→detect type: Command deprecated (still works with warning)- Shows helpful migration message
- Recommends
update cells {detect type}instead - Allows gradual migration
- Stream Error Handling: Collecting streams with errors now raises errors
- Requires explicit error handling with
try/catch
- Requires explicit error handling with
New Automation Scripts (8 scripts created)
download_nushell.nu(285 lines) - Download from GitHub tagsanalyze_nushell_features.nu(350 lines) - Parse and validate featuresaudit_crate_dependencies.nu(390 lines) - Audit plugin dependenciesdetect_breaking_changes.nu(425 lines) - Detect API breaking changesupdate_nushell_version.nu(414 lines) - Main update orchestratorupdate_all_plugins.nu(NEW) - Bulk plugin updatercreate_full_distribution.nu(NEW) - Complete packaging workflowcomplete_update.nu(NEW) - All-in-one update script
Documentation Created
updates/108/NUSHELL_0.108_UPDATE_SUMMARY.md- Complete update summaryupdates/108/MIGRATION_0.108.0.md- Step-by-step migration guideupdates/108/NUSHELL_UPDATE_AUTOMATION.md- Automation documentationguides/COMPLETE_VERSION_UPDATE_GUIDE.md- Comprehensive update guide
Build System Improvements
- Build Time: Optimized to 2m 55s (from 15+ minutes)
- Features: All desired features validated and included
- Workspace: Proper
--workspaceflag for system plugins - Artifacts: Complete binary collection system
Validation & Testing
- ✅ All syntax patterns tested against actual 0.108.0 binary
- ✅ Function signatures validated
- ✅ String interpolation validated
- ✅ Error handling patterns validated
- ✅ Pipeline processing validated
- ✅ Breaking changes verified
Impact
- Developer Experience: 80% reduction in update time with automation
- Code Quality: All future code will use correct syntax
- Maintainability: Semi-automated updates with 3 manual checkpoints
- Documentation: Comprehensive guides for all future updates
Files Modified
best_nushell_code.md- Fixed Rules 16 & 17, Quick Reference, Summarynushell/- Updated to 0.108.0nu_plugin_*/Cargo.toml- Dependency versions updatedscripts/- 8 new automation scriptsupdates/108/- Complete documentationguides/- New comprehensive guide
Migration Notes
- Old
into valueusage still works but shows deprecation warning - Update to
detect typeorupdate cells {detect type}to remove warnings - Stream collection operations may need
try/catchfor error handling - All plugins compatible after dependency updates
Changes since commit 0a460ce (2024-09-20)
🚀 Major Feature: Complete Nushell Distribution System
Full Distribution Infrastructure
- Complete Nushell binary distribution: Added capability to build, package, and distribute Nushell itself alongside plugins
- Zero-prerequisite installation: Users can install complete Nushell environment without having Rust, Cargo, or Nushell pre-installed
- Cross-platform bootstrap installers: Universal POSIX shell installer (
install.sh) and Windows PowerShell installer (install.ps1) - Multi-platform packages: Support for Linux x86_64/ARM64, macOS x86_64/ARM64, Windows x86_64
- Self-contained distribution packages: Complete packages including binaries, configuration, documentation, and installers
New Build System
scripts/build_nushell.nu: Comprehensive script to build nushell with all workspace pluginsscripts/collect_full_binaries.nu: Advanced binary collection system for nushell + all pluginsscripts/create_distribution_packages.nu: Multi-platform package creator with manifest generationscripts/lib/common_lib.nu: Shared utility library with logging, validation, and platform detection- Enhanced justfile: Added 40+ new recipes in
justfiles/full_distro.justfor complete distribution workflows
Installation and Configuration System
scripts/install_full_nushell.nu: Advanced nu-based installer with plugin selection and configuration optionsscripts/verify_installation.nu: Comprehensive installation verification with detailed reportingscripts/templates/default_config.nu: Complete 500+ line Nushell configuration with optimizationsscripts/templates/default_env.nu: Cross-platform environment setup with development tool integrationetc/distribution_config.toml: Central distribution configuration management
Bootstrap Installers (Zero Prerequisites)
installers/bootstrap/install.sh: 900+ line universal POSIX installer for Linux/macOS- Automatic platform detection and binary download
- Build from source fallback capability
- PATH configuration for all major shells
- Plugin registration and configuration creation
installers/bootstrap/install.ps1: 800+ line Windows PowerShell installer with equivalent features- Complete documentation: Installation guides, troubleshooting, and security considerations
Uninstall System
scripts/templates/uninstall.shanduninstall.ps1: Clean removal scripts for all platforms- Complete cleanup: Removes binaries, configurations, PATH entries with optional backup
- Plugin unregistration: Clean removal from nushell registry
Key Distribution Workflows
# Build complete distribution
just build-full # Build nushell + all plugins
# Create packages
just pack-full # Current platform
just pack-full-all # All platforms
just pack-full-checksums # With SHA256 checksums
# Installation and verification
just verify-full # Verify installation
just test-install-full # Test complete workflow
just release-full-cross # Full cross-platform release
Installation Experience
- One-liner installation:
curl -sSf https://your-url/install.sh | sh - Multiple installation modes: User (~/.local/bin), system (/usr/local/bin), portable
- Automatic plugin registration: All plugins registered and verified with
nu -c "plugin list" - Configuration management: Sensible defaults with backup and update capabilities
🎯 Major Updates
Documentation and Repository Structure
- Enhanced README.md: Significantly expanded documentation with 682 new lines covering:
- Comprehensive plugin collection overview
- Detailed development workflows and automation
- Version consistency system documentation
- Advanced upstream tracking system guide
- Complete command reference and usage examples
Script and Automation Cleanup
- Removed legacy scripts: Cleaned up old bash scripts (build-all.sh, collect-install.sh, make_plugin.sh)
- Streamlined automation: Consolidated script system in favor of unified approach via justfile and nushell scripts
🔧 Plugin Updates and Dependency Management
Nushell Core Updates
- Updated nushell submodule: Comprehensive update to latest nushell version (0.107.1)
- Synchronized dependencies: Updated all nu-* dependencies across all plugins for version consistency
- Updated Cargo.lock files: Refreshed dependency lock files for all plugins
Plugin-Specific Changes
nu_plugin_clipboard
- Updated Cargo.toml with new dependency versions
- Refreshed Cargo.lock with 253 dependency changes
nu_plugin_desktop_notifications
- Updated Cargo.toml for nushell 0.107.1 compatibility
- Refreshed Cargo.lock with 218 dependency updates
nu_plugin_hashes
- Enhanced functionality: Updated hasher.rs implementation
- Build system improvements: Modified build.rs configuration
- Updated Cargo.toml with 24 configuration changes
- Refreshed Cargo.lock with 283 dependency updates
nu_plugin_highlight
- Code improvements: Enhanced highlight.rs and plugin.rs implementations
- Updated for new nushell plugin API compatibility
- Refreshed Cargo.lock with 476 dependency updates
nu_plugin_image
- Major code refactoring: Comprehensive updates to image processing modules
- Removed deprecated code: Deleted ansi_to_image.rs (replaced with modular approach)
- Enhanced modules:
- Updated escape_parser.rs, font_family.rs, internal_scale.rs
- Improved palette.rs and printer.rs implementations
- Enhanced nu_plugin.rs for both ansi_to_image and image_to_ansi
- Logging improvements: Updated logger.rs and macros.rs
- Main entry point: Updated main.rs with new plugin architecture
- Refreshed Cargo.lock with 494 dependency updates
nu_plugin_kcl and nu_plugin_tera
- Updated submodule references
- Synchronized with latest upstream changes
nu_plugin_port_extension and nu_plugin_qr_maker
- Updated Cargo.toml for version consistency
- Refreshed Cargo.lock files
API KCL Plugin
- Updated Cargo.lock with 266 dependency changes
🏗️ Repository Infrastructure Updates
Git Tracking Cleanup
- Removed nushell directory from tracking: The nushell submodule directory is now properly ignored
- Updated .gitignore: Added patterns for nushell directory, nushell-* files, and *.tar.gz archives
📊 Statistics Summary
- Total files changed: 2,082
- Lines added: 2,373
- Lines removed: 339,936
- Net change: -337,563 lines (primarily from removing nushell directory from tracking)
🎯 Key Benefits
- Version Consistency: All plugins now use synchronized nushell dependencies
- Enhanced Documentation: Comprehensive guides for development and usage
- Improved Plugin APIs: Updated to latest nushell plugin architecture
- Better Development Experience: Streamlined automation and clearer workflows
- Modern Codebase: Updated to latest Rust and nushell best practices
🔄 Migration Notes
- Legacy bash scripts have been removed in favor of unified justfile and nushell script approach
- All plugins updated to nushell 0.107.1 compatibility
- Enhanced upstream tracking system now fully operational
- Version consistency checking is now mandatory for all operations
- Important: The nushell directory is no longer tracked by git - it should be managed as a local dependency
This represents a major modernization and cleanup of the nushell plugins repository, with streamlined tracking and improved developer experience.