From 187a69575cd9bc26acc319c51e0b425cc212ae5c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jesu=CC=81s=20Pe=CC=81rez?= Date: Sat, 20 Sep 2025 20:13:14 +0100 Subject: [PATCH] chore: add scripts to register plugins in nushell --- justfiles/alias.just | 6 + justfiles/help.just | 2 + justfiles/tools.just | 78 +++++++++- nu_plugin_port_extension/Cargo.toml | 2 +- scripts/install_plugin.nu | 98 +++++++++++++ scripts/register_plugins.nu | 214 ++++++++++++++++++++++++++++ 6 files changed, 394 insertions(+), 6 deletions(-) create mode 100644 scripts/install_plugin.nu create mode 100644 scripts/register_plugins.nu diff --git a/justfiles/alias.just b/justfiles/alias.just index 8bc9c8c..d22ceaa 100644 --- a/justfiles/alias.just +++ b/justfiles/alias.just @@ -7,8 +7,14 @@ alias h := help # Build alias for quick compilation alias b := build +# install plugins locally +alias i := install-local + # Build alias to collect targets alias c := collect +# Verify plugins +alias v := verify-plugins + # Status alias for quick status check alias s := status diff --git a/justfiles/help.just b/justfiles/help.just index bda08b6..a86b7e9 100644 --- a/justfiles/help.just +++ b/justfiles/help.just @@ -24,7 +24,9 @@ help AREA="": echo " just h - Short alias for help" echo " just b - Build all plugins (alias for build)" echo " just c - Collect all plugins targets (alias for collect)" + echo " just i - Install plugin (alias for install)" echo " just s - Show plugin status (alias for status)" + echo " just v - Verify plugins (alias for verify-plugins)" echo " just validate-nushell - Check version consistency (START HERE)" echo " just dev-flow - Complete development workflow" echo "" diff --git a/justfiles/tools.just b/justfiles/tools.just index 4d54aaf..a3610d0 100644 --- a/justfiles/tools.just +++ b/justfiles/tools.just @@ -41,12 +41,75 @@ make-plugin PLUGIN_NAME: @echo "🆕 Creating new plugin: {{PLUGIN_NAME}}" @{{justfile_directory()}}/scripts/run.sh make_plugin.nu {{PLUGIN_NAME}} -# Install specific plugin locally +# Install specific plugin locally (build + register) [no-cd] install-plugin PLUGIN: - @echo "📥 Installing {{PLUGIN}} locally..." - @cd {{PLUGIN}} && cargo build --release - @echo "To add to nushell: plugin add ./{{PLUGIN}}/target/release/{{PLUGIN}}" + @{{justfile_directory()}}/scripts/run.sh install_plugin.nu {{PLUGIN}} --verify + +# Register specific plugin with nushell +[no-cd] +register-plugin PLUGIN: + @{{justfile_directory()}}/scripts/run.sh register_plugins.nu register ./{{PLUGIN}}/target/release/{{PLUGIN}} --verify + +# Register all built plugins with nushell +[no-cd] +register-all-plugins: + @{{justfile_directory()}}/scripts/run.sh register_plugins.nu register-all --verify + +# Verify plugin registration status +[no-cd] +verify-plugins: + @{{justfile_directory()}}/scripts/run.sh register_plugins.nu verify + +# Install plugins locally from distribution +[no-cd] +install-local: + #!/usr/bin/env bash + if [ ! -d "distribution" ]; then + echo "❌ Distribution directory not found" + echo "💡 Run 'just collect' first to create distribution" + exit 1 + fi + + if [ ! -f "distribution/install_nu_plugins.nu" ]; then + echo "❌ Installation script not found in distribution" + echo "💡 Run 'just collect' to regenerate distribution" + exit 1 + fi + + echo "📦 Installing plugins locally from distribution..." + echo "💡 Using register-only mode (no sudo required)" + cd distribution && nu install_nu_plugins.nu --register-only --verify + + echo "" + echo "✅ Local installation completed!" + echo "💡 Plugins are now registered with nushell from current location" + echo " Run 'plugin list' in nushell to see installed plugins" + +# Install plugins to system from distribution (requires sudo) +[no-cd] +install-system: + #!/usr/bin/env bash + if [ ! -d "distribution" ]; then + echo "❌ Distribution directory not found" + echo "💡 Run 'just collect' first to create distribution" + exit 1 + fi + + if [ ! -f "distribution/install_nu_plugins.nu" ]; then + echo "❌ Installation script not found in distribution" + echo "💡 Run 'just collect' to regenerate distribution" + exit 1 + fi + + echo "📦 Installing plugins to system from distribution..." + echo "💡 This will copy binaries to /usr/local/bin (requires sudo)" + cd distribution && nu install_nu_plugins.nu --verify + + echo "" + echo "✅ System installation completed!" + echo "💡 Plugins are installed in /usr/local/bin and registered with nushell" + echo " Run 'plugin list' in nushell to see installed plugins" # Remove plugin from workspace [no-cd] @@ -338,7 +401,12 @@ tools-help: @echo "" @echo "PLUGIN MANAGEMENT:" @echo " make-plugin NAME - Create new plugin from template" - @echo " install-plugin PLUGIN - Install plugin locally" + @echo " install-plugin PLUGIN - Build and register plugin (alias: i)" + @echo " register-plugin PLUGIN - Register plugin with nushell" + @echo " register-all-plugins - Register all built plugins with nushell" + @echo " verify-plugins - Verify plugin registration status" + @echo " install-local - Install plugins from distribution locally (no sudo)" + @echo " install-system - Install plugins to system from distribution (sudo)" @echo " remove-plugin PLUGIN - Remove plugin from workspace" @echo " list-plugins - List all plugins" @echo " plugin-info PLUGIN - Show plugin information" diff --git a/nu_plugin_port_extension/Cargo.toml b/nu_plugin_port_extension/Cargo.toml index cfc6219..d02c4f7 100644 --- a/nu_plugin_port_extension/Cargo.toml +++ b/nu_plugin_port_extension/Cargo.toml @@ -18,5 +18,5 @@ sysinfo = "0.37" [dependencies.nu-protocol] features = ["plugin"] -version = "0.107.0" +version = "0.107.1" path = "../nushell/crates/nu-protocol" diff --git a/scripts/install_plugin.nu b/scripts/install_plugin.nu new file mode 100644 index 0000000..e1c7cec --- /dev/null +++ b/scripts/install_plugin.nu @@ -0,0 +1,98 @@ +#!/usr/bin/env nu + +# Plugin Installation Script +# Builds and registers nushell plugins + +# Build and register a single plugin +def install_single_plugin [ + plugin_name: string + --verify (-v) # Verify registration after installation +] { + print $"📥 Installing ($plugin_name) locally..." + + # Check if plugin directory exists + if not ($plugin_name | path exists) { + print $"❌ Plugin directory not found: ($plugin_name)" + return {success: false, error: "directory_not_found"} + } + + # Build the plugin + print $"🔨 Building ($plugin_name)..." + try { + nu -c $"cd ($plugin_name); cargo build --release" + } catch {|err| + print $"❌ Build failed for ($plugin_name): ($err.msg)" + return {success: false, error: "build_failed"} + } + + # Check if binary was created + let binary_path = $"($plugin_name)/target/release/($plugin_name)" + if not ($binary_path | path exists) { + print $"❌ Plugin binary not found after build: ($binary_path)" + return {success: false, error: "binary_not_found"} + } + + # Register the plugin using our registration script + print "🔌 Registering with nushell..." + if $verify { + let register_result = (nu $"./scripts/register_plugins.nu" register $binary_path --verify) + } else { + let register_result = (nu $"./scripts/register_plugins.nu" register $binary_path) + } + + print $"✅ ($plugin_name) installation completed" + return {success: true, binary_path: $binary_path} +} + +# Main command interface +def main [ + plugin_name?: string # Plugin name to install + --verify (-v) # Verify registration after installation + --all (-a) # Install all plugins +] { + if $all { + print "📥 Installing all plugins..." + let plugin_dirs = (glob "nu_plugin_*" | where ($it | path type) == "dir") + + if ($plugin_dirs | is-empty) { + print "❓ No plugin directories found" + return + } + + mut installed = 0 + mut failed = 0 + + for plugin in $plugin_dirs { + let result = (install_single_plugin $plugin --verify=$verify) + if $result.success { + $installed = $installed + 1 + } else { + $failed = $failed + 1 + } + } + + print "" + print "📊 Installation summary:" + print $" ✅ Installed: ($installed) plugins" + if $failed > 0 { + print $" ❌ Failed: ($failed) plugins" + } + } else if not ($plugin_name | is-empty) { + install_single_plugin $plugin_name --verify=$verify + } else { + print "🔧 Plugin Installation Script" + print "=============================" + print "" + print "Usage:" + print " nu install_plugin.nu [--verify]" + print " nu install_plugin.nu --all [--verify]" + print "" + print "Options:" + print " --verify (-v) - Verify registration after installation" + print " --all (-a) - Install all plugins" + print "" + print "Examples:" + print " nu install_plugin.nu nu_plugin_clipboard --verify" + print " nu install_plugin.nu --all --verify" + } +} \ No newline at end of file diff --git a/scripts/register_plugins.nu b/scripts/register_plugins.nu new file mode 100644 index 0000000..a52874b --- /dev/null +++ b/scripts/register_plugins.nu @@ -0,0 +1,214 @@ +#!/usr/bin/env nu + +# Plugin Registration Script with Verification +# Handles registration of nushell plugins with automatic verification + +# Register a single plugin +def register_single_plugin [ + plugin_path: string + --verify (-v) # Verify registration after plugin add +] { + let plugin_name = ($plugin_path | path basename) + let display_name = ($plugin_name | str replace "nu_plugin_" "") + + print $"🔌 Registering ($plugin_name)..." + + if not ($plugin_path | path exists) { + print $"❌ Plugin binary not found: ($plugin_path)" + return {success: false, error: "binary_not_found"} + } + + # Register the plugin + try { + nu -c $"plugin add ($plugin_path)" + print $" ✅ Registered ($plugin_name)" + + # Verify if requested + if $verify { + print $" 🔍 Verifying registration..." + let found = (nu -c $"plugin list | where name =~ ($display_name) | length" | into int) + + if $found > 0 { + print $" ✅ Verified ($plugin_name)" + return {success: true, verified: true} + } else { + print $" ⚠️ Could not verify ($plugin_name)" + return {success: true, verified: false} + } + } else { + return {success: true, verified: null} + } + } catch {|err| + print $" ❌ Failed to register ($plugin_name): ($err.msg)" + return {success: false, error: $err.msg} + } +} + +# Register multiple plugins +def register_multiple_plugins [ + plugin_paths: list + --verify (-v) # Verify registration after each plugin add +] { + mut results = [] + mut registered = 0 + mut failed = 0 + mut verified = 0 + + for plugin_path in $plugin_paths { + let result = (register_single_plugin $plugin_path --verify=$verify) + $results = ($results | append $result) + + if $result.success { + $registered = $registered + 1 + if $verify and $result.verified { + $verified = $verified + 1 + } + } else { + $failed = $failed + 1 + } + } + + print "" + print "📊 Registration summary:" + print $" ✅ Registered: ($registered) plugins" + if $verify { + print $" 🔍 Verified: ($verified) plugins" + } + if $failed > 0 { + print $" ❌ Failed: ($failed) plugins" + } + + { + total: ($plugin_paths | length), + registered: $registered, + failed: $failed, + verified: $verified, + results: $results + } +} + +# Verify plugin registration status +def verify_plugin_registration [ + plugin_paths: list +] { + print "🔍 Verifying plugin registration status..." + print "" + + mut registered_plugins = 0 + mut total_plugins = ($plugin_paths | length) + + for plugin_path in $plugin_paths { + let plugin_name = ($plugin_path | path basename) + let display_name = ($plugin_name | str replace "nu_plugin_" "") + + if ($plugin_path | path exists) { + let found = (nu -c $"plugin list | where name =~ ($display_name) | length" | into int) + + if $found > 0 { + print $" ✅ ($plugin_name) \(registered\)" + $registered_plugins = $registered_plugins + 1 + } else { + print $" ❌ ($plugin_name) \(not registered\)" + print $" 💡 Register with: nu register_plugins.nu register ($plugin_path)" + } + } else { + print $" ⚠️ ($plugin_name) \(binary not found\)" + } + } + + print "" + print "📊 Verification summary:" + print $" 📦 Total plugins: ($total_plugins)" + print $" ✅ Registered: ($registered_plugins)" + print $" ❌ Not registered: ($total_plugins - $registered_plugins)" + + if $registered_plugins == $total_plugins and $total_plugins > 0 { + print "" + print "🎉 All plugins are properly registered!" + } else if $total_plugins == 0 { + print "" + print "💡 No plugins found." + } else { + print "" + print "💡 Some plugins need registration" + } + + { + total: $total_plugins, + registered: $registered_plugins, + missing: ($total_plugins - $registered_plugins) + } +} + +# Find all built plugins in the workspace +def find_built_plugins [] { + glob "nu_plugin_*/target/release/nu_plugin_*" + | where ($it | path type) == "file" + | where not ($it | str ends-with ".d") +} + +# Main command interface +def main [ + command?: string # Command: register, verify, register-all + plugin_path?: string # Plugin path for single registration + --verify (-v) # Verify registration + --paths (-p): list = [] # Multiple plugin paths +] { + match $command { + "register" => { + if ($plugin_path | is-empty) { + print "❌ Plugin path required for register command" + print "Usage: nu register_plugins.nu register [--verify]" + return + } + register_single_plugin $plugin_path --verify=$verify + } + "register-multiple" => { + if ($paths | is-empty) { + print "❌ Plugin paths required for register-multiple command" + print "Usage: nu register_plugins.nu register-multiple --paths [path1, path2, ...]" + return + } + register_multiple_plugins $paths --verify=$verify + } + "register-all" => { + let built_plugins = (find_built_plugins) + if ($built_plugins | is-empty) { + print "❓ No built plugins found" + print "💡 Run 'cargo build --release' in plugin directories first" + return + } + print $"🔌 Registering all built plugins... \(found ($built_plugins | length)\)" + register_multiple_plugins $built_plugins --verify=$verify + } + "verify" => { + if not ($plugin_path | is-empty) { + verify_plugin_registration [$plugin_path] + } else if not ($paths | is-empty) { + verify_plugin_registration $paths + } else { + let built_plugins = (find_built_plugins) + verify_plugin_registration $built_plugins + } + } + _ => { + print "🔌 Plugin Registration Script" + print "==============================" + print "" + print "Commands:" + print " register - Register single plugin" + print " register-multiple - Register multiple plugins (use --paths)" + print " register-all - Register all built plugins" + print " verify [path] - Verify plugin registration" + print "" + print "Options:" + print " --verify (-v) - Verify registration after plugin add" + print " --paths (-p) [...] - Specify multiple plugin paths" + print "" + print "Examples:" + print " nu register_plugins.nu register ./nu_plugin_clipboard/target/release/nu_plugin_clipboard --verify" + print " nu register_plugins.nu register-all --verify" + print " nu register_plugins.nu verify" + } + } +} \ No newline at end of file