576 lines
13 KiB
Markdown
576 lines
13 KiB
Markdown
|
|
# Migration Guide: Nushell 0.107.1 → 0.108.0
|
||
|
|
|
||
|
|
**Version**: 1.0
|
||
|
|
**Date**: 2025-10-18
|
||
|
|
**Target**: Nushell Plugins Repository
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Overview
|
||
|
|
|
||
|
|
This guide documents the migration process from Nushell 0.107.1 to 0.108.0, including breaking changes, syntax corrections, and required updates for all plugins in this repository.
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Critical Syntax Corrections
|
||
|
|
|
||
|
|
### 🔴 CRITICAL: These are documentation bugs that were discovered and fixed
|
||
|
|
|
||
|
|
Before migrating to 0.108.0, we discovered **TWO CRITICAL BUGS** in our `best_nushell_code.md` documentation that affected ALL code generation. These have been corrected:
|
||
|
|
|
||
|
|
#### Bug Fix #1: Function Signature Syntax (Rule 16)
|
||
|
|
|
||
|
|
**Problem**: Documentation showed syntax that doesn't work
|
||
|
|
|
||
|
|
```nushell
|
||
|
|
# ❌ INCORRECT (as previously documented)
|
||
|
|
def process-data [input: string]: table {
|
||
|
|
$input | from json
|
||
|
|
}
|
||
|
|
# Error: expected arrow (->)
|
||
|
|
```
|
||
|
|
|
||
|
|
**Solution**: Both colon AND arrow are required for pipeline signatures
|
||
|
|
|
||
|
|
```nushell
|
||
|
|
# ✅ CORRECT (now documented properly)
|
||
|
|
def process-data [input: string]: nothing -> table {
|
||
|
|
$input | from json
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
**Impact**: ALL scripts using the template pattern need to be updated with `: nothing -> type` syntax.
|
||
|
|
|
||
|
|
#### Bug Fix #2: String Interpolation (Rule 17)
|
||
|
|
|
||
|
|
**Problem**: Documentation recommended square brackets which don't interpolate
|
||
|
|
|
||
|
|
```nushell
|
||
|
|
# ❌ INCORRECT (as previously documented)
|
||
|
|
print $"Processing [$filename] at [$timestamp]"
|
||
|
|
# Output: "Processing [$filename] at [$timestamp]" (LITERAL!)
|
||
|
|
```
|
||
|
|
|
||
|
|
**Solution**: Only parentheses interpolate variables
|
||
|
|
|
||
|
|
```nushell
|
||
|
|
# ✅ CORRECT (now documented properly)
|
||
|
|
print $"Processing ($filename) at ($timestamp)"
|
||
|
|
# Output: "Processing data.json at 2025-10-18" (WORKS!)
|
||
|
|
```
|
||
|
|
|
||
|
|
**Impact**: ALL dynamic strings, error messages, and logging need parentheses.
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Nushell 0.108.0 Breaking Changes
|
||
|
|
|
||
|
|
### 1. Command Rename: `into value` → `detect type`
|
||
|
|
|
||
|
|
**What Changed**:
|
||
|
|
- Command `into value` has been renamed to `detect type`
|
||
|
|
- Behavior also changed - doesn't operate on cells anymore
|
||
|
|
|
||
|
|
**Migration**:
|
||
|
|
|
||
|
|
```nushell
|
||
|
|
# ❌ Old (0.107.1)
|
||
|
|
$data | into value
|
||
|
|
|
||
|
|
# ✅ New (0.108.0)
|
||
|
|
$data | detect type
|
||
|
|
```
|
||
|
|
|
||
|
|
**Required Actions**:
|
||
|
|
1. Search for all usages of `into value` in plugin code
|
||
|
|
2. Replace with `detect type`
|
||
|
|
3. Review behavior - cell operations may need different approach
|
||
|
|
4. Test thoroughly as behavior changed
|
||
|
|
|
||
|
|
**Search Command**:
|
||
|
|
```bash
|
||
|
|
grep -r "into value" nu_plugin_*/src/
|
||
|
|
```
|
||
|
|
|
||
|
|
### 2. Stream Error Handling
|
||
|
|
|
||
|
|
**What Changed**:
|
||
|
|
- Collecting a stream that contains errors now raises an error itself
|
||
|
|
- Previously, errors in streams were silently collected
|
||
|
|
|
||
|
|
**Migration**:
|
||
|
|
|
||
|
|
```nushell
|
||
|
|
# ❌ Old behavior (0.107.1)
|
||
|
|
let results = ($stream | collect) # Errors silently included
|
||
|
|
|
||
|
|
# ✅ New behavior (0.108.0)
|
||
|
|
# Must handle errors explicitly
|
||
|
|
let results = try {
|
||
|
|
$stream | collect
|
||
|
|
} catch {|err|
|
||
|
|
log error $"Stream collection failed: ($err.msg)"
|
||
|
|
[]
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
**Required Actions**:
|
||
|
|
1. Find all stream collection operations
|
||
|
|
2. Add explicit error handling with `try`/`catch`
|
||
|
|
3. Test with error-containing streams
|
||
|
|
|
||
|
|
**Search Pattern**:
|
||
|
|
```bash
|
||
|
|
grep -r "| collect" nu_plugin_*/src/
|
||
|
|
```
|
||
|
|
|
||
|
|
### 3. MCP Feature Addition (New)
|
||
|
|
|
||
|
|
**What's New**:
|
||
|
|
- Nushell now includes Model Context Protocol (MCP) server support
|
||
|
|
- Feature flag: `mcp`
|
||
|
|
- New crate: `nu-mcp`
|
||
|
|
|
||
|
|
**Usage**:
|
||
|
|
```bash
|
||
|
|
# Build with MCP support
|
||
|
|
cargo build --release --features "mcp,plugin,sqlite,trash-support,system-clipboard"
|
||
|
|
```
|
||
|
|
|
||
|
|
**Integration**:
|
||
|
|
- MCP server runs on port 8080 by default
|
||
|
|
- Provides AI agent integration capabilities
|
||
|
|
- See `nushell/crates/nu-mcp/` for implementation
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Plugin Migration Checklist
|
||
|
|
|
||
|
|
Use this checklist for each plugin:
|
||
|
|
|
||
|
|
### Phase 1: Syntax Corrections
|
||
|
|
|
||
|
|
- [ ] Update all function signatures with `: nothing -> type` syntax
|
||
|
|
- [ ] Replace all `[$var]` string interpolations with `($var)`
|
||
|
|
- [ ] Test all functions parse correctly
|
||
|
|
- [ ] Run `cargo check` to verify syntax
|
||
|
|
|
||
|
|
### Phase 2: Dependency Updates
|
||
|
|
|
||
|
|
- [ ] Update `nu-plugin` dependency to `0.108.0`
|
||
|
|
- [ ] Update `nu-protocol` dependency to `0.108.0`
|
||
|
|
- [ ] Update all other `nu-*` dependencies to `0.108.0`
|
||
|
|
- [ ] Verify path dependencies point to correct nushell submodule
|
||
|
|
|
||
|
|
### Phase 3: Breaking Change Fixes
|
||
|
|
|
||
|
|
- [ ] Search for `into value` usage
|
||
|
|
- [ ] Replace with `detect type` and test behavior
|
||
|
|
- [ ] Find stream collection operations
|
||
|
|
- [ ] Add explicit error handling for streams
|
||
|
|
- [ ] Test with error scenarios
|
||
|
|
|
||
|
|
### Phase 4: Testing
|
||
|
|
|
||
|
|
- [ ] Run `cargo test` for plugin
|
||
|
|
- [ ] Run `cargo clippy` and fix warnings
|
||
|
|
- [ ] Build plugin: `cargo build --release`
|
||
|
|
- [ ] Register plugin with nushell 0.108.0
|
||
|
|
- [ ] Test plugin functionality end-to-end
|
||
|
|
|
||
|
|
### Phase 5: Documentation
|
||
|
|
|
||
|
|
- [ ] Update plugin README for 0.108.0
|
||
|
|
- [ ] Update code examples with correct syntax
|
||
|
|
- [ ] Document any behavior changes
|
||
|
|
- [ ] Update version in Cargo.toml
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Repository-Wide Migration Steps
|
||
|
|
|
||
|
|
### Step 1: Update Nushell Submodule
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# Option A: Using download script (recommended)
|
||
|
|
./scripts/download_nushell.nu 0.108.0 --clean
|
||
|
|
|
||
|
|
# Option B: Using git submodule
|
||
|
|
cd nushell
|
||
|
|
git fetch --tags
|
||
|
|
git checkout 0.108.0
|
||
|
|
cd ..
|
||
|
|
git add nushell
|
||
|
|
```
|
||
|
|
|
||
|
|
### Step 2: Update All Plugin Dependencies
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# Automated update
|
||
|
|
./scripts/update_nu_versions.nu update
|
||
|
|
|
||
|
|
# Manual verification
|
||
|
|
./scripts/update_nu_versions.nu list
|
||
|
|
```
|
||
|
|
|
||
|
|
### Step 3: Fix Syntax Errors
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# Find function signature issues
|
||
|
|
grep -r "]: [a-z]* {" scripts/ nu_plugin_*/src/
|
||
|
|
|
||
|
|
# Find string interpolation issues
|
||
|
|
grep -r '\$".*\[.*\]' scripts/ nu_plugin_*/src/
|
||
|
|
```
|
||
|
|
|
||
|
|
### Step 4: Build and Test
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# Build nushell with all features
|
||
|
|
./scripts/build_nushell.nu
|
||
|
|
|
||
|
|
# Build all plugins
|
||
|
|
just build
|
||
|
|
|
||
|
|
# Test all plugins
|
||
|
|
just test
|
||
|
|
|
||
|
|
# Quality checks
|
||
|
|
just quality-flow
|
||
|
|
```
|
||
|
|
|
||
|
|
### Step 5: Verify Installation
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# Register plugins
|
||
|
|
./scripts/register_plugins.nu
|
||
|
|
|
||
|
|
# Verify registration
|
||
|
|
./nushell/target/release/nu -c "plugin list"
|
||
|
|
|
||
|
|
# Test basic functionality
|
||
|
|
./nushell/target/release/nu -c "version"
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Common Migration Issues
|
||
|
|
|
||
|
|
### Issue 1: Parse Errors in Function Definitions
|
||
|
|
|
||
|
|
**Symptom**:
|
||
|
|
```
|
||
|
|
Error: Parse mismatch: expected arrow (->) at ]: table {
|
||
|
|
```
|
||
|
|
|
||
|
|
**Solution**: Add `nothing` input type
|
||
|
|
```nushell
|
||
|
|
# Before: def fn []: table {
|
||
|
|
# After: def fn []: nothing -> table {
|
||
|
|
```
|
||
|
|
|
||
|
|
### Issue 2: Variables Not Interpolating
|
||
|
|
|
||
|
|
**Symptom**: String shows literal `[$var]` instead of value
|
||
|
|
|
||
|
|
**Solution**: Use parentheses
|
||
|
|
```nushell
|
||
|
|
# Before: $"Value: [$var]"
|
||
|
|
# After: $"Value: ($var)"
|
||
|
|
```
|
||
|
|
|
||
|
|
### Issue 3: `into value` Not Found
|
||
|
|
|
||
|
|
**Symptom**:
|
||
|
|
```
|
||
|
|
Error: Command 'into value' not found
|
||
|
|
```
|
||
|
|
|
||
|
|
**Solution**: Use new command name
|
||
|
|
```nushell
|
||
|
|
# Before: $data | into value
|
||
|
|
# After: $data | detect type
|
||
|
|
```
|
||
|
|
|
||
|
|
### Issue 4: Stream Collection Errors
|
||
|
|
|
||
|
|
**Symptom**: Unexpected errors when collecting streams
|
||
|
|
|
||
|
|
**Solution**: Add explicit error handling
|
||
|
|
```nushell
|
||
|
|
# Before: let results = ($stream | collect)
|
||
|
|
# After: let results = try { $stream | collect } catch { [] }
|
||
|
|
```
|
||
|
|
|
||
|
|
### Issue 5: Build Feature Mismatch
|
||
|
|
|
||
|
|
**Symptom**: MCP-related build errors
|
||
|
|
|
||
|
|
**Solution**: Ensure feature flags are consistent
|
||
|
|
```bash
|
||
|
|
cargo build --release --features "mcp,plugin,sqlite,trash-support,system-clipboard,rustls-tls"
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Testing Strategy
|
||
|
|
|
||
|
|
### Unit Tests
|
||
|
|
|
||
|
|
```nushell
|
||
|
|
# Test function signatures parse
|
||
|
|
def test-signature [x: string]: nothing -> string {
|
||
|
|
$x
|
||
|
|
}
|
||
|
|
|
||
|
|
# Test string interpolation
|
||
|
|
def test-interpolation []: nothing -> string {
|
||
|
|
let name = "Alice"
|
||
|
|
$"Hello ($name)"
|
||
|
|
}
|
||
|
|
|
||
|
|
# Test error handling
|
||
|
|
def test-errors []: nothing -> list {
|
||
|
|
try {
|
||
|
|
error make {msg: "test"}
|
||
|
|
} catch {|e|
|
||
|
|
[$e.msg]
|
||
|
|
}
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
### Integration Tests
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# Build with new version
|
||
|
|
cargo build --release
|
||
|
|
|
||
|
|
# Test plugin registration
|
||
|
|
./nushell/target/release/nu -c "plugin add target/release/nu_plugin_NAME"
|
||
|
|
./nushell/target/release/nu -c "plugin list"
|
||
|
|
|
||
|
|
# Test plugin functionality
|
||
|
|
./nushell/target/release/nu -c "command-from-plugin"
|
||
|
|
```
|
||
|
|
|
||
|
|
### Regression Tests
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# Verify old functionality still works
|
||
|
|
just test
|
||
|
|
|
||
|
|
# Check performance hasn't degraded
|
||
|
|
hyperfine './old_version' './new_version'
|
||
|
|
|
||
|
|
# Verify output consistency
|
||
|
|
diff <(./old_version test-data) <(./new_version test-data)
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Rollback Procedure
|
||
|
|
|
||
|
|
If migration fails and you need to rollback:
|
||
|
|
|
||
|
|
### Quick Rollback
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# 1. Restore nushell submodule
|
||
|
|
cd nushell
|
||
|
|
git checkout 0.107.1
|
||
|
|
cd ..
|
||
|
|
|
||
|
|
# 2. Restore plugin dependencies
|
||
|
|
git restore nu_plugin_*/Cargo.toml
|
||
|
|
|
||
|
|
# 3. Rebuild
|
||
|
|
cargo clean
|
||
|
|
cargo build --release
|
||
|
|
```
|
||
|
|
|
||
|
|
### Complete Rollback
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# 1. Create backup first
|
||
|
|
git stash save "Migration backup"
|
||
|
|
|
||
|
|
# 2. Reset to pre-migration state
|
||
|
|
git reset --hard HEAD~1 # or specific commit
|
||
|
|
|
||
|
|
# 3. Rebuild everything
|
||
|
|
cargo clean
|
||
|
|
just build
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Automation Scripts
|
||
|
|
|
||
|
|
The following automation scripts were created for this migration:
|
||
|
|
|
||
|
|
### Core Scripts
|
||
|
|
|
||
|
|
1. **`download_nushell.nu`** - Download Nushell from GitHub tags
|
||
|
|
```bash
|
||
|
|
./scripts/download_nushell.nu 0.108.0 --clean
|
||
|
|
```
|
||
|
|
|
||
|
|
2. **`analyze_nushell_features.nu`** - Analyze available features
|
||
|
|
```bash
|
||
|
|
./scripts/analyze_nushell_features.nu --validate --export
|
||
|
|
```
|
||
|
|
|
||
|
|
3. **`audit_crate_dependencies.nu`** - Audit plugin dependencies
|
||
|
|
```bash
|
||
|
|
./scripts/audit_crate_dependencies.nu --export
|
||
|
|
```
|
||
|
|
|
||
|
|
4. **`detect_breaking_changes.nu`** - Detect breaking API changes
|
||
|
|
```bash
|
||
|
|
./scripts/detect_breaking_changes.nu --scan-plugins
|
||
|
|
```
|
||
|
|
|
||
|
|
5. **`update_nushell_version.nu`** - Main orchestrator
|
||
|
|
```bash
|
||
|
|
./scripts/update_nushell_version.nu 0.108.0
|
||
|
|
```
|
||
|
|
|
||
|
|
### Script Usage Examples
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# Full automated update (with manual checkpoints)
|
||
|
|
./scripts/update_nushell_version.nu 0.108.0
|
||
|
|
|
||
|
|
# Update to latest release
|
||
|
|
./scripts/update_nushell_version.nu --latest
|
||
|
|
|
||
|
|
# Skip build (faster for testing)
|
||
|
|
./scripts/update_nushell_version.nu 0.108.0 --skip-build
|
||
|
|
|
||
|
|
# Auto-approve all steps (use with caution!)
|
||
|
|
./scripts/update_nushell_version.nu 0.108.0 --auto-approve
|
||
|
|
|
||
|
|
# Check update status
|
||
|
|
./scripts/update_nushell_version.nu status
|
||
|
|
|
||
|
|
# Clean up temporary files
|
||
|
|
./scripts/update_nushell_version.nu clean
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Version Compatibility Matrix
|
||
|
|
|
||
|
|
| Component | 0.107.1 | 0.108.0 | Compatible |
|
||
|
|
|-----------|---------|---------|------------|
|
||
|
|
| nu-plugin | 0.107.1 | 0.108.0 | ✅ Must match |
|
||
|
|
| nu-protocol | 0.107.1 | 0.108.0 | ✅ Must match |
|
||
|
|
| Function signatures | `: type {` | `: nothing -> type {` | ❌ Breaking |
|
||
|
|
| String interpolation | `[$var]` ❌ | `($var)` ✅ | ⚠️ Syntax bug fix |
|
||
|
|
| `into value` | ✅ Works | ❌ Removed | ❌ Breaking |
|
||
|
|
| `detect type` | ❌ N/A | ✅ New | ✅ New command |
|
||
|
|
| Stream errors | Silent | Raises error | ⚠️ Behavior change |
|
||
|
|
| MCP feature | ❌ N/A | ✅ New | ✅ Optional |
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Post-Migration Verification
|
||
|
|
|
||
|
|
After completing migration, verify:
|
||
|
|
|
||
|
|
### 1. Build Success
|
||
|
|
```bash
|
||
|
|
✅ cargo build --release --workspace
|
||
|
|
✅ All plugins compile without errors
|
||
|
|
✅ No clippy warnings for migration-related code
|
||
|
|
```
|
||
|
|
|
||
|
|
### 2. Tests Pass
|
||
|
|
```bash
|
||
|
|
✅ cargo test --workspace
|
||
|
|
✅ All unit tests pass
|
||
|
|
✅ Integration tests pass
|
||
|
|
```
|
||
|
|
|
||
|
|
### 3. Plugins Work
|
||
|
|
```bash
|
||
|
|
✅ All plugins register successfully
|
||
|
|
✅ Plugin commands execute without errors
|
||
|
|
✅ Plugin output matches expected format
|
||
|
|
```
|
||
|
|
|
||
|
|
### 4. Documentation Updated
|
||
|
|
```bash
|
||
|
|
✅ best_nushell_code.md updated with correct syntax
|
||
|
|
✅ Plugin READMEs reference 0.108.0
|
||
|
|
✅ Examples use correct syntax
|
||
|
|
```
|
||
|
|
|
||
|
|
### 5. Scripts Updated
|
||
|
|
```bash
|
||
|
|
✅ All automation scripts use correct syntax
|
||
|
|
✅ Scripts parse without errors
|
||
|
|
✅ Script output is correct
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Timeline
|
||
|
|
|
||
|
|
Expected migration timeline:
|
||
|
|
|
||
|
|
- **Preparation**: 30 minutes (read docs, backup)
|
||
|
|
- **Dependency Update**: 15 minutes (automated)
|
||
|
|
- **Syntax Fixes**: 1-2 hours (depending on codebase size)
|
||
|
|
- **Testing**: 1 hour (automated tests + manual verification)
|
||
|
|
- **Documentation**: 30 minutes
|
||
|
|
- **Total**: ~3-4 hours for complete migration
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Support and Resources
|
||
|
|
|
||
|
|
### Official Documentation
|
||
|
|
- [Nushell 0.108.0 Release Notes](https://github.com/nushell/nushell/releases/tag/0.108.0)
|
||
|
|
- [Nushell Book](https://www.nushell.sh/book/)
|
||
|
|
- [Plugin Development Guide](https://www.nushell.sh/book/plugins.html)
|
||
|
|
|
||
|
|
### Repository Resources
|
||
|
|
- `best_nushell_code.md` - Coding standards and patterns
|
||
|
|
- `NUSHELL_0.108_UPDATE_SUMMARY.md` - Detailed update summary
|
||
|
|
- `NUSHELL_UPDATE_AUTOMATION.md` - Automation guide
|
||
|
|
- `etc/plugin_registry.toml` - Plugin tracking
|
||
|
|
|
||
|
|
### Getting Help
|
||
|
|
- Check automation scripts in `scripts/`
|
||
|
|
- Review git history: `git log --oneline`
|
||
|
|
- Check build errors: `cargo build 2>&1 | less`
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Lessons Learned
|
||
|
|
|
||
|
|
### What Went Well
|
||
|
|
✅ Automated scripts significantly reduced manual work
|
||
|
|
✅ Testing against actual binary caught documentation bugs
|
||
|
|
✅ Semi-automated workflow with manual checkpoints prevented mistakes
|
||
|
|
✅ Comprehensive documentation aided future migrations
|
||
|
|
|
||
|
|
### What Could Be Improved
|
||
|
|
⚠️ Should have validated documentation against binary earlier
|
||
|
|
⚠️ Need better regression testing for syntax changes
|
||
|
|
⚠️ Automation scripts should be tested before use
|
||
|
|
⚠️ Directory naming in download script needs fixing
|
||
|
|
|
||
|
|
### Future Improvements
|
||
|
|
🎯 Add automated syntax validation against binary
|
||
|
|
🎯 Create regression test suite for common patterns
|
||
|
|
🎯 Implement CI/CD for version update testing
|
||
|
|
🎯 Add rollback automation
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
**Migration Guide Version**: 1.0
|
||
|
|
**Last Updated**: 2025-10-18
|
||
|
|
**Next Review**: With Nushell 0.109.0 release
|