droidtui 0.4.0

A beautiful Terminal User Interface (TUI) for Android development and ADB commands
Documentation
#!/usr/bin/env nu
# Prepare a release: update Cargo.toml version, regenerate CHANGELOG.md,
# and write RELEASE_CHANGELOG.md with full release notes.
#
# Usage: nu scripts/release_prepare.nu <tag>
# Example: nu scripts/release_prepare.nu v0.3.0

def main [
    tag: string,  # The release tag, e.g. "v0.3.0"
] {
    let green  = (ansi green)
    let cyan   = (ansi cyan)
    let red    = (ansi red)
    let reset  = (ansi reset)

    # Strip leading 'v' to get the bare version number
    let version = $tag | str replace --regex '^v' ''

    print $"($cyan)════════════════════════════════════════($reset)"
    print $"($cyan)  Release Prepare: ($tag)($reset)"
    print $"($cyan)════════════════════════════════════════($reset)"
    print ""

    # ── Step 1: Update Cargo.toml ─────────────────────────────────────────────
    print $"($cyan)Step 1/4: Updating Cargo.toml to ($version)...($reset)"

    let cargo_lines = open Cargo.toml --raw | lines
    let updated_cargo = $cargo_lines
        | each { |line|
            if ($line =~ '^version\s*=\s*"[^"]*"') {
                $'version      = "($version)"'
            } else {
                $line
            }
        }
        | str join "\n"
    $updated_cargo | save --force Cargo.toml

    # Verify
    let got = open Cargo.toml --raw
        | lines
        | where { |l| $l =~ '^version\s*=' }
        | first
        | parse --regex 'version\s*=\s*"(?P<v>[^"]+)"'
        | get v
        | first
    if $got != $version {
        error make { msg: $"($red)Failed to update Cargo.toml \(got ($got), expected ($version)\)($reset)" }
    }
    print $"($green)✓ Cargo.toml updated to ($version)($reset)"

    # ── Step 2: Regenerate CHANGELOG.md ──────────────────────────────────────
    print ""
    print $"($cyan)Step 2/4: Regenerating CHANGELOG.md...($reset)"
    run-external "git-cliff" "--config" "cliff.toml" "--latest" "--output" "CHANGELOG.md"
    print $"($green)✓ CHANGELOG.md written($reset)"

    # ── Step 3: Generate per-release diff for release notes ───────────────────
    print ""
    print $"($cyan)Step 3/4: Generating release diff...($reset)"

    let last_tag_result = do { run-external "git" "describe" "--tags" "--abbrev=0" "HEAD^" } | complete
    let last_tag = if $last_tag_result.exit_code == 0 {
        $last_tag_result.stdout | str trim
    } else {
        ""
    }

    if ($last_tag | is-empty) {
        run-external "git-cliff" "--config" "cliff.toml" "--tag" $tag "--strip" "header" "--output" "CLIFF_CHANGES.md"
    } else {
        run-external "git-cliff" "--config" "cliff.toml" $"($last_tag)..($tag)" "--strip" "header" "--output" "CLIFF_CHANGES.md"
    }
    print $"($green)✓ Release diff written($reset)"

    # ── Step 4: Build RELEASE_CHANGELOG.md ───────────────────────────────────
    print ""
    print $"($cyan)Step 4/4: Writing RELEASE_CHANGELOG.md...($reset)"

    let cliff_changes = open CLIFF_CHANGES.md --raw

    let changes_header = if ($last_tag | is-empty) {
        "### 🎉 Initial Release"
    } else {
        $"### 📝 Changes since ($last_tag):"
    }

    let notes = [
        $"# droidtui ($version)"
        ""
        "## 🚀 What's New"
        ""
        $changes_header
        ""
        $cliff_changes
        ""
        "## 📦 Installation"
        ""
        "```bash"
        "cargo install droidtui"
        "```"
        ""
        "Or download the pre-built binary from the [releases page](https://github.com/sorinirimies/droidtui/releases)."
        ""
        "## 🚀 Quick Start"
        ""
        "```bash"
        "# Run DroidTUI"
        "droidtui"
        ""
        "# Navigate with vim-style keys"
        "# Use j/k or arrow keys to navigate"
        "# Press Enter or → to enter sub-menus"
        "# Press Esc or q to quit"
        "```"
        ""
        "## 📋 Requirements"
        ""
        "- Android SDK platform-tools (`adb`) for full functionality"
        "- Terminal with 256-color support recommended"
    ] | str join "\n"

    $notes | save --force RELEASE_CHANGELOG.md
    print $"($green)✓ RELEASE_CHANGELOG.md written($reset)"

    # ── Summary ───────────────────────────────────────────────────────────────
    print ""
    print $"($cyan)════════════════════════════════════════($reset)"
    print $"($green)✓ Release ($tag) prepared successfully! 🚀($reset)"
    print $"($cyan)════════════════════════════════════════($reset)"
    print ""
    print "Files written:"
    print $"  ($green)Cargo.toml($reset)            version → ($version)"
    print $"  ($green)CHANGELOG.md($reset)          full history"
    print $"  ($green)RELEASE_CHANGELOG.md($reset)  release notes for ($tag)"
}