Jesús Pérez 85ce530733
feat: update provisioning core CLI, libraries, and plugins
Update core components including CLI, Nushell libraries, plugins system,
and utility scripts for the provisioning system.

CLI Updates:
- Command implementations
- CLI utilities and dispatching
- Help system improvements
- Command validation

Library Updates:
- Configuration management system
- Infrastructure validation
- Extension system improvements
- Secrets management
- Workspace operations
- Cache management system

Plugin System:
- Interactive form plugin (inquire)
- KCL integration plugin
- Performance optimization plugins
- Plugin registration system

Utilities:
- Build and distribution scripts
- Installation procedures
- Testing utilities
- Development tools

Documentation:
- Library module documentation
- Extension API guides
- Plugin usage guides
- Service management documentation

All changes are backward compatible. No breaking changes.
2025-12-11 21:57:05 +00:00

358 lines
11 KiB
Plaintext
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.

# Setup Module - System Setup and Configuration Management
# Orchestrates all setup subcommands with helper functions for configuration management
# Follows Nushell guidelines: explicit types, single purpose, no try-catch
use ../config/accessor.nu *
use ../utils/logging.nu *
# Re-export existing utilities and config helpers
export use utils.nu *
export use config.nu *
# ============================================================================
# CONFIGURATION PATH HELPERS
# ============================================================================
# Get OS-appropriate base configuration directory
export def get-config-base-path []: nothing -> string {
match $nu.os-info.name {
"macos" => {
let home = ($env.HOME? | default "~" | path expand)
$"($home)/Library/Application Support/provisioning"
}
"windows" => {
let appdata = ($env.APPDATA? | default "~" | path expand)
$"($appdata)/provisioning"
}
_ => {
# Default to Linux convention
let home = ($env.HOME? | default "~" | path expand)
$"($home)/.config/provisioning"
}
}
}
# Get provisioning installation path
export def get-install-path []: nothing -> string {
config-get "setup.install_path" (get-base-path)
}
# Get global workspaces directory
export def get-workspaces-dir []: nothing -> string {
let config_base = (get-config-base-path)
$"($config_base)/workspaces"
}
# Get cache directory
export def get-cache-dir []: nothing -> string {
let config_base = (get-config-base-path)
$"($config_base)/cache"
}
# ============================================================================
# DIRECTORY MANAGEMENT
# ============================================================================
# Ensure configuration directories exist
export def ensure-config-dirs []: nothing -> bool {
let config_base = (get-config-base-path)
let workspaces_dir = (get-workspaces-dir)
let cache_dir = (get-cache-dir)
let platform_dir = $"($config_base)/platform"
let providers_dir = $"($config_base)/providers"
let result_config = (do { mkdir $config_base } | complete)
let result_workspaces = (do { mkdir $workspaces_dir } | complete)
let result_cache = (do { mkdir $cache_dir } | complete)
let result_platform = (do { mkdir $platform_dir } | complete)
let result_providers = (do { mkdir $providers_dir } | complete)
(($result_config.exit_code == 0) and
($result_workspaces.exit_code == 0) and
($result_cache.exit_code == 0) and
($result_platform.exit_code == 0) and
($result_providers.exit_code == 0))
}
# ============================================================================
# CONFIGURATION FILE MANAGEMENT
# ============================================================================
# Load TOML configuration file
export def load-config-toml [
file_path: string
]: nothing -> record {
if ($file_path | path exists) {
let file_content = (open $file_path)
match ($file_content | type) {
"record" => $file_content
_ => {
print $"⚠️ Warning: Config file ($file_path) is not a valid TOML record"
{}
}
}
} else {
{}
}
}
# Save TOML configuration file
export def save-config-toml [
file_path: string
config: record
]: nothing -> bool {
let result = (do { $config | to toml | save -f $file_path } | complete)
($result.exit_code == 0)
}
# Load YAML configuration file
export def load-config-yaml [
file_path: string
]: nothing -> record {
if ($file_path | path exists) {
let file_content = (open $file_path)
match ($file_content | type) {
"record" => $file_content
_ => {
print $"⚠️ Warning: Config file ($file_path) is not a valid YAML record"
{}
}
}
} else {
{}
}
}
# Save YAML configuration file
export def save-config-yaml [
file_path: string
config: record
]: nothing -> bool {
let result = (do { $config | to yaml | save -f $file_path } | complete)
($result.exit_code == 0)
}
# ============================================================================
# SYSTEM INFORMATION DETECTION
# ============================================================================
# Detect operating system
export def detect-os []: nothing -> string {
$nu.os-info.name
}
# Get system architecture
export def detect-architecture []: nothing -> string {
$env.PROCESSOR_ARCHITECTURE? | default $nu.os-info.arch
}
# Get CPU count
export def get-cpu-count []: nothing -> int {
let result = (do {
match (detect-os) {
"macos" => { ^sysctl -n hw.ncpu }
"windows" => {
($env.NUMBER_OF_PROCESSORS? | default "4")
}
_ => {
^nproc
}
}
} | complete)
if ($result.exit_code == 0) {
($result.stdout | str trim | into int) | default 4
} else {
4
}
}
# Get system memory in GB
export def get-system-memory-gb []: nothing -> int {
let result = (do {
match (detect-os) {
"macos" => { ^sysctl -n hw.memsize }
"windows" => {
($env.TOTAL_PHYSICAL_MEMORY? | default "8589934592")
}
_ => {
let mem_kb = (do {
^grep -i memtotal /proc/meminfo | awk '{print $2}'
} | complete)
if ($mem_kb.exit_code == 0) {
($mem_kb.stdout | str trim)
} else {
"8388608"
}
}
}
} | complete)
if ($result.exit_code == 0) {
let bytes = ($result.stdout | str trim | into int) | default 8589934592
($bytes / 1_000_000_000 | math floor) | default 8
} else {
8
}
}
# Get system disk space in GB
export def get-system-disk-gb []: nothing -> int {
let home_dir = ($env.HOME? | default "~" | path expand)
let result = (do {
^df -H $home_dir | tail -n 1 | awk '{print $2}'
} | complete)
if ($result.exit_code == 0) {
let size_str = ($result.stdout | str trim)
($size_str | str replace -a 'G' '' | str replace -a 'T' '000' | str trim | into int) | default 100
} else {
100
}
}
# Get current timestamp in ISO 8601 format
export def get-timestamp-iso8601 []: nothing -> string {
(date now | format date "%Y-%m-%dT%H:%M:%SZ")
}
# Get current user
export def get-current-user []: nothing -> string {
$env.USER? | default $env.USERNAME? | default "unknown"
}
# Get system hostname
export def get-system-hostname []: nothing -> string {
let result = (do { ^hostname } | complete)
if ($result.exit_code == 0) {
$result.stdout | str trim
} else {
"unknown"
}
}
# ============================================================================
# SETUP MESSAGE HELPERS
# ============================================================================
# Print setup section header
export def print-setup-header [
title: string
]: nothing -> nothing {
print ""
print $"🔧 ($title)"
print "════════════════════════════════════════════════════════════════"
}
# Print setup success message
export def print-setup-success [
message: string
]: nothing -> nothing {
print $"✅ ($message)"
}
# Print setup warning message
export def print-setup-warning [
message: string
]: nothing -> nothing {
print $"⚠️ ($message)"
}
# Print setup error message
export def print-setup-error [
message: string
]: nothing -> nothing {
print $"❌ ($message)"
}
# Print setup info message
export def print-setup-info [
message: string
]: nothing -> nothing {
print $" ($message)"
}
# ============================================================================
# SETUP COMMAND DISPATCHER
# ============================================================================
# Main setup dispatcher - routes to appropriate subcommand
export def setup-dispatch [
command: string
args: list<string>
--verbose = false
]: nothing -> nothing {
# Ensure config directories exist before any setup operation
if not (ensure-config-dirs) {
print-setup-error "Failed to create configuration directories"
return
}
match $command {
"system" => {
print-setup-info "System setup not yet implemented"
}
"workspace" => {
print-setup-info "Workspace setup not yet implemented"
}
"provider" => {
print-setup-info "Provider setup not yet implemented"
}
"platform" => {
print-setup-info "Platform setup not yet implemented"
}
"update" => {
print-setup-info "Setup update not yet implemented"
}
"wizard" => {
print-setup-info "Interactive wizard not yet implemented"
}
"validate" => {
print-setup-info "Setup validation not yet implemented"
}
"migrate" => {
print-setup-info "Setup migration not yet implemented"
}
"detect" => {
print-setup-header "System Detection Results"
print $"Operating System: (detect-os)"
print $"Architecture: (detect-architecture)"
print $"CPU Count: (get-cpu-count)"
print $"Memory (GB): (get-system-memory-gb)"
print $"Disk (GB): (get-system-disk-gb)"
print $"Hostname: (get-system-hostname)"
print $"Current User: (get-current-user)"
print ""
}
_ => {
print-setup-error $"Unknown setup command: ($command)"
print ""
print "Available setup commands:"
print " system - Complete system setup"
print " workspace - Create new workspace"
print " provider - Configure provider"
print " platform - Setup platform services"
print " update - Update existing configuration"
print " wizard - Interactive setup wizard"
print " validate - Validate configuration"
print " migrate - Migrate existing configuration"
print " detect - Show detected system information"
}
}
}
# ============================================================================
# MODULE INITIALIZATION
# ============================================================================
# Initialize setup module
export def setup-init []: nothing -> bool {
ensure-config-dirs
}
# Get setup module version
export def get-setup-version []: nothing -> string {
"1.0.0"
}