nushell-plugins/updates/108/NUSHELL_UPDATE_AUTOMATION.md

989 lines
25 KiB
Markdown
Raw Permalink Normal View History

# Nushell Update Automation Guide
**Version**: 1.0
**Date**: 2025-10-18
**Purpose**: Automate Nushell version updates for the plugins repository
---
## Overview
This guide documents the semi-automated system for updating Nushell versions in the nushell-plugins repository. The system reduces manual work by ~80% while maintaining safety through strategic manual approval checkpoints.
### Design Philosophy
- **Semi-Automated**: Automate repetitive tasks, require human approval for critical decisions
- **Safe by Default**: Create backups, validate before proceeding, allow rollback
- **Comprehensive**: Download, analyze, update, build, test, and document
- **Idempotent**: Can be run multiple times safely
- **Observable**: Clear logging and status reporting at every step
---
## Automation Architecture
### System Components
```
┌─────────────────────────────────────────────────────────────┐
│ Update Orchestrator │
│ (update_nushell_version.nu) │
└─────────────────┬───────────────────────────────────────────┘
┌─────────────┼─────────────┬──────────────┬──────────────┐
│ │ │ │ │
▼ ▼ ▼ ▼ ▼
┌─────────┐ ┌─────────┐ ┌─────────┐ ┌──────────┐ ┌─────────┐
│Download │ │Analyze │ │ Audit │ │ Detect │ │ Build │
│Nushell │ │Features │ │ Deps │ │Breaking │ │Nushell │
└─────────┘ └─────────┘ └─────────┘ └──────────┘ └─────────┘
│ │ │ │ │
└─────────────┴─────────────┴────────────┴──────────────┘
┌──────────────────┐
│ Update Versions │
│ Test Plugins │
│Generate Report │
└──────────────────┘
```
### Script Hierarchy
1. **update_nushell_version.nu** (Main Orchestrator)
- Entry point for all updates
- Coordinates all other scripts
- Implements manual approval checkpoints
- Generates comprehensive reports
2. **download_nushell.nu** (Download Manager)
- Downloads Nushell tarball from GitHub
- Verifies extraction and workspace
- Supports `--latest` flag
3. **analyze_nushell_features.nu** (Feature Analyzer)
- Parses Cargo.toml for available features
- Validates desired features exist
- Shows dependency trees
- Exports JSON analysis
4. **audit_crate_dependencies.nu** (Dependency Auditor)
- Scans all plugin dependencies
- Detects version mismatches
- Shows dependency matrix
- Identifies update requirements
5. **detect_breaking_changes.nu** (Breaking Change Detector)
- Database of known breaking changes
- Scans plugin code for affected patterns
- Generates migration reports
- Suggests fixes
6. **build_nushell.nu** (Build Manager)
- Builds Nushell with selected features
- Handles workspace builds
- Manages build artifacts
7. **test_plugin_compatibility.nu** (Compatibility Tester)
- Tests plugins against new Nushell version
- Validates plugin registration
- Checks command execution
- Reports compatibility issues
8. **validate_code_rules.nu** (Code Validator)
- Validates best_nushell_code.md against actual binary
- Tests syntax rules
- Verifies patterns work
- Documents syntax changes
---
## Quick Start
### Basic Update
```bash
# Update to specific version (recommended)
./scripts/update_nushell_version.nu 0.108.0
# Update to latest release
./scripts/update_nushell_version.nu --latest
# Check current update status
./scripts/update_nushell_version.nu status
```
### Advanced Options
```bash
# Skip build step (faster for testing)
./scripts/update_nushell_version.nu 0.108.0 --skip-build
# Auto-approve all steps (use with extreme caution!)
./scripts/update_nushell_version.nu 0.108.0 --auto-approve
# Combination (testing workflow)
./scripts/update_nushell_version.nu 0.108.0 --skip-build --auto-approve
```
---
## Detailed Workflow
### Step-by-Step Process
#### Step 1: Download Nushell Source (Automated)
```nushell
./scripts/download_nushell.nu 0.108.0 --clean
```
**What It Does**:
- Downloads tarball from GitHub tags
- Extracts to `./nushell/` directory
- Verifies workspace structure
- Checks Cargo.toml version
**Output**:
```
[INFO] Downloading Nushell 0.108.0 from GitHub...
[INFO] Download URL: https://github.com/nushell/nushell/archive/refs/tags/0.108.0.tar.gz
[SUCCESS] Downloaded: 15.2 MB
[INFO] Extracting tarball...
[SUCCESS] Extracted 43 crates
[INFO] Verifying workspace...
[SUCCESS] Nushell 0.108.0 ready at: ./nushell/
```
**Options**:
- `--latest`: Download latest release automatically
- `--clean`: Remove existing nushell directory first
- `--verify`: Verify checksum (future feature)
#### Step 2: Analyze Features (Automated)
```nushell
./scripts/analyze_nushell_features.nu --validate --export
```
**What It Does**:
- Parses nushell Cargo.toml features section
- Validates desired features exist
- Shows feature dependency tree
- Exports analysis to JSON
**Desired Features** (configurable in script):
```nushell
const DESIRED_FEATURES = [
"mcp", # Model Context Protocol
"plugin", # Plugin system
"sqlite", # SQLite support
"trash-support", # Trash bin support
"system-clipboard" # System clipboard
]
```
**Output**:
```
[INFO] Analyzing Nushell version: 0.108.0
[INFO] Found 37 features
=== Desired Features Analysis ===
[SUCCESS] ✓ mcp
Dependencies: none
[SUCCESS] ✓ plugin
Dependencies: nu-plugin, nu-plugin-engine
[SUCCESS] ✓ sqlite
Dependencies: nu-command/sqlite
...
[SUCCESS] All desired features are valid!
[SUCCESS] Feature analysis exported to: ./tmp/feature_analysis.json
```
**Subcommands**:
```bash
# Show all available features
./scripts/analyze_nushell_features.nu --show-all
# Show dependency tree for specific feature
./scripts/analyze_nushell_features.nu tree mcp
# Generate build command
./scripts/analyze_nushell_features.nu build-cmd
# Categorize features
./scripts/analyze_nushell_features.nu categorize
```
#### Step 3: Audit Dependencies (Automated)
```nushell
./scripts/audit_crate_dependencies.nu --export
```
**What It Does**:
- Scans all plugin Cargo.toml files
- Extracts nu-* dependencies
- Compares versions with nushell core
- Reports mismatches
**Output**:
```
[INFO] Nushell Plugin Dependency Audit
[INFO] Found 8 system plugins
[INFO] Found 3 custom plugins
=== Dependency Audit Results ===
Total plugins: 11
Clean: 8
With issues: 3
--- System Plugins ---
✅ nu_plugin_query (v0.108.0)
nu-* dependencies: 3
• nu-plugin: 0.108.0
• nu-protocol: 0.108.0 [plugin]
• nu-engine: 0.108.0
...
--- Custom Plugins ---
⚠️ nu_plugin_image (v0.1.0)
nu-* dependencies: 2
• nu-plugin: 0.107.1 (path: ../nushell/crates/nu-plugin)
• nu-protocol: 0.107.1 (path: ../nushell/crates/nu-protocol)
=== Plugins with Version Issues ===
[ERROR] nu_plugin_image
• nu-plugin: found 0.107.1, expected 0.108.0
• nu-protocol: found 0.107.1, expected 0.108.0
```
**Subcommands**:
```bash
# Audit specific plugin
./scripts/audit_crate_dependencies.nu --plugin nu_plugin_image
# Audit only custom plugins
./scripts/audit_crate_dependencies.nu --custom-only
# Show dependency matrix
./scripts/audit_crate_dependencies.nu matrix
```
#### Step 4: Detect Breaking Changes (Automated)
```nushell
./scripts/detect_breaking_changes.nu --scan-plugins --export
```
**What It Does**:
- Maintains database of known breaking changes
- Scans plugin source code for affected patterns
- Reports potential issues
- Suggests migration steps
**Breaking Change Database**:
```nushell
const BREAKING_CHANGES = {
"0.108.0": [
{
type: "command_rename"
old_name: "into value"
new_name: "detect type"
description: "Command renamed and behavior changed"
impact: "high"
migration: "Replace 'into value' with 'detect type'"
},
{
type: "behavior_change"
component: "stream_error_handling"
description: "Collecting streams with errors now raises errors"
impact: "medium"
migration: "Add explicit error handling when collecting streams"
}
]
}
```
**Output**:
```
[INFO] Detecting breaking changes for 0.108.0...
[INFO] Found 2 breaking changes in database
[INFO] Scanning plugin source code...
=== Breaking Changes Report ===
Breaking Change #1: Command Rename
Old: into value
New: detect type
Impact: high
Affected Plugins:
• nu_plugin_image: 2 occurrences in src/main.rs
• nu_plugin_hashes: 1 occurrence in src/lib.rs
Migration:
Replace 'into value' with 'detect type'
Breaking Change #2: Stream Error Handling
Component: stream_error_handling
Impact: medium
Affected Plugins:
• nu_plugin_image: 5 stream collections need error handling
Migration:
Add explicit error handling when collecting streams
[WARN] Breaking changes detected!
[SUCCESS] Report exported to: ./tmp/breaking_changes_report.json
```
#### Step 5: Manual Approval Checkpoint #1 ⚠️
The orchestrator pauses and displays:
```
═══ MANUAL REVIEW REQUIRED ═══
Breaking changes detected. Please review the report above.
Affected plugins: 2
• nu_plugin_image (3 issues)
• nu_plugin_hashes (1 issue)
Continue with update? (yes/no):
```
**What to Review**:
- Breaking change impact on each plugin
- Number of affected code locations
- Migration complexity
- Risk level
**Decision**:
- Type `yes` to continue with updates
- Type `no` to abort and investigate manually
#### Step 6: Update Plugin Versions (Semi-Automated)
```nushell
./scripts/update_nu_versions.nu update
```
**What It Does**:
- Updates all plugin Cargo.toml files
- Changes nu-* dependency versions
- Preserves other dependencies
- Creates backup before changes
**Output**:
```
[INFO] Current Plugin Versions:
Plugin | nu-plugin | nu-protocol | Status
------------------------|-----------|-------------|--------
nu_plugin_image | 0.107.1 | 0.107.1 | Needs update
nu_plugin_hashes | 0.107.1 | 0.107.1 | Needs update
nu_plugin_clipboard | 0.108.0 | 0.108.0 | OK
...
Update all plugin versions? (yes/no): yes
[INFO] Updating plugin versions to 0.108.0...
[SUCCESS] Updated: nu_plugin_image/Cargo.toml
[SUCCESS] Updated: nu_plugin_hashes/Cargo.toml
[SUCCESS] Updated 8 plugins to version 0.108.0
```
#### Step 7: Build Nushell (Automated, Optional)
```nushell
./scripts/build_nushell.nu
```
**What It Does**:
- Builds Nushell with selected features
- Builds workspace (includes system plugins)
- Reports build time and artifacts
**Build Command Generated**:
```bash
cd nushell && cargo build --release --workspace \
--features "mcp,plugin,sqlite,trash-support,system-clipboard,rustls-tls"
```
**Output**:
```
[INFO] Building Nushell 0.108.0 with MCP features...
[WARN] This will take 10-20 minutes...
[INFO] Build started at: 2025-10-18 10:00:00
...
[Cargo build output]
...
[SUCCESS] Build completed at: 2025-10-18 10:15:23
[INFO] Build time: 15m 23s
Artifacts Generated:
• nushell/target/release/nu (42.3 MB)
• nushell/target/release/nu_plugin_* (8 plugins)
```
#### Step 8: Manual Approval Checkpoint #2 ⚠️
```
═══ BUILD REVIEW REQUIRED ═══
Please review build results above.
Build status: Success
Build time: 15m 23s
Artifacts: 9 binaries
Proceed with plugin compatibility tests? (yes/no):
```
**What to Review**:
- Build completed successfully
- No critical warnings
- Expected artifacts present
- Build time reasonable
#### Step 9: Test Plugin Compatibility (Automated)
```nushell
./scripts/test_plugin_compatibility.nu
```
**What It Does**:
- Registers each plugin with new nushell
- Tests plugin commands
- Verifies output format
- Reports any failures
**Output**:
```
[INFO] Testing plugin compatibility with Nushell 0.108.0...
Testing: nu_plugin_clipboard
[SUCCESS] Plugin registered
[SUCCESS] Command 'clipboard' works
[SUCCESS] Output format correct
Testing: nu_plugin_image
[SUCCESS] Plugin registered
[WARN] Command 'to ansi' slow (2.3s)
[SUCCESS] Output format correct
...
=== Compatibility Summary ===
Total plugins tested: 11
Passed: 10
Failed: 0
Warnings: 1 (performance)
```
#### Step 10: Generate Update Report (Automated)
```nushell
# Generates comprehensive markdown report
```
**Output**: `./tmp/update_report_0.108.0.md`
**Contents**:
- Update summary
- Files modified
- Breaking changes encountered
- Test results
- Next steps
- Links to detailed reports
#### Step 11: Final Manual Approval ⚠️
```
═══ UPDATE COMPLETE ═══
Review the update report above.
Next steps:
1. Review changes with: git status
2. Test the updated plugins
3. Commit changes when ready
To create a commit:
git add -A
git commit -m "chore: update to Nushell 0.108.0"
```
---
## Manual Approval Checkpoints
### Checkpoint #1: Breaking Changes Review
**When**: After detecting breaking changes
**Purpose**: Verify impact is acceptable
**What to Check**:
- [ ] Number of breaking changes manageable
- [ ] Affected plugins are known
- [ ] Migration path is clear
- [ ] No unexpected critical changes
**Response Options**:
- `yes`: Continue with automatic updates
- `no`: Stop to manually investigate
### Checkpoint #2: Build Review
**When**: After building Nushell
**Purpose**: Verify build succeeded properly
**What to Check**:
- [ ] Build completed without errors
- [ ] No suspicious warnings
- [ ] All expected binaries created
- [ ] Build time is reasonable
**Response Options**:
- `yes`: Proceed with plugin tests
- `no`: Skip plugin tests, review manually
### Checkpoint #3: Final Approval
**When**: After all steps complete
**Purpose**: Review before committing
**What to Check**:
- [ ] All tests passed
- [ ] Documentation updated
- [ ] Changes look correct in git status
- [ ] Ready to commit
**Response Options**:
- Commit changes: `git add -A && git commit`
- Rollback: `git restore .`
- Manual fixes: Edit files as needed
---
## Configuration
### Script Configuration Files
#### etc/plugin_registry.toml
```toml
[plugins.nu_plugin_image]
upstream = "https://github.com/fdncred/nu_plugin_image"
status = "ok"
auto_merge = false
[plugins.nu_plugin_clipboard]
upstream = "https://github.com/FMotalleb/nu_plugin_clipboard"
status = "ok"
auto_merge = true # Auto-merge nu-* dependency changes
```
#### scripts/lib/common_lib.nu
```nushell
# Shared configuration for all scripts
export const LOG_LEVEL = "INFO"
export const NUSHELL_DIR = "./nushell"
export const TMP_DIR = "./tmp"
export const BACKUP_DIR = "./backups"
# Feature configuration
export const DESIRED_FEATURES = [
"mcp",
"plugin",
"sqlite",
"trash-support",
"system-clipboard"
]
```
### Environment Variables
```bash
# Override default directories
export NUSHELL_SOURCE_DIR="/custom/path/nushell"
export UPDATE_TMP_DIR="/custom/tmp"
# Control logging
export UPDATE_LOG_LEVEL="DEBUG" # DEBUG, INFO, WARN, ERROR
# Skip checkpoints (dangerous!)
export UPDATE_AUTO_APPROVE="false"
```
---
## Error Handling
### Automatic Recovery
The system implements automatic recovery for common errors:
#### Download Failures
```nushell
# Automatically retries with exponential backoff
def download_with_retry [url: string]: nothing -> binary {
mut attempts = 0
while $attempts < 3 {
try {
return (http get $url)
} catch {|err|
$attempts = $attempts + 1
log_warn $"Download failed, retry ($attempts)/3"
sleep (2sec * $attempts)
}
}
error make {msg: "Download failed after 3 attempts"}
}
```
#### Build Failures
```nushell
# Cleans and retries once
try {
cargo build --release
} catch {|err|
log_warn "Build failed, cleaning and retrying..."
cargo clean
cargo build --release
}
```
#### Network Errors
```nushell
# Falls back to git clone if tarball download fails
try {
download_tarball $version
} catch {
log_warn "Tarball download failed, trying git clone..."
git clone --depth 1 --branch $version https://github.com/nushell/nushell
}
```
### Manual Intervention
Some errors require manual intervention:
#### Merge Conflicts
```
[ERROR] Merge conflict in nu_plugin_image/Cargo.toml
[INFO] Manual resolution required:
1. Edit the file to resolve conflicts
2. Run: git add nu_plugin_image/Cargo.toml
3. Continue with: ./scripts/update_nushell_version.nu --continue
```
#### Missing Dependencies
```
[ERROR] Missing system dependency: libssl-dev
[INFO] Install with:
Ubuntu/Debian: sudo apt install libssl-dev
macOS: brew install openssl
Then retry the build
```
---
## Logging and Debugging
### Log Levels
```nushell
# Log functions in common_lib.nu
export def log_debug [msg: string]: nothing -> nothing {
if $env.LOG_LEVEL? == "DEBUG" {
print $"[(ansi grey)(date now | format date '%H:%M:%S')(ansi reset)] [DEBUG] ($msg)"
}
}
export def log_info [msg: string]: nothing -> nothing {
print $"[(ansi blue)(date now | format date '%H:%M:%S')(ansi reset)] [INFO] ($msg)"
}
export def log_success [msg: string]: nothing -> nothing {
print $"[(ansi green)(date now | format date '%H:%M:%S')(ansi reset)] [SUCCESS] ($msg)"
}
export def log_warn [msg: string]: nothing -> nothing {
print $"[(ansi yellow)(date now | format date '%H:%M:%S')(ansi reset)] [WARN] ($msg)"
}
export def log_error [msg: string]: nothing -> nothing {
print $"[(ansi red)(date now | format date '%H:%M:%S')(ansi reset)] [ERROR] ($msg)"
}
```
### Debug Mode
```bash
# Enable debug logging
export LOG_LEVEL=DEBUG
./scripts/update_nushell_version.nu 0.108.0
# Enable Nushell tracing
RUST_LOG=debug ./scripts/update_nushell_version.nu 0.108.0
# Save complete log
./scripts/update_nushell_version.nu 0.108.0 2>&1 | tee update.log
```
### Generated Reports
All operations generate detailed reports:
```
./tmp/
├── feature_analysis.json # Feature analysis results
├── dependency_audit.json # Dependency audit results
├── breaking_changes_report.json # Breaking changes found
├── test_results.json # Plugin test results
└── update_report_0.108.0.md # Comprehensive summary
```
---
## Performance Optimization
### Parallel Execution
```nushell
# Analyze and audit in parallel
[
(do { ./scripts/analyze_nushell_features.nu --export })
(do { ./scripts/audit_crate_dependencies.nu --export })
] | par-each {|cmd| $cmd }
```
### Caching
```nushell
# Cache GitHub API responses
def get_latest_version_cached []: nothing -> string {
let cache_file = "./tmp/latest_version.txt"
let cache_age = (date now) - (ls $cache_file | get modified | first)
if $cache_age < 1hr {
open $cache_file
} else {
let version = get_latest_from_github
$version | save -f $cache_file
$version
}
}
```
### Incremental Builds
```nushell
# Only rebuild changed plugins
def build_changed_plugins []: nothing -> list {
git diff --name-only HEAD~1
| lines
| where {|f| $f | str starts-with "nu_plugin_"}
| each {|plugin|
cd $plugin
cargo build --release
}
}
```
---
## Testing the Automation
### Unit Tests
```nushell
# Test download script
def test_download []: nothing -> nothing {
./scripts/download_nushell.nu 0.108.0 --clean
assert (("./nushell/Cargo.toml" | path exists) == true)
assert ((open ./nushell/Cargo.toml | get package.version) == "0.108.0")
}
# Test feature analysis
def test_analyze []: nothing -> nothing {
let result = (./scripts/analyze_nushell_features.nu --validate | complete)
assert ($result.exit_code == 0)
assert (("./tmp/feature_analysis.json" | path exists) == true)
}
```
### Integration Tests
```bash
# Test full workflow with skip-build
./scripts/update_nushell_version.nu 0.108.0 --skip-build --auto-approve
# Verify results
test -f ./nushell/Cargo.toml
test -f ./tmp/feature_analysis.json
test -f ./tmp/dependency_audit.json
test -f ./tmp/breaking_changes_report.json
```
### Dry Run Mode
```bash
# Future feature: test without making changes
./scripts/update_nushell_version.nu 0.108.0 --dry-run
```
---
## Future Enhancements
### Planned Features
1. **Automated Rollback**
```nushell
./scripts/rollback_version.nu # Automatic rollback on failure
```
2. **CI/CD Integration**
```yaml
# .github/workflows/update-nushell.yml
on:
schedule:
- cron: '0 0 * * 1' # Check weekly
jobs:
update:
runs-on: ubuntu-latest
steps:
- run: ./scripts/update_nushell_version.nu --latest --auto-approve
```
3. **Version Validation**
```nushell
./scripts/validate_code_rules.nu # Test rules against binary
```
4. **Interactive Mode**
```nushell
./scripts/update_nushell_version.nu --interactive
# Shows progress, allows step-by-step execution
```
5. **Email Notifications**
```nushell
# Notify on completion or errors
send_email "Update to 0.108.0 completed" $report
```
### Known Limitations
1. **Directory Naming**: Download script creates `nushell-X.Y.Z/` instead of `nushell/`
- Workaround: Manual move or symlink
- Fix planned: Next script version
2. **Private Repos**: SSH authentication not automated
- Workaround: Set up SSH keys manually
- Enhancement: Key management automation
3. **Windows Support**: Scripts tested on Unix-like systems
- Workaround: Use WSL or Git Bash
- Enhancement: Native Windows support
---
## Best Practices
### Do's ✅
1. **Always Review Breaking Changes**: Don't auto-approve blindly
2. **Test Before Committing**: Run quality checks
3. **Keep Backups**: Git stash before major updates
4. **Read Generated Reports**: Contains important details
5. **Update Documentation**: Keep best_nushell_code.md in sync
### Don'ts ❌
1. **Don't Use --auto-approve in Production**: Manual review is critical
2. **Don't Skip Testing**: Plugin tests catch issues
3. **Don't Ignore Warnings**: They often indicate real problems
4. **Don't Modify Scripts During Update**: Can cause inconsistencies
5. **Don't Delete tmp/ During Update**: Contains important state
---
## Troubleshooting
### Common Issues
**Issue**: Download fails with network error
```bash
# Solution: Use git clone fallback
cd nushell && git fetch --tags && git checkout 0.108.0
```
**Issue**: Build takes too long
```bash
# Solution: Use --skip-build for faster iteration
./scripts/update_nushell_version.nu 0.108.0 --skip-build
```
**Issue**: Version mismatch after update
```bash
# Solution: Run update_nu_versions.nu again
./scripts/update_nu_versions.nu update
```
**Issue**: Plugin test failures
```bash
# Solution: Test manually with new nushell
./nushell/target/release/nu
> plugin add target/release/nu_plugin_NAME
> plugin list
```
---
## Appendix
### Script Reference
| Script | Purpose | Time | Required |
|--------|---------|------|----------|
| update_nushell_version.nu | Main orchestrator | 3-4h | Yes |
| download_nushell.nu | Download source | 2m | Yes |
| analyze_nushell_features.nu | Analyze features | 1m | Yes |
| audit_crate_dependencies.nu | Audit deps | 1m | Yes |
| detect_breaking_changes.nu | Find changes | 1m | Yes |
| build_nushell.nu | Build nushell | 15m | Optional |
| test_plugin_compatibility.nu | Test plugins | 5m | Optional |
| validate_code_rules.nu | Validate docs | 2m | Optional |
### File Locations
```
project-root/
├── scripts/
│ ├── update_nushell_version.nu # Main orchestrator
│ ├── download_nushell.nu # Download manager
│ ├── analyze_nushell_features.nu # Feature analyzer
│ ├── audit_crate_dependencies.nu # Dependency auditor
│ ├── detect_breaking_changes.nu # Change detector
│ ├── build_nushell.nu # Build manager
│ ├── test_plugin_compatibility.nu # Compatibility tester
│ ├── validate_code_rules.nu # Code validator
│ └── lib/
│ └── common_lib.nu # Shared utilities
├── etc/
│ └── plugin_registry.toml # Plugin configuration
├── tmp/ # Generated reports
│ ├── feature_analysis.json
│ ├── dependency_audit.json
│ ├── breaking_changes_report.json
│ └── update_report_*.md
└── nushell/ # Downloaded nushell source
```
---
**Automation Guide Version**: 1.0
**Last Updated**: 2025-10-18
**Maintained By**: Nushell Plugins Team