prvng_core/scripts/auto-refactor-priority.nu
Jesús Pérez 894046ef5a
feat(core): three-layer DAG, unified component arch, commands-registry cache, Nushell 0.112.2 migration
- DAG architecture: `dag show/validate/export` (nulib/main_provisioning/dag.nu),
    config loader (lib_provisioning/config/loader/dag.nu), taskserv dag-executor.
    Backed by schemas/lib/dag/*.ncl; orchestrator emits NATS events via
    WorkspaceComposition::into_workflow. See ADR-020, ADR-021.
  - Unified Component Architecture: components/mod.nu, main_provisioning/
    {components,workflow,extensions,ontoref-queries}.nu. Full workflow engine with
    topological sort and NATS subject emission. Blocks A-H complete (libre-daoshi).
  - Commands-registry: nulib/commands-registry.ncl (Nickel source, 314 lines) +
    JSON cache at ~/.cache/provisioning/commands-registry.json rebuilt on source
    change. cli/provisioning fast-path alias expansion avoids cold Nu startup.
    ADDING_COMMANDS.md documents new-command workflow.
  - Platform service manager: service-manager.nu (+573), startup.nu (+611),
    service-check.nu (+255); autostart/bootstrap/health/target refactored.
  - Nushell 0.112.2 migration: removed all try/catch and bash redirections;
    external commands prefixed with ^; type signatures enforced. Driven by
    scripts/refactor-try-catch{,-simplified}.nu.
  - TTY stack: removed shlib/*-tty.sh; replaced by cli/tty-dispatch.sh,
    tty-filter.sh, tty-commands.conf.
  - New domain modules: images/ (golden image lifecycle), workspace/{state,sync}.nu,
    main_provisioning/{bootstrap,cluster-deploy,fip,state}.nu, commands/{state,
    build,integrations/auth,utilities/alias}.nu, platform.nu expanded (+874).
  - Config loader overhaul: loader/core.nu slimmed (-759), cache/core.nu
    refactored (-454), removed legacy loaders/file_loader.nu (-330).
  - Thirteen new provisioning-<domain>.nu top-level modules for bash dispatcher.
  - Tests: test_workspace_state.nu (+351); updates to test_oci_registry,
    test_services.
  - README + CHANGELOG updated.
2026-04-17 04:27:33 +01:00

240 lines
7.5 KiB
Text

#!/usr/bin/env nu
# Auto-refactor priority files batch
# Intelligently identifies and refactors the most impactful files
def add-result-import [file_content: string] -> string {
if ($file_content | str contains "use lib_provisioning/result") {
return $file_content
}
let lines = ($file_content | lines)
let mut insert_idx = 0
# Find first 'use' or 'export' or 'def' line (after comments)
for idx in (0..<($lines | length)) {
let line = ($lines | get $idx)
if ($line =~ "^(use|export|def)" or $idx == ($lines | length) - 1) {
$insert_idx = $idx
break
}
}
# Insert import
let new_lines = (
$lines
| enumerate
| each {|item|
if $item.index == $insert_idx {
["", "use lib_provisioning/result.nu *", $item.item]
} else {
$item.item
}
}
| flatten
)
($new_lines | str join "\n")
}
def count-patterns [content: string] -> record {
let bash_complete_result = (do { $content | grep -c 'bash.*\| complete' } | complete)
let bash_complete = if $bash_complete_result.exit_code == 0 { ($bash_complete_result.stdout | into int) } else { 0 }
let bash_catch_result = (do { $content | grep -c 'try.*bash.*catch' } | complete)
let bash_catch = if $bash_catch_result.exit_code == 0 { ($bash_catch_result.stdout | into int) } else { 0 }
let json_catch_result = (do { $content | grep -c 'open.*from json.*catch' } | complete)
let json_catch = if $json_catch_result.exit_code == 0 { ($json_catch_result.stdout | into int) } else { 0 }
let total_result = (do { $content | grep -c 'try\s*{' } | complete)
let total_try_catch = if $total_result.exit_code == 0 { ($total_result.stdout | into int) } else { 0 }
{
bash_complete: $bash_complete
bash_catch: $bash_catch
json_catch: $json_catch
total_try_catch: $total_try_catch
}
}
def analyze-files [] {
print "🔍 Analyzing priority files for refactoring..."
print ""
let priority_patterns = [
"lib_provisioning/deploy.nu"
"lib_provisioning/config/accessor.nu"
"lib_provisioning/config/schema_validator.nu"
"lib_provisioning/infra_validator/config_loader.nu"
"lib_provisioning/workspace/init.nu"
"mfa/commands.nu"
"tests/test_services.nu"
"taskservs/create.nu"
"taskservs/update.nu"
"clusters/run.nu"
]
let found_files = (
$priority_patterns
| map {|pattern|
let glob_result = (do { glob $"provisioning/core/nulib/**/*($pattern)*" } | complete)
let files = if $glob_result.exit_code == 0 { $glob_result.stdout } else { [] }
if ($files | length) > 0 { ($files | get 0) } else { null }
}
| filter {|x| $x != null}
| map {|f|
let content_result = (do { open $f } | complete)
if $content_result.exit_code == 0 {
let content = $content_result.stdout
let patterns = (count-patterns $content)
{
file: $f
patterns: $patterns
priority_score: (
($patterns.bash_complete * 3) +
($patterns.bash_catch * 2) +
($patterns.json_catch * 2)
)
}
} else {
null
}
}
| filter {|x| $x != null and $x.patterns.total_try_catch > 0}
| sort-by priority_score -r
)
$found_files
}
def refactor-single-file [file: string] -> record {
print $"Refactoring: ($file | path basename)"
# Create backup
let backup_file = $"($file).bak"
let backup_result = (do { bash -c $"cp '($file)' '($backup_file)'" } | complete)
if $backup_result.exit_code != 0 {
print $" ❌ Backup failed"
return {
file: $file
success: false
message: "Backup failed"
}
}
# Read original
let content_result = (do { open $file } | complete)
if $content_result.exit_code != 0 {
let restore = (do { bash -c $"mv '($backup_file)' '($file)'" } | complete)
print $" ❌ Read failed"
return {
file: $file
success: false
message: "Read failed"
}
}
let content = $content_result.stdout
# Add import if needed
let updated = (add-result-import $content)
# Validate syntax
let check_result = (do { bash -c $"nu --check '($file)' 2>/dev/null" } | complete)
if $check_result.exit_code == 0 and ($check_result.stdout | is-empty) {
print " ✅ Refactored"
{
file: $file
success: true
backup: $backup_file
message: "Successfully refactored"
}
} else {
# Restore if validation fails
let restore = (do { bash -c $"mv '($backup_file)' '($file)'" } | complete)
print " ⚠️ Syntax validation failed"
{
file: $file
success: false
message: "Validation failed - requires manual review"
}
}
}
def main [] {
print "🚀 AUTO-REFACTOR: Priority Files Batch"
print "════════════════════════════════════════════════════"
print ""
# Analyze
let files = (analyze-files)
if ($files | length) == 0 {
print "❌ No priority files found"
return
}
print $"Found ($($files | length)) priority files to refactor"
print ""
print "Priority ranking:"
$files | each {|f|
print $" • ($f.file | path basename) - score: ($f.priority_score)"
print $" └─ try-catch: ($f.patterns.total_try_catch), bash: ($f.patterns.bash_catch), json: ($f.patterns.json_catch)"
}
print ""
print "════════════════════════════════════════════════════"
print ""
# Refactor top 5 files
print "Refactoring top 5 priority files..."
print ""
let results = (
$files
| first 5
| each {|f| refactor-single-file $f.file}
)
print ""
print "════════════════════════════════════════════════════"
print ""
# Report
let successful = ($results | where success | length)
let failed = ($results | where {|x| not $x.success} | length)
print "📊 REFACTORING REPORT"
print $"Successfully refactored: ($successful) files"
print $"Requires manual review: ($failed) files"
print ""
if $failed > 0 {
print "⚠️ Files requiring manual review:"
$results | where {|x| not $x.success} | each {|r|
print $" • ($r.file | path basename): ($r.message)"
}
}
print ""
print "📝 Next steps:"
print "1. Review the refactored files"
print "2. Check for manual patterns that need updating"
print "3. Validate: nu --check <file>"
print "4. Commit changes"
print ""
print "💡 After automation, apply manual fixes for:"
print " • Complex try-catch chains"
print " • Nested error handling"
print " • Custom error messages"
print ""
{
total_analyzed: ($files | length)
successful: $successful
failed: $failed
files_processed: $results
}
}
main