nushell-plugins/scripts/create_distribution_manifest.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

146 lines
4.3 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
# Create Distribution Manifest - Scan & List Available Plugins
#
# Scans the distribution directory for available plugin binaries
# and creates a manifest file for the installer to use.
#
# Usage:
# create_distribution_manifest.nu # Scan current directory
# create_distribution_manifest.nu ./dist # Scan specific directory
# create_distribution_manifest.nu --output manifest.json
def main [
source_dir: string = "." # Directory to scan for plugins
--output: string = "DISTRIBUTION_MANIFEST.json" # Output manifest file
] {
log_info "📋 Distribution Manifest Generator"
log_info "=================================================================="
log_info $"\n🔍 Step 1: Scanning directory: ($source_dir)"
# Find all plugin binaries
let plugins = scan_for_plugins $source_dir
if ($plugins | length) == 0 {
log_error "No plugin binaries found!"
log_error $"Expected: ($source_dir)/nu_plugin_*"
return
}
log_success $"Found ($plugins | length) plugin\(s\)"
print ""
# Display found plugins
for plugin in $plugins {
log_info $" ✓ ($plugin.name)"
}
# Create manifest
log_info $"\n📝 Step 2: Creating manifest..."
let manifest = {
version: "1.0.0"
created: (date now | format date "%Y-%m-%dT%H:%M:%SZ")
source_directory: $source_dir
total_plugins: ($plugins | length)
plugins: $plugins
}
# Save manifest
log_info $"\n💾 Step 3: Saving to ($output)..."
try {
$manifest | to json | save -f $output
log_success $"Manifest saved: ($output)"
} catch {|err|
log_error $"Failed to save manifest: ($err.msg)"
return
}
# Summary
log_info "\n=================================================================="
log_success "✅ Manifest created!"
log_info ""
log_info "Next steps:"
log_info $" 1. Include ($output) in distribution"
log_info " 2. Run installer with: install_from_manifest.nu --manifest $output"
}
# Scan directory for plugins
def scan_for_plugins [source_dir: string]: nothing -> list<record> {
mut found = []
try {
let all_files = ls $source_dir
let plugin_files = $all_files
| where type == "file"
| where {|row|
let basename = $row.name | path basename
$basename =~ "^nu_plugin_"
}
let plugins = $plugin_files | each {|row|
let basename = $row.name | path basename
let purpose = get_plugin_purpose $basename
let file_size = $row.size
{
name: $basename
purpose: $purpose
path: $row.name
size_bytes: $file_size
}
}
$found = $plugins
} catch {|err|
log_error $"Error scanning directory: ($err.msg)"
}
$found
}
# Get plugin purpose/description
def get_plugin_purpose [name: string]: nothing -> string {
let purposes = {
"nu_plugin_auth": "Authentication (JWT, MFA)"
"nu_plugin_kms": "Encryption & KMS"
"nu_plugin_orchestrator": "Orchestration operations"
"nu_plugin_kcl": "KCL configuration"
"nu_plugin_tera": "Template rendering"
"nu_plugin_highlight": "Syntax highlighting"
"nu_plugin_clipboard": "Clipboard operations"
"nu_plugin_image": "Image processing"
"nu_plugin_hashes": "Hash functions"
"nu_plugin_qr_maker": "QR code generation"
"nu_plugin_fluent": "Localization"
"nu_plugin_desktop_notifications": "Desktop notifications"
"nu_plugin_port_extension": "Port extensions"
"nu_plugin_polars": "Data analysis"
"nu_plugin_formats": "Format conversion"
"nu_plugin_inc": "Increment operations"
"nu_plugin_gstat": "Git status"
"nu_plugin_query": "Advanced querying"
"nu_plugin_custom_values": "Custom values"
"nu_plugin_example": "Example template"
"nu_plugin_stress_internals": "Stress testing"
}
$purposes | get --optional $name | default "Nushell plugin"
}
# Logging
def log_info [msg: string] {
print $" ($msg)"
}
def log_success [msg: string] {
print $"✅ ($msg)"
}
def log_error [msg: string] {
print $"❌ ($msg)"
}
main