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
37 KiB
🚀 Nushell Plugins Repository
Current Nushell Version: 0.108.0 | Last Updated: 2025-10-18
A comprehensive collection of nushell plugins with automated upstream tracking, dependency management, development workflows, complete Nushell distribution system, and semi-automated version update framework.
🎯 Latest Update: Nushell 0.108.0
Major highlights of the 0.108.0 update:
- ✅ MCP Support: Model Context Protocol for AI agent integration
- ✅ Critical Bug Fixes: Fixed documentation syntax errors affecting all code generation
- ✅ Automation Framework: 8 new scripts for semi-automated version updates
- ✅ Complete Documentation: Migration guides, automation docs, and validation reports
- ✅ 80% Faster Updates: Automated workflows with strategic manual checkpoints
→ START HERE: UPDATE.md for version update instructions
See CHANGELOG.md for complete details | Read updates/108/ for full documentation
🆕 NEW: Full Nushell Distribution System
Transform from development complexity to one-liner installation!
This repository provides complete Nushell distributions that include Nushell itself plus all plugins, offering zero-prerequisite installation for end users:
🎯 End User Installation (Zero Prerequisites)
# One-liner installation (Linux/macOS)
curl -sSf https://your-url/install.sh | sh
# Windows PowerShell
iwr https://your-url/install.ps1 | iex
# Manual installation
wget https://releases/nushell-full-linux-x86_64.tar.gz
tar -xzf nushell-full-*.tar.gz && cd nushell-full-* && ./install.sh
🚀 Developer Distribution Commands
just build-full # Build nushell + all plugins
just pack-full # Create distribution package
just pack-full-all # All platforms
just verify-full # Verify installation
just release-full-cross # Complete release workflow
✨ Key Features
- Zero Prerequisites: No Rust, Cargo, or Nu installation required
- Cross-Platform: Linux, macOS, Windows support
- Complete Environment: Nushell + all plugins + configuration
- Professional Installation: Clean install/uninstall experience
- Bootstrap Installers: Production-ready installation scripts
📋 Table of Contents
- Quick Start
- End User Installation
- Full Distribution System
- Why This Repository?
- Plugin Collection
- Building and Cross-Compilation
- Development Workflows
- Upstream Tracking System
- Scripts and Tools
- File Structure
- Installation Methods
- FAQ
- Contributing
🚀 Quick Start
For End Users (Zero Prerequisites)
# One-liner installation
curl -sSf https://your-url/install.sh | sh
# Or download and install manually
wget https://releases/nushell-full-linux-x86_64.tar.gz
tar -xzf nushell-full-*.tar.gz && cd nushell-full-* && ./install.sh
For Developers
Prerequisites
# Install required tools
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh # Rust
cargo install just # Just (optional but recommended)
# Note: Nushell will be auto-installed if missing
Development Workflow
# Clone the repository
git clone <repository-url>
cd nushell-plugins
# Validate nushell version consistency (recommended first step)
just validate-nushell
# Plugin development
just status # Show plugin status
just status-mark-locals-ok # Mark local plugins as OK (recommended)
just upstream-check # Check for upstream updates
just build # Build all plugins
just dev-flow # Complete development workflow
# Distribution creation
just build-nushell # Build nushell + system plugins (uses --workspace flag)
just build-full # Build nushell + system plugins + custom plugins
just collect # Collect nushell + all plugins for distribution
just pack-full # Create distribution package
just release-full-cross # Complete cross-platform release
⚠️ Critical: Version Consistency
This system requires version consistency between your installed nushell and the submodule version. All operations automatically check version consistency and will fail if versions don't match.
- Auto-fix:
just fix-nushellor./scripts/run.sh --fix --check-only - Manual check:
just validate-nushell
🎯 Full Distribution System
What is it?
The Full Distribution System transforms this repository from a development-focused plugin collection into a complete Nushell distribution platform. Instead of requiring users to install Rust, clone repositories, and build plugins, they can now install a complete Nushell environment with a single command.
End User Experience
Before: Complex development setup required
# Users needed to:
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh # Install Rust
git clone repository && cd nushell-plugins # Clone repo
just validate-nushell && just build # Build everything
# ... multiple complex steps
After: Zero-prerequisite installation
# Users now only need:
curl -sSf https://your-url/install.sh | sh # Done!
Distribution Commands
Building Complete Distributions
Step 1: Build Nushell + System Plugins
# Build Nushell with built-in system plugins (uses cargo build --workspace)
just build-nushell # Builds: nu + nu_plugin_formats, nu_plugin_inc, nu_plugin_gstat,
# nu_plugin_query, nu_plugin_polars, nu_plugin_custom_values, etc.
# Build for specific targets
just build-nushell-target linux-arm64 # Cross-compile system plugins
Step 2: Build Everything (System + Custom Plugins)
# Build nushell + system plugins + custom plugins from this repo
just build-full # Native build (calls build-nushell + build custom plugins)
just build-full-cross # Cross-platform build
just build-full-all # All platforms
Step 3: Collect Built Binaries
# Collect nushell binary + all plugins for distribution
just collect # Current platform (darwin-arm64)
just collect-all # All available platforms
just collect-platform PLATFORM # Specific platform
Step 4: Create Distribution Packages
# Create distribution packages
just pack-full # Current platform
just pack-full-all # All platforms
just pack-full-with-installer # Include bootstrap installer
# Verification and testing
just verify-full # Verify distribution integrity
just test-install-full # Test complete installation process
Cross-Platform Release
# Complete release workflow
just release-full-cross # Build → Pack → Verify for all platforms
# Individual platform releases
just release-full-linux # Linux distributions
just release-full-macos # macOS distributions
just release-full-windows # Windows distributions
Installation Modes
System Installation (recommended for end users):
# Install to system paths with proper integration
./install.sh
# Windows
./install.ps1
# Custom installation path
./install.sh --prefix /opt/nushell
Local Installation (development/testing):
# Install to user directory without system integration
./install.sh --local
# Portable installation
./install.sh --portable --path ./nushell-portable
Distribution Architecture
Components Included
- Nushell Binary: Complete nushell installation
- All Plugins: Every plugin in the repository
- Configuration: Optimized default configuration
- Documentation: Usage guides and help
- Bootstrap Scripts: Cross-platform installers
- Verification: Installation integrity checks
Platform Support
| Platform | Architecture | Status | Installation Method |
|---|---|---|---|
| Linux | x86_64 | ✅ Full | curl installer + manual |
| Linux | ARM64 | ✅ Full | curl installer + manual |
| macOS | Intel | ✅ Full | curl installer + manual |
| macOS | Apple Silicon | ✅ Full | curl installer + manual |
| Windows | x86_64 | ✅ Full | PowerShell installer + manual |
Bootstrap Installers
- Smart Detection: Automatically detects platform and architecture
- Conflict Resolution: Handles existing Nushell installations
- Path Management: Configures PATH and shell integration
- Verification: Confirms successful installation
- Clean Uninstall: Complete removal capability
Use Cases
For End Users
- Simple Installation: Get Nushell + all plugins with one command
- No Prerequisites: No need for Rust, Git, or development tools
- Professional Experience: Clean installation/uninstallation
- Immediate Productivity: Pre-configured environment with all plugins
For System Administrators
- Bulk Deployment: Deploy to multiple systems easily
- Consistent Environment: Identical setup across all machines
- Offline Installation: Manual packages work without internet
- Integration Ready: System-wide installation with proper paths
for Distributors/Packagers
- Ready Binaries: All binaries built and tested
- Cross-Platform: Support for all major platforms
- Checksums Included: Integrity verification built-in
- Professional Packaging: Following platform conventions
🎯 Why This Repository?
The Challenge
Developing nushell plugins involves several challenges:
- Dependency Management: Nushell evolves rapidly, requiring frequent dependency updates
- Upstream Synchronization: Many plugins have upstream repositories that need tracking
- Build Consistency: Ensuring all plugins build with the same nushell version
- Distribution: Packaging and distributing multiple plugins efficiently
Our Solution
This repository provides:
- 🔄 Automated Upstream Tracking: Monitors upstream changes and auto-approves nu_* dependency updates
- 📦 Unified Build System: Builds all plugins with consistent nushell versions
- 🛡️ Safe Merge Process: Preserves local changes while integrating upstream updates
- 🚀 Complete Distribution System: Full Nushell distributions with zero-prerequisite installation
- 📋 Professional Packaging: Cross-platform installers and distribution packages
- ⚡ Developer Experience: Just recipes and scripts for common tasks
📦 Plugin Collection
Core Plugins
| Plugin | Status | Type | Description |
|---|---|---|---|
| nu_plugin_clipboard | ✅ Tracked | Upstream | Clipboard operations (copy/paste) |
| nu_plugin_highlight | ✅ Tracked | Upstream | Syntax highlighting for source code |
| nu_plugin_image | 🏠 Local | Local | Image processing and manipulation |
| nu_plugin_hashes | 🏠 Local | Local | Hash computation utilities |
| nu_plugin_desktop_notifications | 🏠 Local | Local | Desktop notification system |
| nu_plugin_fluent | ✅ Tracked | Upstream | Fluent localization framework |
| nu_plugin_tera | ✅ Tracked | Private | Tera templating engine (private repo) |
| nu_plugin_kcl | ✅ Tracked | Private | KCL configuration language (private repo) |
Provisioning Platform Plugins (NEW)
High-performance native plugins for the provisioning platform with 10x performance improvement over HTTP APIs:
| Plugin | Type | Description | Performance Gain |
|---|---|---|---|
| nu_plugin_auth | 🔐 Security | JWT authentication, MFA (TOTP/WebAuthn), session management | 20% faster |
| nu_plugin_kms | 🔑 Security | Multi-backend KMS (RustyVault, Age, Cosmian, AWS, Vault) | 10x faster |
| nu_plugin_orchestrator | 🎯 Operations | Orchestrator status, workflow validation, task management | 10x faster |
Key Features:
- Native Performance: Direct Rust integration eliminates HTTP overhead
- Pipeline Integration: Full Nushell pipeline support
- Multi-Backend KMS: RustyVault, Age, Cosmian, AWS KMS, HashiCorp Vault
- Security First: JWT, MFA (TOTP/WebAuthn), keyring storage
- Production Ready: Comprehensive tests, error handling, documentation
Quick Start:
# Build and register provisioning plugins
just build-plugin nu_plugin_auth
just build-plugin nu_plugin_kms
just build-plugin nu_plugin_orchestrator
just install-plugin nu_plugin_auth
just install-plugin nu_plugin_kms
just install-plugin nu_plugin_orchestrator
# Verify installation
nu -c "plugin list | where name =~ provisioning"
See Full Guide: docs/user/NUSHELL_PLUGINS_GUIDE.md
Legend
- ✅ Tracked: Has upstream repository with automated tracking
- 🏠 Local: Developed locally without upstream
- 🔒 Private: Private repository with tracking (requires authentication)
- 🔐 Security: Security and authentication features
- 🔑 KMS: Key management and encryption
- 🎯 Operations: Platform operations and orchestration
🏗️ Building and Cross-Compilation
This repository includes a comprehensive cross-platform build system that supports building plugins for multiple platforms from a single machine.
🚀 Quick Build Commands
# Build for your current platform
just build
# Build for all supported platforms
just build-cross-all
# Build for specific platform
just build-cross linux-amd64
just build-cross darwin-arm64
just build-cross windows-amd64
# Complete cross-platform release
just release-cross
🎯 Supported Platforms
| Platform | Architecture | Native | Docker | Status |
|---|---|---|---|---|
| Linux | AMD64 | ✅ | ✅ | Full support |
| Linux | ARM64 | ⚠️ | ✅ | Docker recommended |
| macOS | Intel | 🍎 | ❌ | macOS host only |
| macOS | Apple Silicon | 🍎 | ❌ | macOS host only |
| Windows | AMD64 | 🪟 | ✅ | Windows host or Docker |
🐳 Docker Cross-Compilation
For consistent builds across all platforms:
# Build Docker cross-compilation environment
just build-docker-image
# Use Docker for specific targets
just build-docker linux-arm64
just build-docker windows-amd64
# Complete Docker workflow
just docker-flow
📦 Distribution
# Collect binaries for all platforms
just collect-all
# Package with checksums
just pack-checksums
# One-liner: build, collect, and package everything
just release-cross
📖 Comprehensive Guide
For detailed instructions, platform-specific setup, troubleshooting, and advanced topics, see:
➡️ Complete Building and Cross-Compilation Guide
The guide covers:
- Platform-specific setup and dependencies
- Native vs Docker cross-compilation
- Configuration and customization
- Troubleshooting common issues
- Performance optimization
- CI/CD integration
- Custom target addition
🔄 Development Workflows
Daily Development (Using Just)
# Check what needs attention
just status-attention
# Update from upstream sources
just upstream-check
# Build and test everything
just dev-flow
# Work on specific plugin
just build-plugin nu_plugin_clipboard
just test-plugin nu_plugin_clipboard
Release Workflow
# Complete release pipeline (native)
just release-flow
# Cross-platform release pipeline
just release-flow-cross
# Or step by step:
just build # Build all plugins (native)
just build-cross-all # Build all plugins (all platforms)
just collect-all # Collect binaries (all platforms)
just pack-checksums # Create distribution archives with checksums
Quality Assurance
# Run all quality checks
just quality-flow
# Individual checks
just fmt # Format code
just lint # Run clippy
just test # Run tests
just audit # Security audit
🎛️ Upstream Tracking System
How It Works
The upstream tracking system automatically:
- Fetches latest changes from upstream repositories
- Analyzes differences between local and upstream code
- Auto-approves changes that only affect nu_* dependencies
- Flags other changes for manual review
- Preserves local modifications during merges
- Excludes specified plugins from tracking operations
Configuration
Plugin Registry (etc/plugin_registry.toml)
[plugins.nu_plugin_example]
upstream_url = "https://github.com/user/nu_plugin_example"
upstream_branch = "main"
auto_ok_on_nu_deps_only = true # Auto-approve nu_* dependency changes
status = "unknown" # Current status
Exclusion Configuration (etc/upstream_exclude.toml)
Control which plugins are excluded from upstream operations:
[exclude]
# Plugins to exclude from ALL upstream operations
plugins = [
"nu_plugin_manual_only",
"nu_plugin_deprecated"
]
[exclude.check]
# Exclude from checking only (can still be manually merged)
plugins = [
"nu_plugin_no_auto_check"
]
[exclude.merge]
# Exclude from automatic merging (but can still be checked)
plugins = [
"nu_plugin_complex_merge"
]
[exclude.patterns]
# Exclude plugins matching patterns
plugins = [
"nu_plugin_test_*",
"nu_plugin_experimental_*"
]
Commands
# Check all upstream sources
just upstream-check
# Check specific plugin
just upstream-check-plugin nu_plugin_clipboard
# Preview changes before merging
just upstream-preview nu_plugin_clipboard
# Safely merge upstream changes
just upstream-merge nu_plugin_clipboard
# Merge all pending changes
just upstream-merge-all
# Manage exclusions
just exclude nu_plugin_test add # Add to exclusion list
just exclude nu_plugin_test remove # Remove from exclusion list
just exclude-list # Show all excluded plugins
Status System
| Status | Description | Action Required |
|---|---|---|
✅ ok |
Synchronized with upstream | None |
⚠️ pending |
Changes detected, needs review | Manual review |
❌ error |
Error during sync | Investigation |
🔥 conflict |
Merge conflicts | Manual resolution |
❓ unknown |
Not yet checked | Run upstream check |
🏠 local_only |
No upstream repository | None |
Status Management
Manual Status Updates
You can manually update plugin status using justfile recipes or scripts:
# Update specific plugin status
just status-update PLUGIN STATUS
just status-update nu_plugin_image ok
# Mark all local development plugins as OK (recommended)
just status-mark-locals-ok
# Using scripts directly
./scripts/run.sh plugin_status.nu update nu_plugin_hashes ok
Common Status Management Tasks
# Check current status
just status # Full dashboard
just status-summary # Quick summary only
just status-attention # Only plugins needing attention
# Mark local plugins as reviewed/OK
just status-mark-locals-ok # Marks nu_plugin_image, nu_plugin_hashes, nu_plugin_desktop_notifications as OK
# Individual updates
just status-update nu_plugin_image ok
just status-update nu_plugin_highlight pending
When to Update Status
- Local plugins (
nu_plugin_image,nu_plugin_hashes,nu_plugin_desktop_notifications): Mark asokafter reviewing local changes - Upstream plugins: Status is automatically managed by
just upstream-check - Manual override: Use
status-updatewhen you need to override automatic status detection
🛠️ Scripts and Tools
Consolidated Script System
The repository now uses a unified script system with automatic nushell detection and mandatory version consistency checking.
Directory Structure
scripts/
├── run.sh # Universal script runner with version checking
├── check_version.nu # Version consistency validator
├── lib/
│ └── cargo_toml_diff.nu # Cargo.toml analysis library
├── check_upstream_changes.nu # Upstream monitoring
├── plugin_status.nu # Status dashboard
├── safe_merge_upstream.nu # Safe merge operations
├── build_all.nu # Build all plugins
├── collect_install.nu # Collection for distribution
├── pack_dist.nu # Distribution packaging
├── make_plugin.nu # Plugin template generator
├── update_nu_versions.nu # Dependency version management
└── sh/ # Essential shell scripts only
├── update_nushell.sh # Nushell installer/updater
├── update_nu_versions.sh # Dependency version manager
├── test_single.sh # Testing utilities
└── test_update.sh # Testing utilities
etc/
├── plugin_registry.toml # Central plugin configuration
└── upstream_exclude.toml # Upstream exclusion configuration
Using the Universal Script Runner
All nushell scripts should be run through the universal wrapper for automatic version checking:
# Universal wrapper with automatic version checking
./scripts/run.sh <script_name> [args...]
# Status and information
./scripts/run.sh plugin_status.nu # Show dashboard
./scripts/run.sh plugin_status.nu --all # Include local plugins
./scripts/run.sh plugin_status.nu summary # Quick summary
# Upstream tracking
./scripts/run.sh check_upstream_changes.nu # Check all
./scripts/run.sh check_upstream_changes.nu --plugin highlight # Check one
./scripts/run.sh safe_merge_upstream.nu highlight # Merge one
./scripts/run.sh safe_merge_upstream.nu --all # Merge all pending
# Development
./scripts/run.sh build_all.nu # Build all plugins
./scripts/run.sh update_nu_versions.nu # Update nu dependencies
# Version management
./scripts/run.sh --check-only # Only check version consistency
./scripts/run.sh --fix --check-only # Auto-fix version mismatches
Direct Nushell Script Usage (Advanced)
⚠️ Warning: Direct usage skips the universal wrapper's version checking - not recommended
# Run from repository root (version checking included in each script)
nu scripts/plugin_status.nu
nu scripts/check_upstream_changes.nu --plugin highlight
nu scripts/build_all.nu --verbose
Version Consistency System
Every script automatically validates that your system nushell version matches the submodule version:
- Automatic detection: Missing nushell is auto-installed
- Version validation: System vs submodule version comparison
- Auto-fix capability:
--fixflag resolves version mismatches - Clear error messages: Detailed guidance when issues occur
📁 File Structure
nushell-plugins/
├── README.md # This file
├── justfile # Just task runner recipes
├── env # Environment configuration
├── LICENSE # License file
├── etc/ # Configuration files
│ ├── plugin_registry.toml # Plugin tracking configuration
│ └── upstream_exclude.toml # Upstream exclusion configuration
├── scripts/ # All automation scripts
│ ├── run.sh # Universal script runner
│ ├── check_version.nu # Version consistency validator
│ ├── *.nu # Nushell script implementations
│ ├── lib/ # Shared libraries
│ └── sh/ # Essential shell scripts
├── generate/ # Plugin templates
│ └── nu_plugin_template/ # Base template for new plugins
├── distribution/ # Build output directory
├── bin_archives/ # Distribution archives
├── nushell/ # Nushell submodule (for dependency versions)
├── nu_plugin_*/ # Individual plugin directories
└── docs/ # Documentation
📥 Installation Methods
Method 1: Full Distribution (Recommended for End Users)
Zero-prerequisite installation of complete Nushell environment:
# One-liner installation (Linux/macOS)
curl -sSf https://your-url/install.sh | sh
# Windows PowerShell
iwr https://your-url/install.ps1 | iex
# Manual installation from release
wget https://releases/nushell-full-linux-x86_64.tar.gz
tar -xzf nushell-full-*.tar.gz && cd nushell-full-* && ./install.sh
# Install from local archive (version-agnostic)
./install.sh --source-path bin_archives/nushell-full-0.108.0-darwin-arm64.tar.gz --install-dir ~/.local
# Verify installation
nu --version && nu -c "plugin list"
What you get:
- Complete Nushell installation
- All plugins from this repository
- Optimized configuration
- Professional installation experience
- Clean uninstall capability
Install Script Architecture (DRY Design)
The installation system uses a single source of truth with symlinks to eliminate code duplication:
Key Files:
-
Source of Truth:
installers/bootstrap/install.sh(1,176 lines)- Complete bootstrap installer for Nushell + plugins
- Repository:
https://github.com/jesusperezlorenzo/nushell-plugins - Platform detection: darwin-arm64, linux-x86_64, windows-x86_64
-
Symlinks (Automatic updates through symlinks):
./install.sh→installers/bootstrap/install.sh./scripts/templates/install.sh→installers/bootstrap/install.sh- All changes propagate automatically (single maintenance point)
-
Windows Variant:
./scripts/templates/install.ps1- PowerShell equivalent with
-SourcePathand-InstallDirparameters - Identical functionality via platform-specific syntax
- PowerShell equivalent with
New --source-path Feature:
Install from local archives or directories without downloading:
# From archived distribution
./install.sh --source-path bin_archives/nushell-full-0.108.0-darwin-arm64.tar.gz
# From extracted directory
./install.sh --source-path ./nushell-binaries
# Default (if path not specified)
./install.sh --source-path # Uses ./bin_archives
# Combined with custom installation path
./install.sh --source-path ./archives --install-dir ~/.local/nushell
Version-Agnostic Archive Detection:
- Automatically detects any
nushell-*version directory - Works with: 0.107, 0.108, 0.109, or any future version
- Searches for binaries in:
bin/nu(preferred) → rootnu(fallback) - Supports both
.tar.gzand.ziparchives - Smart extraction and path detection
Installation Options:
./install.sh # Interactive mode
./install.sh --install-dir ~/.local # Custom path, non-interactive
./install.sh --source-path ./archives # Local source
./install.sh --download-only # Download only
./install.sh --verify-only # Verify existing installation
./install.sh --uninstall # Remove installation
How DRY Works:
- Single Source: Only
installers/bootstrap/install.shis edited - Symlinks Propagate: All changes automatically available at
./install.shand./scripts/templates/install.sh - Verified: All symlinked paths contain identical content
- Maintained: No code duplication, no divergence risk
Method 2: Plugin-Only Distribution
For users who already have Nushell installed:
# Download plugin-only archive
wget https://releases/nushell-plugins-linux-x86_64.tar.gz
tar -xzf nushell-plugins-*.tar.gz && cd nushell-plugins
# Install all plugins
./install_plugins.sh
# Or install specific plugins
./install_plugins.sh --plugins "nu_plugin_clipboard,nu_plugin_highlight"
Method 3: Repository Clone (Recommended for Development)
For plugin developers and contributors:
git clone <repository-url>
cd nushell-plugins
# Validate environment
just validate-nushell
# Build and install plugins only
just build && just collect
cd distribution && nu install_nu_plugins.nu
# Build complete distributions
just build-full && just pack-full
Method 4: Individual Plugin Installation
For specific plugin installation:
# From source (development)
cd nu_plugin_clipboard
cargo build --release
plugin add target/release/nu_plugin_clipboard
# From crates.io (if published)
cargo install nu_plugin_clipboard
plugin add ~/.cargo/bin/nu_plugin_clipboard
Installation Comparison
| Method | Prerequisites | What's Included | Best For |
|---|---|---|---|
| Full Distribution | None | Nushell + All Plugins | End users, system admins |
| Plugin Distribution | Nushell | All Plugins | Nushell users |
| Repository Clone | Rust, Git | Development environment | Contributors, developers |
| Individual Plugin | Rust, Nu | Single plugin | Selective installation |
🎮 Using Just Recipes
Just provides convenient shortcuts for all common tasks with automatic version validation:
Version Validation Commands (New!)
just validate-nushell # Check nushell version consistency
just fix-nushell # Auto-fix version mismatches
Basic Commands
just # Show all available recipes
just status # Plugin status dashboard
just build # Build all plugins
just build-full # Build nushell + all plugins
just test # Test all plugins
just clean # Clean build artifacts
Full Distribution Commands
# Building complete distributions
just build-full # Build nushell with all plugins
just build-full-cross # Cross-platform build
just build-full-all # All platforms
# Creating distribution packages
just pack-full # Create distribution package
just pack-full-all # All platforms
just pack-full-with-installer # Include bootstrap installer
# Release workflows
just release-full-cross # Complete cross-platform release
just verify-full # Verify distribution integrity
just test-full # Test installation process
Upstream Management
just upstream-check # Check for upstream updates
just upstream-merge highlight # Merge specific plugin
just upstream-merge-all # Merge all pending
Development Workflows
All workflows now include mandatory version validation as the first step:
just dev-flow # Validate → Check → Build → Test → Status
just release-flow # Validate → Build → Collect → Package
just quality-flow # Validate → Format → Lint → Test
just update-flow # Update → Fix Version → Update versions → Check upstream
Plugin-Specific Operations
just build-plugin clipboard # Build specific plugin
just test-plugin clipboard # Test specific plugin
just install-plugin clipboard # Install plugin locally
Advanced Features
just interactive # Interactive plugin selection (requires fzf)
just watch clipboard # Watch for changes and rebuild (requires entr)
just validate # Validate setup and dependencies
❓ FAQ
Q: Why do I get "Version mismatch detected" errors?
A: This system requires your installed nushell version to match the submodule version for consistency. All operations automatically check version consistency and will fail if versions don't match.
Solutions:
- Auto-fix:
just fix-nushellor./scripts/run.sh --fix --check-only - Manual check:
just validate-nushell - Skip (not recommended):
./scripts/run.sh --no-version-check script.nu
Q: What happened to the bash wrapper scripts?
A: The repository has been consolidated to eliminate script duplication. The old bash wrappers in scripts/sh/ have been removed in favor of:
- Universal wrapper:
./scripts/run.shwith automatic version checking - Direct nu scripts: All scripts moved from
scripts/nu/toscripts/ - Just recipes: Updated to use the new system
Q: How does the new script system work?
A: The new system provides:
- Universal wrapper (
scripts/run.sh) with automatic nushell detection and version validation - Consolidated scripts - all nu scripts in
scripts/directory - Mandatory version checking - every operation validates version consistency
- Auto-installation - missing nushell is automatically installed
Q: How does automatic upstream tracking work?
A: The system fetches changes from upstream repositories and analyzes them. If only nu_* dependencies changed (like nu-plugin, nu-protocol), it automatically marks the plugin as "OK". Other changes are flagged for manual review. You can exclude specific plugins from tracking using the etc/upstream_exclude.toml file.
Q: What happens to my local changes during upstream merges?
A: Local changes are preserved. The system:
- Creates backup branches before any merge
- Applies upstream changes in a temporary branch
- Restores your local nu_* dependency versions
- Tests compilation before applying changes
- Rolls back on any failure
Q: Can I disable automatic upstream tracking for a plugin?
A: Yes, set auto_ok_on_nu_deps_only = false in etc/plugin_registry.toml for that plugin.
Q: How do I add a new plugin to the repository?
A: Use the template generator:
just make-plugin nu_plugin_myfeature
# or
nu scripts/nu/make_plugin.nu nu_plugin_myfeature
Q: What if upstream tracking fails?
A: Check the plugin status with just status. Failed plugins show error details. Common issues:
- Network connectivity to upstream repository
- Authentication for private repositories
- Merge conflicts requiring manual resolution
Q: How do I update nushell dependency versions?
A: Use the version updater:
just update-nu-versions # Update all plugins
just list-nu-versions # Show current versions
Q: Can I use this with my own private plugins?
A: Yes! Add your private repository URLs to etc/plugin_registry.toml. The system supports SSH URLs for private repositories.
Q: How do I distribute plugins to other systems?
A: Use the distribution pipeline:
just build # Build all plugins
just collect # Collect binaries
just pack # Create archive
The resulting archive contains all binaries and installation scripts.
Q: What's the difference between shell scripts and nushell scripts?
A:
- Nushell scripts (
scripts/nu/): Primary implementation with full features - Shell scripts (
scripts/sh/): Wrappers for compatibility with non-nushell environments - Both provide the same functionality, use whichever fits your environment
Q: How do I contribute a new plugin?
A:
- Create the plugin:
just make-plugin nu_plugin_yourname - Implement your functionality
- Add upstream URL to
etc/plugin_registry.tomlif it has one - Test:
just build-plugin nu_plugin_yourname - Submit a pull request
Q: How do I exclude plugins from upstream tracking?
A: Edit etc/upstream_exclude.toml to exclude plugins from specific operations:
- Add to
[exclude]section to exclude from all operations - Add to
[exclude.check]to skip automatic checks - Add to
[exclude.merge]to prevent automatic merging - Use patterns like
nu_plugin_test_*to exclude multiple plugins
You can also use Just commands:
just exclude nu_plugin_test add # Add to exclusion
just exclude nu_plugin_test remove # Remove from exclusion
just exclude-list # Show excluded plugins
Q: Can I use this system for other Rust projects?
A: The upstream tracking and dependency management concepts can be adapted, but this system is specifically designed for nushell plugins with nu_* dependencies.
🤝 Contributing
- Fork the repository
- Create a feature branch:
git checkout -b feature/amazing-feature - Make your changes
- Test thoroughly:
just quality-flow - Commit your changes:
git commit -m 'Add amazing feature' - Push to the branch:
git push origin feature/amazing-feature - Open a pull request
Development Guidelines
- Follow existing code style and patterns
- Add tests for new functionality
- Update documentation for user-facing changes
- Use
just quality-flowbefore submitting - All scripts should work from repository root
Adding New Plugins
- Use the template generator:
just make-plugin nu_plugin_name - Follow nushell plugin conventions
- Add comprehensive documentation
- Include examples and tests
📄 License
This project is licensed under the MIT License - see the LICENSE file for details.
🙏 Acknowledgments
- Nushell Team for the amazing shell and plugin system
- Plugin authors for their contributions to the nushell ecosystem
- Contributors to this repository
Happy Plugin Development! 🎉