nushell-plugins/scripts/register_installed_plugins.nu
Jesús Pérez 4b92aa764a
Some checks failed
Build and Test / Validate Setup (push) Has been cancelled
Build and Test / Build (darwin-amd64) (push) Has been cancelled
Build and Test / Build (darwin-arm64) (push) Has been cancelled
Build and Test / Build (linux-amd64) (push) Has been cancelled
Build and Test / Build (windows-amd64) (push) Has been cancelled
Build and Test / Build (linux-arm64) (push) Has been cancelled
Build and Test / Security Audit (push) Has been cancelled
Build and Test / Package Results (push) Has been cancelled
Build and Test / Quality Gate (push) Has been cancelled
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
2025-12-11 22:04:54 +00:00

209 lines
6.1 KiB
Plaintext
Executable File
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env nu
# Register Installed Plugins - Simple Plugin Registration
#
# This script finds plugins already installed in ~/.local/bin
# and registers them with Nushell config
#
# Usage:
# register_installed_plugins.nu # Register all plugins
# register_installed_plugins.nu --check # Check without registering
# register_installed_plugins.nu --verify # Register and verify
def main [
--check (-c) # Check only, don't register
--verify (-v) # Verify registration after adding
] {
log_info "🔌 Plugin Registration Manager"
log_info "=================================================================="
let install_dir = $"($env.HOME)/.local/bin"
# Step 1: Find installed plugins
log_info $"\n📋 Step 1: Finding installed plugins in ($install_dir)..."
let plugins = detect_installed_plugins $install_dir
if ($plugins | length) == 0 {
log_warn $"No plugins found in ($install_dir)"
return
}
log_success $"Found ($plugins | length) plugin\(s\):"
# Group by source
let custom = ($plugins | where source == "custom")
let core = ($plugins | where source == "core")
if ($custom | length) > 0 {
log_info " Custom plugins:"
for plugin in $custom {
log_info $" • ($plugin.name)"
}
}
if ($core | length) > 0 {
log_info " Core Nushell 0.108 plugins:"
for plugin in $core {
log_info $" • ($plugin.name)"
}
} else {
log_info " Core Nushell 0.108 plugins: Not built yet"
log_info ""
log_warn "💡 To include Nushell core plugins (polars, formats, etc):"
log_warn " cd nushell && cargo build --release --workspace && cd .."
log_warn " Then run this script again"
}
if $check {
log_info "\n✅ DRY RUN - No changes made"
return
}
# Step 2: Register plugins
log_info "\n🔌 Step 2: Registering plugins with Nushell..."
register_plugins $plugins $verify
# Final summary
log_info "\n=================================================================="
log_success "✅ Plugin registration complete!"
log_info "Next steps:"
log_info " 1. Restart Nushell: exit && nu"
log_info " 2. Verify plugins: nu -c 'plugin list'"
}
# Find installed plugins in ~/.local/bin and nushell/target/release
def detect_installed_plugins [
install_dir: string
]: nothing -> list<record> {
mut all_plugins = []
# Check ~/.local/bin for custom plugins
try {
let custom_plugins = ls $install_dir
| where type == "file"
| where {|row|
let basename = $row.name | path basename
$basename =~ "^nu_plugin_"
}
| each {|row|
let basename = $row.name | path basename
{
name: $basename
path: $row.name
source: "custom"
}
}
$all_plugins = ($all_plugins | append $custom_plugins)
} catch {
# Silently continue if directory doesn't exist
}
# Check nushell/target/release for core Nushell plugins
let nushell_release = "./nushell/target/release"
if ($nushell_release | path exists) {
try {
let core_plugins = ls $nushell_release
| where type == "file"
| where {|row|
let basename = $row.name | path basename
$basename =~ "^nu_plugin_"
}
| each {|row|
let basename = $row.name | path basename
{
name: $basename
path: $row.name
source: "core"
}
}
$all_plugins = ($all_plugins | append $core_plugins)
} catch {
# Silently continue if error reading directory
}
}
$all_plugins
}
# Register plugins with Nushell
def register_plugins [
plugins: list<record>
verify: bool
] {
let results = $plugins | each {|plugin|
let plugin_path = $plugin.path
let plugin_name = ($plugin.name | str replace "^nu_plugin_" "")
log_info $" Registering: ($plugin.name)"
let reg_result = try {
# Remove old registration if exists (suppress error)
try {
nu -c $"plugin rm ($plugin_name)" out+err>| null
} catch {
# Ignore if doesn't exist
}
# Add new registration
nu -c $"plugin add ($plugin_path)"
log_success $" ✓ Registered"
# Verify if requested
if $verify {
try {
let found = nu -c $"plugin list | where name =~ ($plugin_name) | length" | into int
if $found > 0 {
log_success $" ✓ Verified"
{success: true, verified: true}
} else {
log_warn $" ⚠️ Could not verify"
{success: true, verified: false}
}
} catch {
log_warn $" ⚠️ Verification failed"
{success: true, verified: false}
}
} else {
{success: true, verified: null}
}
} catch {|err|
log_error $" ✗ Registration failed: ($err.msg)"
{success: false, verified: false}
}
$reg_result
}
let registered = ($results | where success | length)
let failed = ($results | where {|r| not $r.success} | length)
print ""
log_success $"📊 Summary:"
log_success $" ✅ Registered: ($registered) plugins"
if $failed > 0 {
log_error $" ❌ Failed: ($failed) plugins"
}
}
# Logging functions
def log_info [msg: string] {
print $" ($msg)"
}
def log_success [msg: string] {
print $"✅ ($msg)"
}
def log_error [msg: string] {
print $"❌ ($msg)"
}
def log_warn [msg: string] {
print $"⚠️ ($msg)"
}
# Call main function
main