From 2d35f2d71126c9a0a2b98cb668cccb7cbba59f12 Mon Sep 17 00:00:00 2001 From: xydac Date: Sun, 12 Apr 2026 09:02:50 -0700 Subject: [PATCH 01/12] Add profiles, safe idempotent installer, modern stack, CI - Split shell config into profiles (classic + modern); root zshrc.file and vimrc.file become dispatchers that read ~/.xydacshell/profile. Existing ~/.zshrc symlinks keep working with no action needed; missing profile defaults to classic, which loads the original setup unchanged. - Rewrite install.sh as idempotent, profile-aware, with --dry-run, --force, and --profile flags. New backups go to backup// so the legacy pre-install backup/.zshrc and backup/.vimrc stay untouched. The installer refuses to run with uncommitted local edits, and hash-verifies that zshrc.custom and vimrc.custom are not modified during a run. - Add modern profile: starship config echoing the classic two-line prompt, a small nvim init.lua keeping the backtick leader for muscle memory, and a zshrc that uses fzf/zoxide/eza/bat when present with graceful fallbacks. - Fix broken %{...%} escape sequences in materialshell-electro.zsh-theme (lines 68-73) that leaked raw escapes on dirty repos. - Add CI: shellcheck, zsh -n syntax check, nvim headless load-check. - Rewrite README, add CHANGELOG. All five submodules are retained; classic still needs them. Plan for a future major cut is captured in CHANGELOG. --- .github/workflows/ci.yml | 47 +++++++ CHANGELOG.md | 28 ++++ README.md | 117 +++++++++++------ install.sh | 222 ++++++++++++++++++++++++++++---- lib/util.sh | 107 +++++++++++++++ materialshell-electro.zsh-theme | 12 +- profiles/classic/vimrc | 43 +++++++ profiles/classic/zshrc | 39 ++++++ profiles/modern/nvim/init.lua | 60 +++++++++ profiles/modern/starship.toml | 50 +++++++ profiles/modern/zshrc | 84 ++++++++++++ vimrc.file | 75 ++++------- zshrc.file | 74 +++++------ 13 files changed, 795 insertions(+), 163 deletions(-) create mode 100644 .github/workflows/ci.yml create mode 100644 CHANGELOG.md create mode 100644 lib/util.sh create mode 100644 profiles/classic/vimrc create mode 100644 profiles/classic/zshrc create mode 100644 profiles/modern/nvim/init.lua create mode 100644 profiles/modern/starship.toml create mode 100644 profiles/modern/zshrc diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..13919f6 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,47 @@ +name: ci + +on: + push: + branches: [main, master, upgrade-path] + pull_request: + +jobs: + shellcheck: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: { submodules: false } + - name: Run shellcheck + uses: ludeeus/action-shellcheck@master + with: + scandir: "./" + ignore_paths: | + oh-my-zsh + zsh-autosuggestions + zsh-syntax-highlighting + k + vimrc + backup + + syntax-zsh: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: { submodules: false } + - name: Install zsh + run: sudo apt-get update && sudo apt-get install -y zsh + - name: Parse-check profile zshrc files + run: | + for f in profiles/classic/zshrc profiles/modern/zshrc zshrc.file; do + zsh -n "$f" + done + + syntax-nvim: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: { submodules: false } + - name: Install Neovim + run: sudo apt-get update && sudo apt-get install -y neovim + - name: Load-check init.lua + run: nvim --headless -u profiles/modern/nvim/init.lua +qa diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..0bf4bf9 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,28 @@ +# Changelog + +## Unreleased — upgrade-path branch + +### Added +- **Profiles.** Two installable profiles: + - `classic` — the original oh-my-zsh + materialshell-electro + amix/vimrc stack. Default for existing users. + - `modern` — starship prompt, Neovim with a small `init.lua`, graceful use of fzf/zoxide/eza/bat when present, no oh-my-zsh dependency. +- **Profile dispatcher** in `zshrc.file` and `vimrc.file` — reads `~/.xydacshell/profile` and loads the active profile. Missing file → defaults to `classic`. Your `~/.zshrc` symlink keeps working; no action required for existing users. +- **Idempotent installer.** Re-running `install.sh` is safe. Creates a new `backup//` directory per run; never touches existing backups. +- **Profile-switch flow.** `install.sh --profile modern` flips profile with confirmation. +- **Dry-run mode.** `install.sh --dry-run` prints everything it would do. +- **Safety preflight.** Installer refuses to run if there are uncommitted local edits to tracked files. Sacred files (`zshrc.custom`, `vimrc.custom`) are hash-verified before and after. +- **CI.** `shellcheck` on all shell scripts; `zsh -n` syntax-check on all zshrc files; `nvim --headless` load-check on the modern `init.lua`. + +### Fixed +- **Broken git-status escape sequences** in `materialshell-electro.zsh-theme` (lines 68–73). Previously missing `%` before `%{$reset_color%}` would leak raw escape characters into the prompt. Classic users running a dirty repo would see garbled output. + +### Preserved (intentionally unchanged) +- Existing users' `~/.xydacshell/backup/.zshrc` and `backup/.vimrc` (their pre-install configs) remain untouched. +- `zshrc.custom` and `vimrc.custom` are never rewritten by the installer. +- Every submodule. Classic still needs them. +- The `~/.zshrc` / `~/.vimrc` symlink targets stay the same paths (`zshrc.file` / `vimrc.file`) — existing symlinks continue to work without modification. + +### Planned for a future major +- Retire the `classic` profile; drop `oh-my-zsh`, `amix/vimrc`, and `k` submodules. +- Make the modern profile fully submodule-free (source zsh plugins from `brew`/`apt`). +- Publish as a Homebrew tap for brew-managed upgrades. diff --git a/README.md b/README.md index bc0e349..b39a173 100644 --- a/README.md +++ b/README.md @@ -1,57 +1,94 @@ +# xydacshell -# Xydac Shell -Opinionated Awesome Shell with cherry picked awesomeness. +An opinionated terminal setup. Two profiles, one install script, safe to re-run. -## Includes -* [oh-my-zsh](https://github.com/robbyrussell/oh-my-zsh) -* [vim rc](https://github.com/amix/vimrc) -* [zsh-syntax-highlighting](https://github.com/zsh-users/zsh-syntax-highlighting) -* [zsh-autosuggestions](https://github.com/zsh-users/zsh-autosuggestions) -* [k](https://github.com/supercrabtree/k) +- **classic** — oh-my-zsh with the `materialshell-electro` theme, amix/vimrc, and a handful of zsh plugins. The original xydacshell stack. +- **modern** — starship prompt, Neovim with a small `init.lua`, and graceful use of fzf / zoxide / eza / bat when they're installed. -## Features -A lovely and Customized terminal System that declutters your shell customzations +Existing users: your setup still works. You stay on `classic` until you opt into `modern`. +## Install -## Screenshots -Prompt Preview -![Prompt Theme](https://raw.githubusercontent.com/xydac/xydacshell/master/screenshots/screenshot-prompt.png) -VIM Preview -![VI](https://raw.githubusercontent.com/xydac/xydacshell/master/screenshots/screenshot-vi.png) - -## Installation, Updates, Uninstallation -### Installation : -``` -git clone https://github.com/xydac/xydacshell.git ~/.xydacshell && cd ~/.xydacshell && bash install.sh +```bash +git clone --recurse-submodules https://github.com/xydac/xydacshell.git ~/.xydacshell +cd ~/.xydacshell +bash install.sh # fresh: defaults to classic +bash install.sh --profile modern # opt into modern ``` -### Update: + +The installer is idempotent — running it twice is safe. + +## Update + +```bash +cd ~/.xydacshell +git pull --rebase +git submodule update --init --recursive +bash install.sh ``` -cd ~/.xydacshell && git pull --rebase + +## Switch profile + +```bash +cd ~/.xydacshell +bash install.sh --profile modern +# or: bash install.sh --profile classic ``` -### Uninstall -Restores Backup + +Your `~/.xydacshell/zshrc.custom` and `vimrc.custom` are never touched. + +## Customize + +Add your personal settings here — they outlive any profile switch or upgrade. + +- zsh: `~/.xydacshell/zshrc.custom` +- vim (classic): `~/.xydacshell/vimrc.custom` +- nvim (modern): `~/.xydacshell/nvim.custom.lua` + +## Modern profile — optional tool install hints + +The modern profile degrades gracefully when these are missing. To get the full experience: + +```bash +# macOS +brew install starship neovim fzf zoxide eza bat + +# Debian/Ubuntu +sudo apt install neovim fzf +# For starship, zoxide, eza, bat — see each project's release page or use a user-local install. ``` -rm ~/.zshrc ~/.vimrc && mv ~/.xydacshell/backup/.zshrc ~/.zshrc && ~/.xydacshell/backup/.vimrc ~/.vimrc + +## Uninstall + +```bash +# Restore the original pre-install configs if present. +[ -f ~/.xydacshell/backup/.zshrc ] && mv ~/.xydacshell/backup/.zshrc ~/.zshrc || rm -f ~/.zshrc +[ -f ~/.xydacshell/backup/.vimrc ] && mv ~/.xydacshell/backup/.vimrc ~/.vimrc || rm -f ~/.vimrc +rm -rf ~/.xydacshell ``` -## Tweaks -* Alias : ```c``` --> Clears Screen -* Alias : ```gitlog``` --> One Liner Git Logs -### VI Tweaks -* Leader Key : ``` ` ``` -* Shortcut : ``` ` + ``` --> Move Panes -* Shortcut : ``` ` + ``` --> Recent Files +## What ships +``` +xydacshell/ +├── install.sh # idempotent, profile-aware, --dry-run, --force +├── lib/util.sh # shell helpers +├── zshrc.file, vimrc.file # dispatchers (read the profile, load the right config) +├── profiles/ +│ ├── classic/ { zshrc, vimrc } # the original setup +│ └── modern/ { zshrc, starship.toml, nvim/init.lua } +├── materialshell-electro.zsh-theme # classic prompt theme +├── backup/ # timestamped backups per install run +└── .github/workflows/ci.yml # shellcheck + zsh/nvim syntax checks +``` -## Further Customization -* Vim Customization : update your custom tweaks in ```~/.xydacshell/vimrc.custom``` -* ZSH Customization : update your custom tweaks in ```~/.xydacshell/zshrc.custom``` +## Compatibility -## Minimum Requirement -* zsh -* git +- `zsh` required. +- `git` required. +- `classic` profile: submodules are used (oh-my-zsh, amix/vimrc, etc.). +- `modern` profile: Neovim recommended; starship, fzf, zoxide, eza, bat are optional and each has a fallback. ## License -MIT -- Pull Request Welcome +MIT. Pull requests welcome. diff --git a/install.sh b/install.sh index e8e4c55..dba7daf 100644 --- a/install.sh +++ b/install.sh @@ -1,35 +1,213 @@ -#!/bin/bash -if ! [ -x "$(command -v git)" ]; then - echo 'Error: git is not installed.' >&2 +#!/usr/bin/env bash +# xydacshell installer. +# Idempotent, profile-aware, non-destructive. Safe to re-run. +# +# Usage: +# bash install.sh interactive +# bash install.sh --profile classic pin to the classic profile +# bash install.sh --profile modern switch to the modern profile +# bash install.sh --dry-run preview without touching the filesystem +# bash install.sh --force skip confirmation on profile switch +# bash install.sh --help print this help +# +# Safety guarantees (for existing users): +# * Never touches $XYDACSHELL_HOME/zshrc.custom or vimrc.custom if they exist. +# * Never touches the legacy single-file backups (backup/.zshrc, backup/.vimrc). +# * New backups go to backup// — never collide with anything older. +# * Refuses to run if the xydacshell repo has uncommitted local edits. +# * Switching profiles requires explicit confirmation (or --force). + +set -euo pipefail + +XYDACSHELL_HOME="${XYDACSHELL_HOME:-$HOME/.xydacshell}" +export XYDACSHELL_HOME + +# shellcheck source=lib/util.sh +. "$XYDACSHELL_HOME/lib/util.sh" + +XS_DRY_RUN=0 +REQUESTED_PROFILE="" +FORCE=0 + +usage() { + sed -n '2,20p' "$0" | sed 's/^# \{0,1\}//' +} + +while [ $# -gt 0 ]; do + case "$1" in + --profile) REQUESTED_PROFILE="${2:-}"; shift 2 ;; + --profile=*) REQUESTED_PROFILE="${1#--profile=}"; shift ;; + --dry-run) XS_DRY_RUN=1; export XS_DRY_RUN; shift ;; + --force) FORCE=1; shift ;; + -h|--help) usage; exit 0 ;; + *) xs_err "unknown flag: $1"; usage; exit 2 ;; + esac +done + +# Preflight checks. +for bin in git zsh; do + if ! xs_command_exists "$bin"; then + xs_err "required command missing: $bin" exit 1 + fi +done + +if [ "$PWD" != "$XYDACSHELL_HOME" ]; then + xs_err "please run from $XYDACSHELL_HOME (current: $PWD)" + exit 1 fi -if ! [ -x "$(command -v zsh)" ]; then - echo 'Error: zsh is not installed.' >&2 + +# Refuse to run if the user has made uncommitted changes to tracked files. +# (Unstaged changes to tracked files = potentially custom edits to zshrc.file/vimrc.file +# that git pull would clobber.) +if [ -d "$XYDACSHELL_HOME/.git" ]; then + dirty="$(git -C "$XYDACSHELL_HOME" status --porcelain -- ':!zshrc.custom' ':!vimrc.custom' ':!backup' ':!profile' 2>/dev/null || true)" + if [ -n "$dirty" ]; then + xs_err "xydacshell repo has uncommitted local changes:" + printf '%s\n' "$dirty" >&2 + xs_err "commit, stash, or discard them before re-running install.sh" exit 1 + fi fi -if [ "$PWD" != "$HOME/.xydacshell" ]; then - echo " Error: Please run from $HOME/.xydacshell directory."; - exit 1 +# Detect existing install. +is_existing_install() { + [ -f "$XYDACSHELL_HOME/profile" ] || \ + { [ -L "$HOME/.zshrc" ] && [[ "$(readlink "$HOME/.zshrc")" == "$XYDACSHELL_HOME"/* ]]; } || \ + [ -f "$XYDACSHELL_HOME/backup/.zshrc" ] +} + +current_profile="" +if is_existing_install; then + current_profile="$(xs_profile_read "$XYDACSHELL_HOME")" + xs_info "detected existing install; current profile: $current_profile" fi -echo "Checking out awesome stuffs" -git submodule update --init --recursive +# Choose target profile. +if [ -z "$REQUESTED_PROFILE" ]; then + if [ -n "$current_profile" ]; then + target_profile="$current_profile" + else + target_profile="classic" + xs_info "fresh install; defaulting to profile: classic" + xs_dim " pass --profile modern to try the modern stack (starship + nvim)" + fi +else + case "$REQUESTED_PROFILE" in + classic|modern) target_profile="$REQUESTED_PROFILE" ;; + *) xs_err "unknown profile: $REQUESTED_PROFILE (expected classic|modern)"; exit 2 ;; + esac +fi + +# Profile-switch confirmation. +if [ -n "$current_profile" ] && [ "$current_profile" != "$target_profile" ]; then + xs_warn "switching profile: $current_profile → $target_profile" + xs_dim " your zshrc.custom and vimrc.custom will be preserved." + xs_dim " your previous symlinks will be backed up to backup//." + if [ "$FORCE" != "1" ] && [ "$XS_DRY_RUN" != "1" ]; then + printf 'proceed? [y/N] ' + read -r ans + case "${ans:-n}" in + y|Y|yes) ;; + *) xs_err "aborted."; exit 1 ;; + esac + fi +fi -chmod -R go-w ./ +xs_info "installing profile: $target_profile" +[ "$XS_DRY_RUN" = "1" ] && xs_warn "DRY RUN — no filesystem changes will be made" -echo "Creating Backups now "; -# Create Backups -if [ -f ~/.zshrc ]; then - mv ~/.zshrc ~/.xydacshell/backup/.zshrc +# Update submodules (classic depends on them; modern ignores them). +if [ "$target_profile" = "classic" ]; then + xs_info "syncing classic-profile submodules" + xs_run git -C "$XYDACSHELL_HOME" submodule update --init --recursive fi -if [ -f ~/.vimrc ]; then - mv ~/.vimrc ~/.xydacshell/backup/.vimrc + +# Sanity snapshot of sacred files (custom overrides). We verify post-run. +snapshot_hash() { + local f="$1" + if [ -f "$f" ]; then + if command -v shasum >/dev/null 2>&1; then + shasum "$f" | awk '{print $1}' + elif command -v sha1sum >/dev/null 2>&1; then + sha1sum "$f" | awk '{print $1}' + fi + else + printf 'absent' + fi +} +pre_zshrc_custom="$(snapshot_hash "$XYDACSHELL_HOME/zshrc.custom")" +pre_vimrc_custom="$(snapshot_hash "$XYDACSHELL_HOME/vimrc.custom")" + +# Timestamped backup dir for this run. Created lazily by xs_backup_file. +stamp="$(xs_timestamp)" +backup_dir="$XYDACSHELL_HOME/backup/$stamp" + +# ~/.zshrc always points to our dispatcher. +xs_symlink "$XYDACSHELL_HOME/zshrc.file" "$HOME/.zshrc" "$backup_dir" + +case "$target_profile" in + classic) + xs_symlink "$XYDACSHELL_HOME/vimrc.file" "$HOME/.vimrc" "$backup_dir" + ;; + modern) + nvim_config_dir="${XDG_CONFIG_HOME:-$HOME/.config}/nvim" + xs_run mkdir -p "$nvim_config_dir" + xs_symlink "$XYDACSHELL_HOME/profiles/modern/nvim/init.lua" "$nvim_config_dir/init.lua" "$backup_dir" + + starship_config_dir="${XDG_CONFIG_HOME:-$HOME/.config}" + xs_run mkdir -p "$starship_config_dir" + xs_symlink "$XYDACSHELL_HOME/profiles/modern/starship.toml" "$starship_config_dir/starship.toml" "$backup_dir" + + xs_info "checking modern-profile tools (optional, graceful fallbacks apply)" + for bin in starship nvim fzf zoxide eza bat; do + if xs_command_exists "$bin"; then + xs_ok " $bin" + else + xs_warn " $bin not installed — see README for install hints" + fi + done + ;; +esac + +# Custom override files — create empty ONLY if absent. Never touched otherwise. +for custom in zshrc.custom vimrc.custom; do + target="$XYDACSHELL_HOME/$custom" + if [ ! -e "$target" ]; then + if [ "$XS_DRY_RUN" = "1" ]; then + xs_dim " would create empty $target" + else + : > "$target" + xs_ok "created empty $target" + fi + else + xs_dim " preserving existing $target (not touched)" + fi +done + +# Write the profile file last. +xs_profile_write "$XYDACSHELL_HOME" "$target_profile" + +# Verify sacred files are unchanged. +if [ "$XS_DRY_RUN" != "1" ]; then + post_zshrc_custom="$(snapshot_hash "$XYDACSHELL_HOME/zshrc.custom")" + post_vimrc_custom="$(snapshot_hash "$XYDACSHELL_HOME/vimrc.custom")" + + if [ "$pre_zshrc_custom" != "absent" ] && [ "$pre_zshrc_custom" != "$post_zshrc_custom" ]; then + xs_err "internal error: zshrc.custom content changed during install. check backup/$stamp/" + exit 1 + fi + if [ "$pre_vimrc_custom" != "absent" ] && [ "$pre_vimrc_custom" != "$post_vimrc_custom" ]; then + xs_err "internal error: vimrc.custom content changed during install. check backup/$stamp/" + exit 1 + fi fi -# Copy config files -echo "Creating Symlinks now" -ln -s ~/.xydacshell/vimrc.file ~/.vimrc -ln -s ~/.xydacshell/zshrc.file ~/.zshrc +if [ -d "$backup_dir" ]; then + xs_info "new backup files for this run: $backup_dir" +fi +if [ -f "$XYDACSHELL_HOME/backup/.zshrc" ] || [ -f "$XYDACSHELL_HOME/backup/.vimrc" ]; then + xs_dim "legacy pre-install backups are preserved at $XYDACSHELL_HOME/backup/.zshrc / .vimrc" +fi -echo "All Done !!" +xs_ok "done. start a new shell: exec zsh" diff --git a/lib/util.sh b/lib/util.sh new file mode 100644 index 0000000..fbde71c --- /dev/null +++ b/lib/util.sh @@ -0,0 +1,107 @@ +#!/usr/bin/env bash +# xydacshell — shared shell helpers. Sourced by install.sh. Not stand-alone. + +# Output helpers. Colors only when stdout is a tty. +if [ -t 1 ]; then + XS_DIM=$'\033[2m' + XS_BOLD=$'\033[1m' + XS_RED=$'\033[31m' + XS_GREEN=$'\033[32m' + XS_YELLOW=$'\033[33m' + XS_BLUE=$'\033[34m' + XS_RESET=$'\033[0m' +else + XS_DIM="" + XS_BOLD="" + XS_RED="" + XS_GREEN="" + XS_YELLOW="" + XS_BLUE="" + XS_RESET="" +fi + +xs_log() { printf '%s\n' "$*"; } +xs_info() { printf '%s%s%s\n' "$XS_BLUE" "$*" "$XS_RESET"; } +xs_ok() { printf '%s✓%s %s\n' "$XS_GREEN" "$XS_RESET" "$*"; } +xs_warn() { printf '%s!%s %s\n' "$XS_YELLOW" "$XS_RESET" "$*" >&2; } +xs_err() { printf '%s✗%s %s\n' "$XS_RED" "$XS_RESET" "$*" >&2; } +xs_dim() { printf '%s%s%s\n' "$XS_DIM" "$*" "$XS_RESET"; } + +# xs_run : run a command, honoring $XS_DRY_RUN. Echoes the command dimly when dry. +xs_run() { + if [ "${XS_DRY_RUN:-0}" = "1" ]; then + xs_dim " would run: $*" + else + "$@" + fi +} + +# xs_timestamp: ISO-like stamp safe for filesystem paths. +xs_timestamp() { date -u +"%Y%m%dT%H%M%SZ"; } + +# xs_command_exists : 0 if on PATH, 1 otherwise. +xs_command_exists() { command -v "$1" >/dev/null 2>&1; } + +# xs_backup_file : move a real file into a timestamped backup dir. +# Skips if the path is a symlink into XYDACSHELL_HOME (our own install) or missing. +xs_backup_file() { + local path="$1" backup_dir="$2" xhome="${XYDACSHELL_HOME:-$HOME/.xydacshell}" + + if [ ! -e "$path" ] && [ ! -L "$path" ]; then + return 0 + fi + + if [ -L "$path" ]; then + local target + target="$(readlink "$path")" + case "$target" in + "$xhome"/*) + xs_dim " $path is our symlink, not backing up" + return 0 + ;; + esac + fi + + xs_run mkdir -p "$backup_dir" + xs_run mv "$path" "$backup_dir/$(basename "$path")" + xs_ok "backed up $path → $backup_dir/" +} + +# xs_symlink : create an idempotent symlink. Backs up an existing non-symlink. +xs_symlink() { + local src="$1" dest="$2" backup_dir="$3" + + if [ -L "$dest" ] && [ "$(readlink "$dest")" = "$src" ]; then + xs_dim " $dest already links to $src" + return 0 + fi + + if [ -e "$dest" ] || [ -L "$dest" ]; then + xs_backup_file "$dest" "$backup_dir" + fi + + xs_run ln -s "$src" "$dest" + xs_ok "linked $dest → $src" +} + +# xs_profile_read : echo the active profile, or "classic" if the file is missing. +xs_profile_read() { + local xhome="$1" file="$1/profile" + if [ -f "$file" ]; then + cat "$file" + else + printf 'classic\n' + fi +} + +# xs_profile_write : write the profile file atomically. +xs_profile_write() { + local xhome="$1" profile="$2" + xs_run mkdir -p "$xhome" + if [ "${XS_DRY_RUN:-0}" = "1" ]; then + xs_dim " would write profile=$profile to $xhome/profile" + else + printf '%s\n' "$profile" > "$xhome/profile" + fi + xs_ok "profile set to $profile" +} diff --git a/materialshell-electro.zsh-theme b/materialshell-electro.zsh-theme index b9ac035..de720ba 100644 --- a/materialshell-electro.zsh-theme +++ b/materialshell-electro.zsh-theme @@ -65,12 +65,12 @@ ZSH_THEME_GIT_PROMPT_SUFFIX=" %{$reset_color%}" ZSH_THEME_GIT_PROMPT_DIRTY=" %{$red%}✗%{$reset_color%}" ZSH_THEME_GIT_PROMPT_CLEAN=" %{$green%}✔%{$reset_color%}" -ZSH_THEME_GIT_PROMPT_ADDED=" %{$green%}✚{$reset_color%}" -ZSH_THEME_GIT_PROMPT_MODIFIED=" %{$yellow%}⚑{$reset_color%} " -ZSH_THEME_GIT_PROMPT_DELETED=" %{$red%}✖{$reset_color%}" -ZSH_THEME_GIT_PROMPT_RENAMED=" %{$blue%}▴{$reset_color% " -ZSH_THEME_GIT_PROMPT_UNMERGED=" %{$cyan%}§{$reset_color%}" -ZSH_THEME_GIT_PROMPT_UNTRACKED=" %{$grey%}◒{$reset_color%}" +ZSH_THEME_GIT_PROMPT_ADDED=" %{$green%}✚%{$reset_color%}" +ZSH_THEME_GIT_PROMPT_MODIFIED=" %{$yellow%}⚑%{$reset_color%}" +ZSH_THEME_GIT_PROMPT_DELETED=" %{$red%}✖%{$reset_color%}" +ZSH_THEME_GIT_PROMPT_RENAMED=" %{$blue%}▴%{$reset_color%}" +ZSH_THEME_GIT_PROMPT_UNMERGED=" %{$cyan%}§%{$reset_color%}" +ZSH_THEME_GIT_PROMPT_UNTRACKED=" %{$grey%}◒%{$reset_color%}" # Format for git_prompt_long_sha() and git_prompt_short_sha() ZSH_THEME_GIT_PROMPT_SHA_BEFORE="%{$cyan%} " diff --git a/profiles/classic/vimrc b/profiles/classic/vimrc new file mode 100644 index 0000000..67ea5a5 --- /dev/null +++ b/profiles/classic/vimrc @@ -0,0 +1,43 @@ +" xydacshell — classic profile vimrc +" Mirrors the original pre-upgrade vimrc, minus the trailing +" `source ... vimrc.custom` (the dispatcher at the repo root handles that). +" +" Do not edit this file directly. +" For customizations, edit: ~/.xydacshell/vimrc.custom + +set runtimepath+=~/.xydacshell/vimrc + +source ~/.xydacshell/vimrc/vimrcs/basic.vim +source ~/.xydacshell/vimrc/vimrcs/filetypes.vim +source ~/.xydacshell/vimrc/vimrcs/plugins_config.vim +source ~/.xydacshell/vimrc/vimrcs/extended.vim + +" Automatically start NERDTree. +autocmd vimenter * NERDTree +" Close vim if the only other open buffer is NERDTree. +autocmd bufenter * if (winnr("$") == 1 && exists("b:NERDTree") && b:NERDTree.isTabTree()) | q | endif +" Toggle NERDTree with Ctrl-n. +map :NERDTreeToggle +" Keep cursor out of the NERDTree pane on startup. +autocmd VimEnter * wincmd p + +" Go-specific keymaps. +au FileType go nmap r (go-run) +au FileType go nmap b (go-build) + +set mouse=a +set number +set autoindent +let g:NERDTreeWinPos = "left" + +let mapleader= "`" + +map :wincmd h +map :wincmd j +map :wincmd k +map :wincmd l +map :MRU + +nnoremap :if &modifiable && !&readonly && &modified :write :endif:bnext +nnoremap :if &modifiable && !&readonly && &modified :write :endif:bprevious +set nofoldenable diff --git a/profiles/classic/zshrc b/profiles/classic/zshrc new file mode 100644 index 0000000..cd7af7b --- /dev/null +++ b/profiles/classic/zshrc @@ -0,0 +1,39 @@ +# xydacshell — classic profile +# This file mirrors the original pre-upgrade zshrc, minus the trailing +# `source ... zshrc.custom` (the dispatcher at the repo root handles that). +# +# Do not edit this file directly. +# For customizations, edit: ~/.xydacshell/zshrc.custom + +# Path to your oh-my-zsh installation. +export ZSH=$HOME/.xydacshell/oh-my-zsh +ZSH_CUSTOM=$HOME/.xydacshell/ + +# Source plugin files. +source $HOME/.xydacshell/zsh-autosuggestions/zsh-autosuggestions.zsh +source $HOME/.xydacshell/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh +source $HOME/.xydacshell/k/k.sh + +# ZSH theme. +ZSH_THEME='materialshell-electro' + +# ZSH plugins. +plugins=(git zsh-autosuggestions zsh-syntax-highlighting k) +source $ZSH/oh-my-zsh.sh + +# Helpers. +commandexists(){ type "$1" &> /dev/null; } +switchuser(){ sudo su -s /usr/bin/zsh $1; } + +# Aliases. +alias c=clear +alias gitlog="git log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit" + +if commandexists nnn; then + alias n=nnn + export NNN_USE_EDITOR=1 +fi + +if commandexists screenfetch; then + clear && screenfetch +fi diff --git a/profiles/modern/nvim/init.lua b/profiles/modern/nvim/init.lua new file mode 100644 index 0000000..cbab470 --- /dev/null +++ b/profiles/modern/nvim/init.lua @@ -0,0 +1,60 @@ +-- xydacshell — modern profile init.lua. +-- Small, no plugin manager, sensible defaults. +-- Preserves the classic leader key (backtick) so muscle memory carries over. + +-- Leader: backtick (same as classic). +vim.g.mapleader = "`" +vim.g.maplocalleader = "`" + +-- Basics. +vim.opt.number = true +vim.opt.relativenumber = true +vim.opt.mouse = "a" +vim.opt.autoindent = true +vim.opt.smartindent = true +vim.opt.expandtab = true +vim.opt.shiftwidth = 2 +vim.opt.tabstop = 2 +vim.opt.termguicolors = true +vim.opt.signcolumn = "yes" +vim.opt.splitright = true +vim.opt.splitbelow = true +vim.opt.ignorecase = true +vim.opt.smartcase = true +vim.opt.undofile = true +vim.opt.clipboard = "unnamedplus" +vim.opt.updatetime = 250 +vim.opt.scrolloff = 8 + +-- Search ergonomics. +vim.opt.incsearch = true +vim.opt.hlsearch = true + +-- Pane switching (parity with classic). +vim.keymap.set("n", "", "h", { silent = true }) +vim.keymap.set("n", "", "j", { silent = true }) +vim.keymap.set("n", "", "k", { silent = true }) +vim.keymap.set("n", "", "l", { silent = true }) + +-- Buffer navigation. +vim.keymap.set("n", "", ":bnext", { silent = true }) +vim.keymap.set("n", "", ":bprevious", { silent = true }) + +-- Quick escape. +vim.keymap.set("i", "jk", "", { silent = true }) + +-- Strip trailing whitespace on save. +vim.api.nvim_create_autocmd("BufWritePre", { + pattern = "*", + callback = function() + local save = vim.fn.winsaveview() + vim.cmd([[%s/\s\+$//e]]) + vim.fn.winrestview(save) + end, +}) + +-- Source user customizations if present. Mirrors vimrc.custom from classic. +local custom = vim.fn.expand("$HOME/.xydacshell/nvim.custom.lua") +if vim.fn.filereadable(custom) == 1 then + dofile(custom) +end diff --git a/profiles/modern/starship.toml b/profiles/modern/starship.toml new file mode 100644 index 0000000..cc5efcf --- /dev/null +++ b/profiles/modern/starship.toml @@ -0,0 +1,50 @@ +# xydacshell — modern profile starship config. +# Two-line prompt, material-ish accents that echo the classic theme's vibe. +# https://starship.rs/config/ + +format = """ +[┌─](bold cyan)[ ](bold cyan)$username[ Ξ ](dimmed)$hostname[ Ξ ](dimmed)$directory$git_branch$git_status[ ](bold cyan)[]](bold cyan) +[└─](bold cyan)[ ](bold cyan)$status$cmd_duration[]](bold cyan) $character""" + +add_newline = false + +[username] +style_user = "green" +style_root = "red bold" +format = "[$user]($style)" +show_always = true + +[hostname] +style = "cyan" +format = "[$hostname]($style)" +ssh_only = false + +[directory] +style = "green" +format = "[$path]($style)" +truncation_length = 3 +truncation_symbol = "…/" + +[git_branch] +symbol = " Ξ " +style = "cyan" +format = "[$symbol$branch]($style)" + +[git_status] +style = "red" +format = "[ $all_status$ahead_behind]($style)" + +[status] +disabled = false +symbol = "[✗](bold red)" +success_symbol = "[✓](bold green)" +format = "$symbol" + +[character] +success_symbol = "[ॐ](bold blue)" +error_symbol = "[ϟ](bold red)" + +[cmd_duration] +min_time = 1000 +style = "yellow" +format = " [took $duration]($style)" diff --git a/profiles/modern/zshrc b/profiles/modern/zshrc new file mode 100644 index 0000000..72e6924 --- /dev/null +++ b/profiles/modern/zshrc @@ -0,0 +1,84 @@ +# xydacshell — modern profile zshrc. +# Starship prompt · plain zsh (no oh-my-zsh) · graceful fallbacks for optional tools. +# +# Do not edit this file directly. +# For customizations, edit: ~/.xydacshell/zshrc.custom + +: ${XYDACSHELL_HOME:=$HOME/.xydacshell} + +# History: sane defaults. +HISTFILE="$HOME/.zsh_history" +HISTSIZE=50000 +SAVEHIST=50000 +setopt SHARE_HISTORY HIST_IGNORE_DUPS HIST_IGNORE_SPACE HIST_VERIFY INC_APPEND_HISTORY + +# Better completions. +autoload -Uz compinit && compinit -C +zstyle ':completion:*' menu select +zstyle ':completion:*' matcher-list 'm:{a-zA-Z}={A-Za-z}' 'r:|=*' 'l:|=* r:|=*' +setopt AUTO_CD INTERACTIVE_COMMENTS PROMPT_SUBST + +# vi-style editing feels cleaner for a "modern" profile; flip to emacs if you prefer. +bindkey -e + +# Helpers — mirror classic for compat with user customizations that use them. +commandexists(){ type "$1" &> /dev/null; } + +# Plugin sourcing. We still use the submodules (same assets as classic). +[ -f "$XYDACSHELL_HOME/zsh-autosuggestions/zsh-autosuggestions.zsh" ] && \ + source "$XYDACSHELL_HOME/zsh-autosuggestions/zsh-autosuggestions.zsh" +[ -f "$XYDACSHELL_HOME/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh" ] && \ + source "$XYDACSHELL_HOME/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh" + +# Prompt: starship when available, a quiet fallback when not. +if commandexists starship; then + eval "$(starship init zsh)" +else + PROMPT='%F{cyan}%n%f %F{blue}%~%f %# ' +fi + +# Modern CLI tools — used when available. +if commandexists zoxide; then + eval "$(zoxide init zsh)" + alias cd=z 2>/dev/null || true +fi +if commandexists eza; then + alias ls='eza --group-directories-first' + alias ll='eza -l --group-directories-first --git' + alias la='eza -la --group-directories-first --git' + alias tree='eza --tree' +elif commandexists lsd; then + alias ls='lsd' + alias ll='lsd -l' + alias la='lsd -la' +fi +if commandexists bat; then + alias cat='bat --paging=never' +fi +if commandexists fzf; then + # Load key-bindings and completion from either brew or apt layouts. + for p in \ + /opt/homebrew/opt/fzf/shell \ + /usr/local/opt/fzf/shell \ + /usr/share/fzf \ + /usr/share/doc/fzf/examples; do + [ -f "$p/key-bindings.zsh" ] && source "$p/key-bindings.zsh" + [ -f "$p/completion.zsh" ] && source "$p/completion.zsh" + done +fi + +# Aliases (carry forward the useful ones from classic). +alias c=clear +alias gitlog="git log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit" + +# Editor. +if commandexists nvim; then + export EDITOR=nvim + alias vim=nvim +fi + +# nnn helper, preserved. +if commandexists nnn; then + alias n=nnn + export NNN_USE_EDITOR=1 +fi diff --git a/vimrc.file b/vimrc.file index 8c2e9bf..38fb459 100644 --- a/vimrc.file +++ b/vimrc.file @@ -1,52 +1,23 @@ -" """""""""""""""""""" -" Please Donot Edit This File directly -" For any custom Tweaks use below file -" ~/.xydacshell/vimrc.custom -" -" "" - - -set runtimepath+=~/.xydacshell/vimrc - -source ~/.xydacshell/vimrc/vimrcs/basic.vim -source ~/.xydacshell/vimrc/vimrcs/filetypes.vim -source ~/.xydacshell/vimrc/vimrcs/plugins_config.vim -source ~/.xydacshell/vimrc/vimrcs/extended.vim - -" Automatically start NerdTree -autocmd vimenter * NERDTree -" Close Vim if the only other tab open is of NerdTree -autocmd bufenter * if (winnr("$") == 1 && exists("b:NERDTree") && b:NERDTree.isTabTree()) | q | endif -" Add Toggle for NerdTree to Ctrl+N -map :NERDTreeToggle -" Stop Cursor from coming to NerdTree Pane at Vim Start -autocmd VimEnter * wincmd p - -" GO Specific Keymapping -au FileType go nmap r (go-run) -au FileType go nmap b (go-build) -" Activate Mouse -set mouse=a -" Active Line Numbers -set number -" Set Autoindent on -set autoindent -" Open NerTree always in left -let g:NERDTreeWinPos = "left" - -" Assign , as Leader -let mapleader= "`" - -"e Assign Pane Switching Shortcuts -map :wincmd h -map :wincmd j -map :wincmd k -map :wincmd l -map :MRU - -nnoremap :if &modifiable && !&readonly && &modified :write :endif:bnext -nnoremap :if &modifiable && !&readonly && &modified :write :endif:bprevious -set nofoldenable - -source ~/.xydacshell/vimrc.custom - +" xydacshell — vim dispatcher (classic profile only; modern uses nvim). +" Existing users: your ~/.vimrc still symlinks to this file. +" If you've switched to the modern profile, the installer writes a +" Neovim init.lua to ~/.config/nvim/ instead and leaves ~/.vimrc alone. + +let s:xydacshell_home = expand('$HOME/.xydacshell') +let s:profile_file = s:xydacshell_home . '/profile' +let s:profile = 'classic' +if filereadable(s:profile_file) + let s:profile = readfile(s:profile_file)[0] +endif + +let s:profile_vimrc = s:xydacshell_home . '/profiles/' . s:profile . '/vimrc' +if filereadable(s:profile_vimrc) + execute 'source ' . s:profile_vimrc +elseif filereadable(s:xydacshell_home . '/profiles/classic/vimrc') + execute 'source ' . s:xydacshell_home . '/profiles/classic/vimrc' +endif + +" User customizations — sacred. Never overwritten by install.sh. +if filereadable(s:xydacshell_home . '/vimrc.custom') + execute 'source ' . s:xydacshell_home . '/vimrc.custom' +endif diff --git a/zshrc.file b/zshrc.file index 9ef27df..56127c4 100644 --- a/zshrc.file +++ b/zshrc.file @@ -1,49 +1,37 @@ -# ########################### -# Please do not edit this file for any custom tweaks -# For any Customization Please add to below file -# ~/.xydacshell/zshrc.custom +# xydacshell — zsh dispatcher. +# Existing users: your ~/.zshrc still symlinks to this file. +# What changed: this file now reads the active profile from +# ~/.xydacshell/profile and sources the right config. If that file is +# missing (as it was pre-upgrade), we default to 'classic', which loads +# the original oh-my-zsh + materialshell-electro setup — exactly what +# you had before. # -# ########################## +# Your personal customizations live in ~/.xydacshell/zshrc.custom and are +# sourced at the end, after the profile loads. That hasn't changed. +: ${XYDACSHELL_HOME:=$HOME/.xydacshell} -# Path to your oh-my-zsh installation. -export ZSH=$HOME/.xydacshell/oh-my-zsh -ZSH_CUSTOM=$HOME/.xydacshell/ - -# Source Plugin Files -source $HOME/.xydacshell/zsh-autosuggestions/zsh-autosuggestions.zsh -source $HOME/.xydacshell/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh -source $HOME/.xydacshell/k/k.sh - -# Set ZSH Theme -ZSH_THEME='materialshell-electro' - -# Set ZSH Plugins - -plugins=(git zsh-autosuggestions zsh-syntax-highlighting k ) -source $ZSH/oh-my-zsh.sh - -# Custom Functions -commandexists(){ - type "$1" &> /dev/null; -} -switchuser(){ - sudo su -s /usr/bin/zsh $1 -} - -# Custom Alias -alias c=clear -alias gitlog="git log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit" - - -if commandexists nnn ; then - alias n=nnn - export NNN_USE_EDITOR=1 +if [ -f "$XYDACSHELL_HOME/profile" ]; then + XYDACSHELL_PROFILE="$(cat "$XYDACSHELL_HOME/profile")" +else + XYDACSHELL_PROFILE=classic fi - - -if commandexists screenfetch ; then - clear && screenfetch +export XYDACSHELL_PROFILE + +_xs_profile_zshrc="$XYDACSHELL_HOME/profiles/$XYDACSHELL_PROFILE/zshrc" + +if [ -f "$_xs_profile_zshrc" ]; then + source "$_xs_profile_zshrc" +else + # Fallback: if the selected profile can't load, try classic, then give up quietly. + # This preserves shell usability even if someone yanks a file. + if [ -f "$XYDACSHELL_HOME/profiles/classic/zshrc" ]; then + source "$XYDACSHELL_HOME/profiles/classic/zshrc" + fi fi -source $HOME/.xydacshell/zshrc.custom +unset _xs_profile_zshrc +# User customizations — sacred. Never overwritten by install.sh. +if [ -f "$XYDACSHELL_HOME/zshrc.custom" ]; then + source "$XYDACSHELL_HOME/zshrc.custom" +fi From f10c99586fb090abd5d9b14859373b43e103787c Mon Sep 17 00:00:00 2001 From: xydac Date: Sun, 12 Apr 2026 09:15:48 -0700 Subject: [PATCH 02/12] Interactive installer for modern-profile tools Replace the static 'here are install hints' block with OS and package-manager detection plus per-tool install prompts. Supports brew/apt/dnf/pacman/apk; uses official curl installers for tools the pm does not ship (starship, zoxide); flags eza as cargo-install on apt. --force auto-accepts; --dry-run previews without running. Missing tools continue to degrade gracefully in the modern zshrc. --- CHANGELOG.md | 1 + install.sh | 15 ++-- lib/modern-tools.sh | 171 ++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 178 insertions(+), 9 deletions(-) create mode 100644 lib/modern-tools.sh diff --git a/CHANGELOG.md b/CHANGELOG.md index 0bf4bf9..40c189f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ ## Unreleased — upgrade-path branch ### Added +- **Modern-profile tool installer.** The installer now detects the OS (macOS / Linux) and an available package manager (brew / apt / dnf / pacman / apk), lists missing tools (starship, nvim, fzf, zoxide, eza, bat) with their install commands, and prompts per tool. Uses the native package manager where possible; falls back to official curl installers (starship, zoxide) or `cargo install` (eza on apt) where the pm doesn't ship the package. `--force` auto-accepts; `--dry-run` previews. Missing tools degrade gracefully — the profile still works without them. - **Profiles.** Two installable profiles: - `classic` — the original oh-my-zsh + materialshell-electro + amix/vimrc stack. Default for existing users. - `modern` — starship prompt, Neovim with a small `init.lua`, graceful use of fzf/zoxide/eza/bat when present, no oh-my-zsh dependency. diff --git a/install.sh b/install.sh index dba7daf..1505d41 100644 --- a/install.sh +++ b/install.sh @@ -7,7 +7,7 @@ # bash install.sh --profile classic pin to the classic profile # bash install.sh --profile modern switch to the modern profile # bash install.sh --dry-run preview without touching the filesystem -# bash install.sh --force skip confirmation on profile switch +# bash install.sh --force skip all confirmations (profile switch + tool installs) # bash install.sh --help print this help # # Safety guarantees (for existing users): @@ -24,6 +24,8 @@ export XYDACSHELL_HOME # shellcheck source=lib/util.sh . "$XYDACSHELL_HOME/lib/util.sh" +# shellcheck source=lib/modern-tools.sh +. "$XYDACSHELL_HOME/lib/modern-tools.sh" XS_DRY_RUN=0 REQUESTED_PROFILE="" @@ -159,14 +161,9 @@ case "$target_profile" in xs_run mkdir -p "$starship_config_dir" xs_symlink "$XYDACSHELL_HOME/profiles/modern/starship.toml" "$starship_config_dir/starship.toml" "$backup_dir" - xs_info "checking modern-profile tools (optional, graceful fallbacks apply)" - for bin in starship nvim fzf zoxide eza bat; do - if xs_command_exists "$bin"; then - xs_ok " $bin" - else - xs_warn " $bin not installed — see README for install hints" - fi - done + # Detect missing modern tools and offer to install them. + # User is prompted per tool; --force accepts all; --dry-run previews without running. + FORCE="$FORCE" xs_modern_tools_offer starship nvim fzf zoxide eza bat ;; esac diff --git a/lib/modern-tools.sh b/lib/modern-tools.sh new file mode 100644 index 0000000..bec3f96 --- /dev/null +++ b/lib/modern-tools.sh @@ -0,0 +1,171 @@ +#!/usr/bin/env bash +# xydacshell — modern profile tool installer. +# Detects OS + package manager, offers to install missing tools. +# Sourced by install.sh; not stand-alone. Depends on lib/util.sh. + +# Detect OS and a primary package manager. +# Sets: XS_OS, XS_PM. Values for XS_PM: brew | apt | dnf | pacman | apk | unknown +xs_detect_pm() { + case "$(uname -s)" in + Darwin) XS_OS=macos ;; + Linux) XS_OS=linux ;; + *) XS_OS=unknown ;; + esac + + if [ "$XS_OS" = macos ]; then + if xs_command_exists brew; then XS_PM=brew; else XS_PM=unknown; fi + export XS_OS XS_PM + return 0 + fi + + for pm in apt-get dnf pacman apk; do + if xs_command_exists "$pm"; then + case "$pm" in + apt-get) XS_PM=apt ;; + *) XS_PM="$pm" ;; + esac + export XS_OS XS_PM + return 0 + fi + done + XS_PM=unknown + export XS_OS XS_PM +} + +# xs_pkg_for : echo the package name for that pm, or empty if unsupported. +xs_pkg_for() { + local tool="$1" pm="$2" + case "$tool:$pm" in + starship:brew) echo starship ;; + starship:pacman) echo starship ;; + starship:apt|starship:dnf|starship:apk) echo "" ;; # use fallback curl installer + nvim:brew) echo neovim ;; + nvim:apt|nvim:dnf|nvim:pacman|nvim:apk) echo neovim ;; + fzf:brew|fzf:apt|fzf:dnf|fzf:pacman|fzf:apk) echo fzf ;; + zoxide:brew|zoxide:pacman|zoxide:dnf) echo zoxide ;; + zoxide:apt|zoxide:apk) echo "" ;; + eza:brew|eza:pacman|eza:dnf) echo eza ;; + eza:apt|eza:apk) echo "" ;; # apt may not have it on older releases; use fallback + bat:brew|bat:pacman|bat:dnf) echo bat ;; + bat:apt) echo bat ;; # on Debian the binary is called batcat — user needs to alias + bat:apk) echo bat ;; + *) echo "" ;; + esac +} + +# xs_fallback_for : echo a single-line install command to run when the pm has no pkg. +xs_fallback_for() { + local tool="$1" + case "$tool" in + starship) echo 'curl -sS https://starship.rs/install.sh | sh -s -- --yes' ;; + zoxide) echo 'curl -sSfL https://raw.githubusercontent.com/ajeetdsouza/zoxide/main/install.sh | sh' ;; + eza) echo 'cargo install eza # requires Rust toolchain' ;; + *) echo "" ;; + esac +} + +# xs_install_cmd : emit the install command for that pm. +xs_install_cmd() { + local pkg="$1" pm="$2" + case "$pm" in + brew) echo "brew install $pkg" ;; + apt) echo "sudo apt-get update && sudo apt-get install -y $pkg" ;; + dnf) echo "sudo dnf install -y $pkg" ;; + pacman) echo "sudo pacman -S --noconfirm $pkg" ;; + apk) echo "sudo apk add $pkg" ;; + *) echo "" ;; + esac +} + +# xs_prompt_yn : yes/no prompt. Honors FORCE and XS_DRY_RUN. +# Returns 0 for yes, 1 for no. +xs_prompt_yn() { + local q="$1" default="${2:-n}" + if [ "${FORCE:-0}" = 1 ]; then return 0; fi + if [ "${XS_DRY_RUN:-0}" = 1 ]; then return 0; fi # preview-affirmative so user sees what would happen + + local hint + case "$default" in + y|Y) hint="[Y/n]" ;; + *) hint="[y/N]" ;; + esac + + printf '%s %s ' "$q" "$hint" + read -r ans + : "${ans:=$default}" + case "$ans" in + y|Y|yes|YES) return 0 ;; + *) return 1 ;; + esac +} + +# xs_modern_tools_offer: for each tool in $1..., if missing, show install option and install if accepted. +# Returns 0 regardless of individual outcomes (modern profile degrades gracefully). +xs_modern_tools_offer() { + local tools=("$@") + xs_detect_pm + + xs_info "modern-profile tools" + xs_dim " OS: $XS_OS · package manager: $XS_PM" + + local present=() missing=() + local t + for t in "${tools[@]}"; do + if xs_command_exists "$t"; then + present+=("$t") + xs_ok " $t (installed)" + else + missing+=("$t") + fi + done + + if [ "${#missing[@]}" -eq 0 ]; then + xs_ok "all modern tools are installed" + return 0 + fi + + xs_warn "missing: ${missing[*]}" + + if [ "$XS_PM" = "unknown" ]; then + xs_warn "no supported package manager detected; skipping install prompts" + xs_dim " install manually when ready — the profile degrades gracefully" + return 0 + fi + + for t in "${missing[@]}"; do + local pkg cmd + pkg="$(xs_pkg_for "$t" "$XS_PM")" + if [ -n "$pkg" ]; then + cmd="$(xs_install_cmd "$pkg" "$XS_PM")" + else + cmd="$(xs_fallback_for "$t")" + fi + + if [ -z "$cmd" ]; then + xs_warn " $t: no install recipe for $XS_PM on $XS_OS" + continue + fi + + printf '\n' + xs_info "install $t?" + xs_dim " will run: $cmd" + if xs_prompt_yn " install $t" "n"; then + if [ "${XS_DRY_RUN:-0}" = 1 ]; then + xs_dim " would run: $cmd" + else + if sh -c "$cmd"; then + xs_ok " $t installed" + else + xs_err " $t install failed (continuing — profile tolerates missing tools)" + fi + fi + else + xs_dim " skipped $t" + fi + done + + # Post-install note for bat on Debian/Ubuntu where the binary is `batcat`. + if [ "$XS_PM" = apt ] && xs_command_exists batcat && ! xs_command_exists bat; then + xs_dim " note: Debian/Ubuntu ships 'bat' as 'batcat'. Add to your zshrc.custom: alias bat=batcat" + fi +} From 1cf112c7f1acea912ab6051e4dc91c603f44d86b Mon Sep 17 00:00:00 2001 From: xydac Date: Sun, 12 Apr 2026 09:17:41 -0700 Subject: [PATCH 03/12] Swap eza for lsd in modern profile lsd is more broadly packaged (in apt since Debian 11; no cargo fallback needed), so it drops cleanly into every supported package manager. Updates the installer tool list, zshrc aliases (ls/ll/la/tree), README and CHANGELOG. --- CHANGELOG.md | 4 ++-- README.md | 8 ++++---- install.sh | 2 +- lib/modern-tools.sh | 4 +--- profiles/modern/zshrc | 14 +++++--------- 5 files changed, 13 insertions(+), 19 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 40c189f..49c9900 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,10 +3,10 @@ ## Unreleased — upgrade-path branch ### Added -- **Modern-profile tool installer.** The installer now detects the OS (macOS / Linux) and an available package manager (brew / apt / dnf / pacman / apk), lists missing tools (starship, nvim, fzf, zoxide, eza, bat) with their install commands, and prompts per tool. Uses the native package manager where possible; falls back to official curl installers (starship, zoxide) or `cargo install` (eza on apt) where the pm doesn't ship the package. `--force` auto-accepts; `--dry-run` previews. Missing tools degrade gracefully — the profile still works without them. +- **Modern-profile tool installer.** The installer now detects the OS (macOS / Linux) and an available package manager (brew / apt / dnf / pacman / apk), lists missing tools (starship, nvim, fzf, zoxide, lsd, bat) with their install commands, and prompts per tool. Uses the native package manager where possible; falls back to official curl installers (starship, zoxide) or `cargo install` (lsd on apt) where the pm doesn't ship the package. `--force` auto-accepts; `--dry-run` previews. Missing tools degrade gracefully — the profile still works without them. - **Profiles.** Two installable profiles: - `classic` — the original oh-my-zsh + materialshell-electro + amix/vimrc stack. Default for existing users. - - `modern` — starship prompt, Neovim with a small `init.lua`, graceful use of fzf/zoxide/eza/bat when present, no oh-my-zsh dependency. + - `modern` — starship prompt, Neovim with a small `init.lua`, graceful use of fzf/zoxide/lsd/bat when present, no oh-my-zsh dependency. - **Profile dispatcher** in `zshrc.file` and `vimrc.file` — reads `~/.xydacshell/profile` and loads the active profile. Missing file → defaults to `classic`. Your `~/.zshrc` symlink keeps working; no action required for existing users. - **Idempotent installer.** Re-running `install.sh` is safe. Creates a new `backup//` directory per run; never touches existing backups. - **Profile-switch flow.** `install.sh --profile modern` flips profile with confirmation. diff --git a/README.md b/README.md index b39a173..eb55fff 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ An opinionated terminal setup. Two profiles, one install script, safe to re-run. - **classic** — oh-my-zsh with the `materialshell-electro` theme, amix/vimrc, and a handful of zsh plugins. The original xydacshell stack. -- **modern** — starship prompt, Neovim with a small `init.lua`, and graceful use of fzf / zoxide / eza / bat when they're installed. +- **modern** — starship prompt, Neovim with a small `init.lua`, and graceful use of fzf / zoxide / lsd / bat when they're installed. Existing users: your setup still works. You stay on `classic` until you opt into `modern`. @@ -51,11 +51,11 @@ The modern profile degrades gracefully when these are missing. To get the full e ```bash # macOS -brew install starship neovim fzf zoxide eza bat +brew install starship neovim fzf zoxide lsd bat # Debian/Ubuntu sudo apt install neovim fzf -# For starship, zoxide, eza, bat — see each project's release page or use a user-local install. +# For starship, zoxide, lsd, bat — see each project's release page or use a user-local install. ``` ## Uninstall @@ -87,7 +87,7 @@ xydacshell/ - `zsh` required. - `git` required. - `classic` profile: submodules are used (oh-my-zsh, amix/vimrc, etc.). -- `modern` profile: Neovim recommended; starship, fzf, zoxide, eza, bat are optional and each has a fallback. +- `modern` profile: Neovim recommended; starship, fzf, zoxide, lsd, bat are optional and each has a fallback. ## License diff --git a/install.sh b/install.sh index 1505d41..f4b02cf 100644 --- a/install.sh +++ b/install.sh @@ -163,7 +163,7 @@ case "$target_profile" in # Detect missing modern tools and offer to install them. # User is prompted per tool; --force accepts all; --dry-run previews without running. - FORCE="$FORCE" xs_modern_tools_offer starship nvim fzf zoxide eza bat + FORCE="$FORCE" xs_modern_tools_offer starship nvim fzf zoxide lsd bat ;; esac diff --git a/lib/modern-tools.sh b/lib/modern-tools.sh index bec3f96..c6f8e04 100644 --- a/lib/modern-tools.sh +++ b/lib/modern-tools.sh @@ -44,8 +44,7 @@ xs_pkg_for() { fzf:brew|fzf:apt|fzf:dnf|fzf:pacman|fzf:apk) echo fzf ;; zoxide:brew|zoxide:pacman|zoxide:dnf) echo zoxide ;; zoxide:apt|zoxide:apk) echo "" ;; - eza:brew|eza:pacman|eza:dnf) echo eza ;; - eza:apt|eza:apk) echo "" ;; # apt may not have it on older releases; use fallback + lsd:brew|lsd:apt|lsd:dnf|lsd:pacman|lsd:apk) echo lsd ;; bat:brew|bat:pacman|bat:dnf) echo bat ;; bat:apt) echo bat ;; # on Debian the binary is called batcat — user needs to alias bat:apk) echo bat ;; @@ -59,7 +58,6 @@ xs_fallback_for() { case "$tool" in starship) echo 'curl -sS https://starship.rs/install.sh | sh -s -- --yes' ;; zoxide) echo 'curl -sSfL https://raw.githubusercontent.com/ajeetdsouza/zoxide/main/install.sh | sh' ;; - eza) echo 'cargo install eza # requires Rust toolchain' ;; *) echo "" ;; esac } diff --git a/profiles/modern/zshrc b/profiles/modern/zshrc index 72e6924..d16da73 100644 --- a/profiles/modern/zshrc +++ b/profiles/modern/zshrc @@ -42,15 +42,11 @@ if commandexists zoxide; then eval "$(zoxide init zsh)" alias cd=z 2>/dev/null || true fi -if commandexists eza; then - alias ls='eza --group-directories-first' - alias ll='eza -l --group-directories-first --git' - alias la='eza -la --group-directories-first --git' - alias tree='eza --tree' -elif commandexists lsd; then - alias ls='lsd' - alias ll='lsd -l' - alias la='lsd -la' +if commandexists lsd; then + alias ls='lsd --group-dirs=first' + alias ll='lsd -l --group-dirs=first --git' + alias la='lsd -la --group-dirs=first --git' + alias tree='lsd --tree' fi if commandexists bat; then alias cat='bat --paging=never' From ef88f622e9d986c6409f69d15f8628e07e0cbbc9 Mon Sep 17 00:00:00 2001 From: xydac Date: Sun, 12 Apr 2026 09:27:00 -0700 Subject: [PATCH 04/12] Add xydacshell command with doctor/rollback/storage/uninstall Introduces bin/xydacshell as a subcommand dispatcher for day-to-day operations. Both profile zshrcs prepend $XYDACSHELL_HOME/bin to PATH so 'xydacshell ' works after install. Subcommands: - install forwards to install.sh (unchanged) - update git pull + submodule sync + reinstall current profile - switch shorthand for install --profile - doctor diagnostic: profile, symlinks, custom file sizes, PM, tool presence, latest backup, git state - rollback restore from backup//; --stamp picks one - storage disk-usage report; covers local filesystems, $HOME top dirs, package-manager caches (brew, npm, pnpm, cargo, pip, uv), docker, trash; --clean prompts to prune each cache with its native command - uninstall remove our symlinks, restore legacy pre-install backup/.zshrc /.vimrc, do not delete the repo itself Also: add ncdu, dust, duf to the modern-profile installer tool list (with cargo-install-du-dust fallback on apt/apk). Add LICENSE file (MIT, matching what README already declared). Move xs_prompt_yn from modern-tools.sh to util.sh so every command can use it. --- CHANGELOG.md | 7 +++ LICENSE | 21 +++++++ README.md | 77 +++++++++++++++---------- bin/xydacshell | 66 +++++++++++++++++++++ install.sh | 2 +- lib/cmds/doctor.sh | 96 +++++++++++++++++++++++++++++++ lib/cmds/install.sh | 6 ++ lib/cmds/rollback.sh | 68 ++++++++++++++++++++++ lib/cmds/storage.sh | 129 ++++++++++++++++++++++++++++++++++++++++++ lib/cmds/switch.sh | 21 +++++++ lib/cmds/uninstall.sh | 68 ++++++++++++++++++++++ lib/cmds/update.sh | 20 +++++++ lib/modern-tools.sh | 27 ++------- lib/util.sh | 23 ++++++++ zshrc.file | 7 +++ 15 files changed, 585 insertions(+), 53 deletions(-) create mode 100644 LICENSE create mode 100755 bin/xydacshell mode change 100644 => 100755 install.sh create mode 100644 lib/cmds/doctor.sh create mode 100644 lib/cmds/install.sh create mode 100644 lib/cmds/rollback.sh create mode 100644 lib/cmds/storage.sh create mode 100644 lib/cmds/switch.sh create mode 100644 lib/cmds/uninstall.sh create mode 100644 lib/cmds/update.sh diff --git a/CHANGELOG.md b/CHANGELOG.md index 49c9900..47a83d9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,13 @@ ## Unreleased — upgrade-path branch ### Added +- **`xydacshell` command.** A PATH-installed dispatcher (`bin/xydacshell`) with subcommands: `install`, `update`, `switch`, `doctor`, `rollback`, `storage`, `uninstall`. Both profile zshrcs prepend `$XYDACSHELL_HOME/bin` to PATH so it "just works" after install. +- **`xydacshell doctor`.** One-command diagnostic: current profile, managed symlinks, sacred custom file sizes, detected OS + package manager, modern-tool presence, most recent backup, git state. +- **`xydacshell rollback`.** Restore files from a timestamped backup dir (most recent by default; `--stamp` to pick one). Prompts before writing; `--dry-run` previews. +- **`xydacshell storage`.** Disk-usage report: local filesystems (via `duf`/`df`), top `$HOME` directories (via `dust`/`du`), package-manager caches (brew, npm, pnpm, cargo, pip, uv), docker, trash. `--caches` to focus, `--top N` to expand, `--clean` to prompt per-cache cleanup. +- **`xydacshell uninstall`.** Removes our symlinks, restores legacy `backup/.zshrc` / `backup/.vimrc` pre-install files when present. Does not delete the repo itself. +- **More modern tools in the installer.** `ncdu`, `dust`, `duf` added alongside starship/nvim/fzf/zoxide/lsd/bat. `dust` uses `cargo install du-dust` as fallback on apt/apk. +- **`LICENSE` file.** Formalizes the MIT license already declared in the README. - **Modern-profile tool installer.** The installer now detects the OS (macOS / Linux) and an available package manager (brew / apt / dnf / pacman / apk), lists missing tools (starship, nvim, fzf, zoxide, lsd, bat) with their install commands, and prompts per tool. Uses the native package manager where possible; falls back to official curl installers (starship, zoxide) or `cargo install` (lsd on apt) where the pm doesn't ship the package. `--force` auto-accepts; `--dry-run` previews. Missing tools degrade gracefully — the profile still works without them. - **Profiles.** Two installable profiles: - `classic` — the original oh-my-zsh + materialshell-electro + amix/vimrc stack. Default for existing users. diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..d606178 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2010-2026 Deepak Seth + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md index eb55fff..c617392 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,9 @@ # xydacshell -An opinionated terminal setup. Two profiles, one install script, safe to re-run. +An opinionated terminal setup. Two profiles, one managed toolchain, safe to re-run. - **classic** — oh-my-zsh with the `materialshell-electro` theme, amix/vimrc, and a handful of zsh plugins. The original xydacshell stack. -- **modern** — starship prompt, Neovim with a small `init.lua`, and graceful use of fzf / zoxide / lsd / bat when they're installed. +- **modern** — starship prompt, Neovim with a small `init.lua`, and graceful use of fzf / zoxide / lsd / bat / ncdu / dust / duf when they're installed. Existing users: your setup still works. You stay on `classic` until you opt into `modern`. @@ -16,67 +16,84 @@ bash install.sh # fresh: defaults to classic bash install.sh --profile modern # opt into modern ``` -The installer is idempotent — running it twice is safe. +The installer is idempotent — running it twice is safe. After it finishes, open a new shell. The `xydacshell` command is on your `PATH`. -## Update +## Usage + +Once installed, everything runs through the `xydacshell` command: ```bash -cd ~/.xydacshell -git pull --rebase -git submodule update --init --recursive -bash install.sh +xydacshell # help +xydacshell install [--profile X] # run the installer (same as bash install.sh) +xydacshell update # git pull + submodule sync + reinstall +xydacshell switch modern # flip profile +xydacshell doctor # diagnose current install state +xydacshell rollback # restore from the most recent backup +xydacshell storage # disk-usage report, per-cache cleanup prompts +xydacshell uninstall # remove cleanly, restore legacy backups ``` -## Switch profile +Every command supports `--dry-run` and `--force`. + +## Storage analytics ```bash -cd ~/.xydacshell -bash install.sh --profile modern -# or: bash install.sh --profile classic +xydacshell storage # filesystems + $HOME top dirs + pkg caches +xydacshell storage --caches # only package-manager caches +xydacshell storage --top 20 # more $HOME entries +xydacshell storage --clean # after the report, prompt per-cache to prune ``` -Your `~/.xydacshell/zshrc.custom` and `vimrc.custom` are never touched. +The report covers: +- local filesystems (via `duf` if installed, else `df -h`) +- top directories in `$HOME` (via `dust` if installed, else `du | sort`) +- package-manager caches: brew · npm · pnpm · cargo · pip · uv +- docker (`docker system df`) +- trash + +Clean-up runs the documented cleanup command for each cache (e.g. `brew cleanup -s`, `pnpm store prune`, `docker system prune -f`), guarded by per-cache y/n prompts. `--dry-run` previews. ## Customize -Add your personal settings here — they outlive any profile switch or upgrade. +Edit these files — they outlive any profile switch or upgrade and are never touched by the installer. - zsh: `~/.xydacshell/zshrc.custom` - vim (classic): `~/.xydacshell/vimrc.custom` - nvim (modern): `~/.xydacshell/nvim.custom.lua` -## Modern profile — optional tool install hints +## Modern profile — optional tool install -The modern profile degrades gracefully when these are missing. To get the full experience: +The installer detects your OS + package manager and offers to install each missing tool, one at a time. Missing tools degrade gracefully — the modern profile still works without them. ```bash -# macOS -brew install starship neovim fzf zoxide lsd bat +# What the installer offers on macOS: +brew install starship neovim fzf zoxide lsd bat ncdu dust duf -# Debian/Ubuntu -sudo apt install neovim fzf -# For starship, zoxide, lsd, bat — see each project's release page or use a user-local install. +# On Debian/Ubuntu the installer falls back to official scripts for +# tools apt doesn't ship (starship, zoxide, dust). ``` ## Uninstall ```bash -# Restore the original pre-install configs if present. -[ -f ~/.xydacshell/backup/.zshrc ] && mv ~/.xydacshell/backup/.zshrc ~/.zshrc || rm -f ~/.zshrc -[ -f ~/.xydacshell/backup/.vimrc ] && mv ~/.xydacshell/backup/.vimrc ~/.vimrc || rm -f ~/.vimrc -rm -rf ~/.xydacshell +xydacshell uninstall # removes our symlinks, restores legacy backups +rm -rf ~/.xydacshell # removes the repo itself ``` -## What ships +## Repository layout ``` xydacshell/ -├── install.sh # idempotent, profile-aware, --dry-run, --force -├── lib/util.sh # shell helpers -├── zshrc.file, vimrc.file # dispatchers (read the profile, load the right config) +├── bin/xydacshell # dispatcher on your PATH +├── install.sh # idempotent, profile-aware +├── lib/ +│ ├── util.sh # shared shell helpers +│ ├── modern-tools.sh # OS + PM detection, tool installer +│ └── cmds/ # one file per `xydacshell ` ├── profiles/ │ ├── classic/ { zshrc, vimrc } # the original setup │ └── modern/ { zshrc, starship.toml, nvim/init.lua } +├── zshrc.file, vimrc.file # dispatchers (read the profile, load config) ├── materialshell-electro.zsh-theme # classic prompt theme ├── backup/ # timestamped backups per install run └── .github/workflows/ci.yml # shellcheck + zsh/nvim syntax checks @@ -87,7 +104,7 @@ xydacshell/ - `zsh` required. - `git` required. - `classic` profile: submodules are used (oh-my-zsh, amix/vimrc, etc.). -- `modern` profile: Neovim recommended; starship, fzf, zoxide, lsd, bat are optional and each has a fallback. +- `modern` profile: Neovim recommended; starship, fzf, zoxide, lsd, bat are optional with fallbacks. ## License diff --git a/bin/xydacshell b/bin/xydacshell new file mode 100755 index 0000000..dffacb0 --- /dev/null +++ b/bin/xydacshell @@ -0,0 +1,66 @@ +#!/usr/bin/env bash +# xydacshell — subcommand dispatcher. +# Add $XYDACSHELL_HOME/bin to PATH (the profile zshrcs do this for you). + +set -euo pipefail + +: ${XYDACSHELL_HOME:=$HOME/.xydacshell} +export XYDACSHELL_HOME + +if [ ! -f "$XYDACSHELL_HOME/lib/util.sh" ]; then + echo "xydacshell: cannot find $XYDACSHELL_HOME/lib/util.sh — is XYDACSHELL_HOME correct?" >&2 + exit 1 +fi + +# shellcheck source=../lib/util.sh +. "$XYDACSHELL_HOME/lib/util.sh" + +usage() { + cat <<'EOF' +xydacshell — your terminal setup, managed. + +usage: xydacshell [args] + +commands + install [flags] run the installer (same as bash install.sh) + update git pull + submodule sync + reinstall + switch switch profile + doctor diagnose current install state + rollback [--stamp YYYYMMDDTHHMMSSZ] + restore from a timestamped backup + storage [--caches] [--top N] [--clean] + disk usage report; --clean prompts to prune + uninstall remove xydacshell, restore legacy backups + +global flags + --dry-run preview (supported by install/update/switch/rollback/storage/uninstall) + --force auto-accept prompts + --help, -h show this message or per-command help + +run 'xydacshell --help' for per-command help. +EOF +} + +cmd="${1:-help}" +shift || true + +case "$cmd" in + install|update|switch|doctor|rollback|storage|uninstall) + src="$XYDACSHELL_HOME/lib/cmds/$cmd.sh" + if [ ! -f "$src" ]; then + xs_err "command file missing: $src" + exit 1 + fi + # shellcheck source=/dev/null + . "$src" + "xs_cmd_$cmd" "$@" + ;; + help|--help|-h|"") + usage + ;; + *) + xs_err "unknown command: $cmd" + usage >&2 + exit 2 + ;; +esac diff --git a/install.sh b/install.sh old mode 100644 new mode 100755 index f4b02cf..74bfe2d --- a/install.sh +++ b/install.sh @@ -163,7 +163,7 @@ case "$target_profile" in # Detect missing modern tools and offer to install them. # User is prompted per tool; --force accepts all; --dry-run previews without running. - FORCE="$FORCE" xs_modern_tools_offer starship nvim fzf zoxide lsd bat + FORCE="$FORCE" xs_modern_tools_offer starship nvim fzf zoxide lsd bat ncdu dust duf ;; esac diff --git a/lib/cmds/doctor.sh b/lib/cmds/doctor.sh new file mode 100644 index 0000000..98bfd04 --- /dev/null +++ b/lib/cmds/doctor.sh @@ -0,0 +1,96 @@ +#!/usr/bin/env bash +# xydacshell doctor — report current install state. + +xs_cmd_doctor() { + local xh="$XYDACSHELL_HOME" + + printf '\n%s\n' "xydacshell doctor" + printf '==================\n' + + # Paths. + printf '\npaths\n' + printf ' XYDACSHELL_HOME %s\n' "$xh" + printf ' dispatcher %s\n' "$xh/bin/xydacshell" + + # Profile. + local profile + if [ -f "$xh/profile" ]; then + profile="$(cat "$xh/profile")" + else + profile="(unset — dispatcher defaults to classic)" + fi + printf '\nprofile %s\n' "$profile" + + # Symlinks. + printf '\nsymlinks\n' + local f + for f in "$HOME/.zshrc" "$HOME/.vimrc" \ + "${XDG_CONFIG_HOME:-$HOME/.config}/nvim/init.lua" \ + "${XDG_CONFIG_HOME:-$HOME/.config}/starship.toml"; do + if [ -L "$f" ]; then + printf ' %-44s → %s\n' "$f" "$(readlink "$f")" + elif [ -e "$f" ]; then + printf ' %-44s (regular file, not managed by xydacshell)\n' "$f" + fi + done + + # Sacred custom files. + printf '\ncustom files (never touched by installer)\n' + local c size="-" + for c in "$xh/zshrc.custom" "$xh/vimrc.custom" "$xh/nvim.custom.lua"; do + if [ -f "$c" ]; then + size="$(wc -c < "$c" | tr -d ' ')" + printf ' %-44s %s bytes\n' "$c" "$size" + else + printf ' %-44s (absent)\n' "$c" + fi + done + + # Environment + tool status. + # shellcheck source=../modern-tools.sh + . "$xh/lib/modern-tools.sh" + xs_detect_pm + printf '\nenvironment\n' + printf ' OS %s\n' "$XS_OS" + printf ' package manager %s\n' "$XS_PM" + + printf '\ntools\n' + local t + for t in starship nvim fzf zoxide lsd bat ncdu dust duf; do + if xs_command_exists "$t"; then + printf ' %-10s ✓\n' "$t" + else + printf ' %-10s missing\n' "$t" + fi + done + + # Backups. + printf '\nbackups\n' + if [ -d "$xh/backup" ]; then + local latest + latest="$(find "$xh/backup" -maxdepth 1 -type d -name '[0-9]*T[0-9]*Z' 2>/dev/null | sort | tail -1)" + if [ -n "$latest" ]; then + printf ' latest timestamped %s\n' "$(basename "$latest")" + else + printf ' latest timestamped (none)\n' + fi + local legacy=0 + [ -f "$xh/backup/.zshrc" ] && legacy=$((legacy + 1)) + [ -f "$xh/backup/.vimrc" ] && legacy=$((legacy + 1)) + printf ' legacy pre-install %d file(s)\n' "$legacy" + else + printf ' (no backup directory)\n' + fi + + # Git state. + if [ -d "$xh/.git" ]; then + printf '\ngit\n' + printf ' branch %s\n' "$(git -C "$xh" rev-parse --abbrev-ref HEAD 2>/dev/null || echo '?')" + printf ' head %s\n' "$(git -C "$xh" rev-parse --short HEAD 2>/dev/null || echo '?')" + local dirty + dirty="$(git -C "$xh" status --porcelain 2>/dev/null | wc -l | tr -d ' ')" + printf ' uncommitted %s file(s)\n' "$dirty" + fi + + printf '\n' +} diff --git a/lib/cmds/install.sh b/lib/cmds/install.sh new file mode 100644 index 0000000..3aa97bb --- /dev/null +++ b/lib/cmds/install.sh @@ -0,0 +1,6 @@ +#!/usr/bin/env bash +# xydacshell install — delegates to the root install.sh. + +xs_cmd_install() { + (cd "$XYDACSHELL_HOME" && bash "$XYDACSHELL_HOME/install.sh" "$@") +} diff --git a/lib/cmds/rollback.sh b/lib/cmds/rollback.sh new file mode 100644 index 0000000..a00bd40 --- /dev/null +++ b/lib/cmds/rollback.sh @@ -0,0 +1,68 @@ +#!/usr/bin/env bash +# xydacshell rollback — restore files from a timestamped backup. + +xs_cmd_rollback() { + local xh="$XYDACSHELL_HOME" + local stamp="" + + while [ $# -gt 0 ]; do + case "$1" in + --stamp) stamp="${2:-}"; shift 2 ;; + --stamp=*) stamp="${1#--stamp=}"; shift ;; + --dry-run) XS_DRY_RUN=1; export XS_DRY_RUN; shift ;; + --force) FORCE=1; export FORCE; shift ;; + -h|--help) + cat <<'EOF' +usage: xydacshell rollback [--stamp YYYYMMDDTHHMMSSZ] [--dry-run] [--force] + +Restore files from a timestamped backup created by install.sh. If no +--stamp is given, the most recent backup is used. Prompts before writing. +EOF + return 0 + ;; + *) xs_err "unknown flag: $1"; return 2 ;; + esac + done + + if [ -z "$stamp" ]; then + stamp="$(find "$xh/backup" -maxdepth 1 -type d -name '[0-9]*T[0-9]*Z' 2>/dev/null | sort | tail -1 | xargs -n1 basename 2>/dev/null || true)" + fi + + if [ -z "$stamp" ]; then + xs_err "no timestamped backups found in $xh/backup/" + return 1 + fi + + local dir="$xh/backup/$stamp" + if [ ! -d "$dir" ]; then + xs_err "backup dir not found: $dir" + return 1 + fi + + xs_info "rolling back from: $dir" + xs_dim "contents:" + ls -la "$dir" 2>/dev/null | sed 's/^/ /' >&2 + + if ! xs_prompt_yn "restore these files to their original locations?" "n"; then + xs_dim "aborted." + return 0 + fi + + local f name target + for f in "$dir"/*; do + [ -e "$f" ] || continue + name="$(basename "$f")" + case "$name" in + .zshrc) target="$HOME/.zshrc" ;; + .vimrc) target="$HOME/.vimrc" ;; + init.lua) target="${XDG_CONFIG_HOME:-$HOME/.config}/nvim/init.lua" ;; + starship.toml) target="${XDG_CONFIG_HOME:-$HOME/.config}/starship.toml" ;; + *) xs_warn " don't know where to restore '$name', skipping"; continue ;; + esac + if [ -e "$target" ] || [ -L "$target" ]; then + xs_run rm -f "$target" + fi + xs_run cp -a "$f" "$target" + xs_ok "restored $target" + done +} diff --git a/lib/cmds/storage.sh b/lib/cmds/storage.sh new file mode 100644 index 0000000..db1a415 --- /dev/null +++ b/lib/cmds/storage.sh @@ -0,0 +1,129 @@ +#!/usr/bin/env bash +# xydacshell storage — disk-usage report with optional cleanup prompts. + +xs_cmd_storage() { + local flag_caches_only=0 flag_clean=0 top=10 + + while [ $# -gt 0 ]; do + case "$1" in + --caches) flag_caches_only=1; shift ;; + --clean) flag_clean=1; shift ;; + --top) top="${2:-10}"; shift 2 ;; + --top=*) top="${1#--top=}"; shift ;; + --dry-run) XS_DRY_RUN=1; export XS_DRY_RUN; shift ;; + --force) FORCE=1; export FORCE; shift ;; + -h|--help) + cat <<'EOF' +usage: xydacshell storage [--caches] [--top N] [--clean] [--dry-run] [--force] + +Disk-usage report covering filesystems, $HOME top directories, package-manager +caches, containers, and trash. + + --caches only show package-manager caches (skip filesystems and $HOME) + --top N number of $HOME top dirs to show (default 10) + --clean after the report, prompt per-cache to run its cleanup command + --dry-run preview (affects --clean) + --force accept all prompts (affects --clean) +EOF + return 0 + ;; + *) xs_err "unknown flag: $1"; return 2 ;; + esac + done + + if [ "$flag_caches_only" != 1 ]; then + _xs_storage_filesystems + _xs_storage_home "$top" + fi + _xs_storage_caches + _xs_storage_containers + _xs_storage_trash + + if [ "$flag_clean" = 1 ]; then + _xs_storage_clean + fi +} + +# Report filesystems (prefers duf when available, else df -h). +_xs_storage_filesystems() { + printf '\nfilesystems\n' + if xs_command_exists duf; then + duf --only local 2>/dev/null | sed 's/^/ /' + else + df -h 2>/dev/null | head -12 | sed 's/^/ /' + fi +} + +# Top N $HOME directories by size. Uses dust when available, else du | sort. +_xs_storage_home() { + local n="${1:-10}" + printf '\n$HOME top %s directories\n' "$n" + if xs_command_exists dust; then + dust -d 1 -n "$n" "$HOME" 2>/dev/null | sed 's/^/ /' + else + du -sh "$HOME"/* 2>/dev/null | sort -hr | head -"$n" | sed 's/^/ /' + fi +} + +# Return human-readable size of a path, or '-' if absent/empty. +_xs_size() { + local p="$1" + if [ -n "$p" ] && { [ -d "$p" ] || [ -f "$p" ]; }; then + du -sh "$p" 2>/dev/null | awk '{print $1}' + else + printf '-' + fi +} + +_xs_storage_caches() { + printf '\npackage-manager caches\n' + + local brew_cache="" npm_cache="" pnpm_cache="" cargo_cache="$HOME/.cargo" pip_cache="" + xs_command_exists brew && brew_cache="$(brew --cache 2>/dev/null || true)" + xs_command_exists npm && npm_cache="$(npm config get cache 2>/dev/null || true)" + xs_command_exists pnpm && pnpm_cache="$(pnpm store path 2>/dev/null || true)" + if xs_command_exists pip; then + pip_cache="$(pip cache dir 2>/dev/null || true)" + elif xs_command_exists pip3; then + pip_cache="$(pip3 cache dir 2>/dev/null || true)" + fi + + local uv_cache="" + xs_command_exists uv && uv_cache="$(uv cache dir 2>/dev/null || true)" + + _row() { printf ' %-8s %-8s %s\n' "$1" "$(_xs_size "$2")" "$3"; } + _row brew "$brew_cache" "brew cleanup -s" + _row npm "$npm_cache" "npm cache clean --force" + _row pnpm "$pnpm_cache" "pnpm store prune" + _row cargo "$cargo_cache" "cargo cache --autoclean (needs cargo-cache)" + _row pip "$pip_cache" "pip cache purge" + [ -n "$uv_cache" ] && _row uv "$uv_cache" "uv cache clean" +} + +_xs_storage_containers() { + if xs_command_exists docker; then + printf '\ncontainers (docker system df)\n' + docker system df 2>/dev/null | sed 's/^/ /' | head -5 + fi +} + +_xs_storage_trash() { + local t="" + case "$(uname -s)" in + Darwin) t="$HOME/.Trash" ;; + Linux) t="$HOME/.local/share/Trash" ;; + esac + if [ -n "$t" ] && [ -d "$t" ]; then + printf '\ntrash\n %s %s\n' "$(_xs_size "$t")" "$t" + fi +} + +_xs_storage_clean() { + printf '\ncleanup (interactive)\n' + xs_command_exists brew && xs_prompt_yn " brew cleanup -s?" n && xs_run brew cleanup -s + xs_command_exists npm && xs_prompt_yn " npm cache clean?" n && xs_run npm cache clean --force + xs_command_exists pnpm && xs_prompt_yn " pnpm store prune?" n && xs_run pnpm store prune + xs_command_exists pip && xs_prompt_yn " pip cache purge?" n && xs_run pip cache purge + xs_command_exists uv && xs_prompt_yn " uv cache clean?" n && xs_run uv cache clean + xs_command_exists docker && xs_prompt_yn " docker system prune -f?" n && xs_run docker system prune -f +} diff --git a/lib/cmds/switch.sh b/lib/cmds/switch.sh new file mode 100644 index 0000000..97f0b93 --- /dev/null +++ b/lib/cmds/switch.sh @@ -0,0 +1,21 @@ +#!/usr/bin/env bash +# xydacshell switch — shorthand for install --profile . + +xs_cmd_switch() { + local profile="${1:-}" + case "$profile" in + classic|modern) ;; + -h|--help|"") + cat <<'EOF' +usage: xydacshell switch [--dry-run] [--force] + +Switches the active xydacshell profile. Equivalent to: + bash install.sh --profile +EOF + [ -z "$profile" ] && return 2 || return 0 + ;; + *) xs_err "unknown profile: $profile (expected classic|modern)"; return 2 ;; + esac + shift + (cd "$XYDACSHELL_HOME" && bash "$XYDACSHELL_HOME/install.sh" --profile "$profile" "$@") +} diff --git a/lib/cmds/uninstall.sh b/lib/cmds/uninstall.sh new file mode 100644 index 0000000..076b431 --- /dev/null +++ b/lib/cmds/uninstall.sh @@ -0,0 +1,68 @@ +#!/usr/bin/env bash +# xydacshell uninstall — remove our symlinks and restore legacy backups. +# Never touches the xydacshell repo itself; user deletes manually. + +xs_cmd_uninstall() { + local xh="$XYDACSHELL_HOME" + + while [ $# -gt 0 ]; do + case "$1" in + --dry-run) XS_DRY_RUN=1; export XS_DRY_RUN; shift ;; + --force) FORCE=1; export FORCE; shift ;; + -h|--help) + cat <<'EOF' +usage: xydacshell uninstall [--dry-run] [--force] + +Remove xydacshell symlinks and restore the original pre-install files +if they're in backup/.zshrc / backup/.vimrc. Does NOT delete the +xydacshell repo itself. +EOF + return 0 + ;; + *) xs_err "unknown flag: $1"; return 2 ;; + esac + done + + xs_warn "about to uninstall xydacshell" + xs_dim " will remove our symlinks at ~/.zshrc, ~/.vimrc, and the" + xs_dim " modern-profile starship/nvim configs if they point into $xh." + xs_dim " will restore $xh/backup/.zshrc and /.vimrc (pre-install originals)" + xs_dim " if they exist." + xs_dim " will NOT delete $xh itself — rm -rf it manually when ready." + + if ! xs_prompt_yn "proceed?" "n"; then + xs_dim "aborted." + return 0 + fi + + _restore_or_remove() { + local link="$1" legacy="$2" + if [ -L "$link" ] && [[ "$(readlink "$link")" == "$xh"/* ]]; then + xs_run rm -f "$link" + if [ -f "$legacy" ]; then + xs_run mv "$legacy" "$link" + xs_ok "restored $link from $legacy" + else + xs_ok "removed $link" + fi + fi + } + + _restore_or_remove "$HOME/.zshrc" "$xh/backup/.zshrc" + _restore_or_remove "$HOME/.vimrc" "$xh/backup/.vimrc" + + local nvim="${XDG_CONFIG_HOME:-$HOME/.config}/nvim/init.lua" + if [ -L "$nvim" ] && [[ "$(readlink "$nvim")" == "$xh"/* ]]; then + xs_run rm -f "$nvim" + xs_ok "removed $nvim" + fi + + local starship="${XDG_CONFIG_HOME:-$HOME/.config}/starship.toml" + if [ -L "$starship" ] && [[ "$(readlink "$starship")" == "$xh"/* ]]; then + xs_run rm -f "$starship" + xs_ok "removed $starship" + fi + + printf '\n' + xs_info "done. to complete removal: rm -rf $xh" +} diff --git a/lib/cmds/update.sh b/lib/cmds/update.sh new file mode 100644 index 0000000..578ccf7 --- /dev/null +++ b/lib/cmds/update.sh @@ -0,0 +1,20 @@ +#!/usr/bin/env bash +# xydacshell update — git pull + submodule sync + reinstall. + +xs_cmd_update() { + local xh="$XYDACSHELL_HOME" + + if [ ! -d "$xh/.git" ]; then + xs_err "$xh is not a git checkout; cannot update." + return 1 + fi + + xs_info "pulling latest" + xs_run git -C "$xh" pull --rebase + + xs_info "syncing submodules" + xs_run git -C "$xh" submodule update --init --recursive + + xs_info "reinstalling current profile" + (cd "$xh" && bash "$xh/install.sh" "$@") +} diff --git a/lib/modern-tools.sh b/lib/modern-tools.sh index c6f8e04..654a3e5 100644 --- a/lib/modern-tools.sh +++ b/lib/modern-tools.sh @@ -48,6 +48,10 @@ xs_pkg_for() { bat:brew|bat:pacman|bat:dnf) echo bat ;; bat:apt) echo bat ;; # on Debian the binary is called batcat — user needs to alias bat:apk) echo bat ;; + ncdu:brew|ncdu:apt|ncdu:dnf|ncdu:pacman|ncdu:apk) echo ncdu ;; + dust:brew|dust:pacman|dust:dnf) echo dust ;; + dust:apt|dust:apk) echo "" ;; # fallback: cargo install du-dust + duf:brew|duf:apt|duf:dnf|duf:pacman|duf:apk) echo duf ;; *) echo "" ;; esac } @@ -58,6 +62,7 @@ xs_fallback_for() { case "$tool" in starship) echo 'curl -sS https://starship.rs/install.sh | sh -s -- --yes' ;; zoxide) echo 'curl -sSfL https://raw.githubusercontent.com/ajeetdsouza/zoxide/main/install.sh | sh' ;; + dust) echo 'cargo install du-dust # requires Rust toolchain' ;; *) echo "" ;; esac } @@ -75,28 +80,6 @@ xs_install_cmd() { esac } -# xs_prompt_yn : yes/no prompt. Honors FORCE and XS_DRY_RUN. -# Returns 0 for yes, 1 for no. -xs_prompt_yn() { - local q="$1" default="${2:-n}" - if [ "${FORCE:-0}" = 1 ]; then return 0; fi - if [ "${XS_DRY_RUN:-0}" = 1 ]; then return 0; fi # preview-affirmative so user sees what would happen - - local hint - case "$default" in - y|Y) hint="[Y/n]" ;; - *) hint="[y/N]" ;; - esac - - printf '%s %s ' "$q" "$hint" - read -r ans - : "${ans:=$default}" - case "$ans" in - y|Y|yes|YES) return 0 ;; - *) return 1 ;; - esac -} - # xs_modern_tools_offer: for each tool in $1..., if missing, show install option and install if accepted. # Returns 0 regardless of individual outcomes (modern profile degrades gracefully). xs_modern_tools_offer() { diff --git a/lib/util.sh b/lib/util.sh index fbde71c..38bca0c 100644 --- a/lib/util.sh +++ b/lib/util.sh @@ -84,6 +84,29 @@ xs_symlink() { xs_ok "linked $dest → $src" } +# xs_prompt_yn : yes/no prompt. Honors FORCE and XS_DRY_RUN. +# Returns 0 for yes, 1 for no. --force skips ask and returns yes. +# --dry-run also returns yes so previews show what would happen. +xs_prompt_yn() { + local q="$1" default="${2:-n}" + if [ "${FORCE:-0}" = 1 ]; then return 0; fi + if [ "${XS_DRY_RUN:-0}" = 1 ]; then return 0; fi + + local hint + case "$default" in + y|Y) hint="[Y/n]" ;; + *) hint="[y/N]" ;; + esac + + printf '%s %s ' "$q" "$hint" + read -r ans + : "${ans:=$default}" + case "$ans" in + y|Y|yes|YES) return 0 ;; + *) return 1 ;; + esac +} + # xs_profile_read : echo the active profile, or "classic" if the file is missing. xs_profile_read() { local xhome="$1" file="$1/profile" diff --git a/zshrc.file b/zshrc.file index 56127c4..4f9d9e1 100644 --- a/zshrc.file +++ b/zshrc.file @@ -10,6 +10,13 @@ # sourced at the end, after the profile loads. That hasn't changed. : ${XYDACSHELL_HOME:=$HOME/.xydacshell} +export XYDACSHELL_HOME + +# Put our bin/ on PATH so `xydacshell` works as a command. +case ":$PATH:" in + *":$XYDACSHELL_HOME/bin:"*) ;; + *) export PATH="$XYDACSHELL_HOME/bin:$PATH" ;; +esac if [ -f "$XYDACSHELL_HOME/profile" ]; then XYDACSHELL_PROFILE="$(cat "$XYDACSHELL_HOME/profile")" From de50f19771d5a613a50cfef9305df26ef5f2e245 Mon Sep 17 00:00:00 2001 From: xydac Date: Sun, 12 Apr 2026 09:46:43 -0700 Subject: [PATCH 05/12] Rename dispatcher to 'x', warn on PATH conflicts MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Primary command is now 'x' (short, fast to type) with 'xydacshell' kept as a symlink alias for discoverability, tab completion, and existing muscle memory. Both work identically. During install, check PATH for an existing 'x' that isn't ours and print a clear warning listing the conflicting path(s), with a reminder that shell aliases (which override PATH in interactive shells) won't be visible from install.sh — the user needs to run 'alias | grep ^x=' themselves. If the user wants to keep their existing 'x', the 'xydacshell' symlink still works. --- CHANGELOG.md | 2 +- README.md | 35 ++++++++++++---------- bin/x | 69 +++++++++++++++++++++++++++++++++++++++++++ bin/xydacshell | 67 +---------------------------------------- install.sh | 15 ++++++++++ lib/cmds/doctor.sh | 2 +- lib/cmds/install.sh | 2 +- lib/cmds/rollback.sh | 4 +-- lib/cmds/storage.sh | 4 +-- lib/cmds/switch.sh | 4 +-- lib/cmds/uninstall.sh | 4 +-- lib/cmds/update.sh | 2 +- 12 files changed, 116 insertions(+), 94 deletions(-) create mode 100755 bin/x mode change 100755 => 120000 bin/xydacshell diff --git a/CHANGELOG.md b/CHANGELOG.md index 47a83d9..7741234 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,7 @@ ## Unreleased — upgrade-path branch ### Added -- **`xydacshell` command.** A PATH-installed dispatcher (`bin/xydacshell`) with subcommands: `install`, `update`, `switch`, `doctor`, `rollback`, `storage`, `uninstall`. Both profile zshrcs prepend `$XYDACSHELL_HOME/bin` to PATH so it "just works" after install. +- **`x` command** (with `xydacshell` as a symlink alias for discoverability). PATH-installed dispatcher (`bin/x`) with subcommands: `install`, `update`, `switch`, `doctor`, `rollback`, `storage`, `uninstall`. Both profile zshrcs prepend `$XYDACSHELL_HOME/bin` to PATH so it "just works" after install. The installer warns if another `x` is already on PATH (or may be shadowed by a shell alias). - **`xydacshell doctor`.** One-command diagnostic: current profile, managed symlinks, sacred custom file sizes, detected OS + package manager, modern-tool presence, most recent backup, git state. - **`xydacshell rollback`.** Restore files from a timestamped backup dir (most recent by default; `--stamp` to pick one). Prompts before writing; `--dry-run` previews. - **`xydacshell storage`.** Disk-usage report: local filesystems (via `duf`/`df`), top `$HOME` directories (via `dust`/`du`), package-manager caches (brew, npm, pnpm, cargo, pip, uv), docker, trash. `--caches` to focus, `--top N` to expand, `--clean` to prompt per-cache cleanup. diff --git a/README.md b/README.md index c617392..70eeb82 100644 --- a/README.md +++ b/README.md @@ -16,21 +16,23 @@ bash install.sh # fresh: defaults to classic bash install.sh --profile modern # opt into modern ``` -The installer is idempotent — running it twice is safe. After it finishes, open a new shell. The `xydacshell` command is on your `PATH`. +The installer is idempotent — running it twice is safe. After it finishes, open a new shell. The `x` command (and its `xydacshell` alias) is on your `PATH`. + +> **Heads-up on the name `x`:** the installer warns you if another `x` command already exists on your PATH (or via shell alias). Our `x` will take precedence in new shells. If you'd rather keep your existing `x`, use the `xydacshell` symlink instead — it's the same command. ## Usage -Once installed, everything runs through the `xydacshell` command: +Once installed, everything runs through the `x` command (`xydacshell` is an alias): ```bash -xydacshell # help -xydacshell install [--profile X] # run the installer (same as bash install.sh) -xydacshell update # git pull + submodule sync + reinstall -xydacshell switch modern # flip profile -xydacshell doctor # diagnose current install state -xydacshell rollback # restore from the most recent backup -xydacshell storage # disk-usage report, per-cache cleanup prompts -xydacshell uninstall # remove cleanly, restore legacy backups +x # help +x install [--profile X] # run the installer (same as bash install.sh) +x update # git pull + submodule sync + reinstall +x switch modern # flip profile +x doctor # diagnose current install state +x rollback # restore from the most recent backup +x storage # disk-usage report, per-cache cleanup prompts +x uninstall # remove cleanly, restore legacy backups ``` Every command supports `--dry-run` and `--force`. @@ -38,10 +40,10 @@ Every command supports `--dry-run` and `--force`. ## Storage analytics ```bash -xydacshell storage # filesystems + $HOME top dirs + pkg caches -xydacshell storage --caches # only package-manager caches -xydacshell storage --top 20 # more $HOME entries -xydacshell storage --clean # after the report, prompt per-cache to prune +x storage # filesystems + $HOME top dirs + pkg caches +x storage --caches # only package-manager caches +x storage --top 20 # more $HOME entries +x storage --clean # after the report, prompt per-cache to prune ``` The report covers: @@ -76,7 +78,7 @@ brew install starship neovim fzf zoxide lsd bat ncdu dust duf ## Uninstall ```bash -xydacshell uninstall # removes our symlinks, restores legacy backups +x uninstall # removes our symlinks, restores legacy backups rm -rf ~/.xydacshell # removes the repo itself ``` @@ -84,7 +86,8 @@ rm -rf ~/.xydacshell # removes the repo itself ``` xydacshell/ -├── bin/xydacshell # dispatcher on your PATH +├── bin/x # dispatcher on your PATH +├── bin/xydacshell # symlink → x ├── install.sh # idempotent, profile-aware ├── lib/ │ ├── util.sh # shared shell helpers diff --git a/bin/x b/bin/x new file mode 100755 index 0000000..88f002b --- /dev/null +++ b/bin/x @@ -0,0 +1,69 @@ +#!/usr/bin/env bash +# xydacshell subcommand dispatcher. +# Installed as `x` (primary) with an `xydacshell` symlink for discoverability. +# Add $XYDACSHELL_HOME/bin to PATH (the profile zshrcs do this for you). + +set -euo pipefail + +: ${XYDACSHELL_HOME:=$HOME/.xydacshell} +export XYDACSHELL_HOME + +if [ ! -f "$XYDACSHELL_HOME/lib/util.sh" ]; then + echo "x: cannot find $XYDACSHELL_HOME/lib/util.sh — is XYDACSHELL_HOME correct?" >&2 + exit 1 +fi + +# shellcheck source=../lib/util.sh +. "$XYDACSHELL_HOME/lib/util.sh" + +usage() { + cat <<'EOF' +x — xydacshell command. + +usage: x [args] + +commands + install [flags] run the installer (same as bash install.sh) + update git pull + submodule sync + reinstall + switch switch profile + doctor diagnose current install state + rollback [--stamp YYYYMMDDTHHMMSSZ] + restore from a timestamped backup + storage [--caches] [--top N] [--clean] + disk usage report; --clean prompts to prune + uninstall remove xydacshell, restore legacy backups + +(xydacshell is a symlink to x; both work.) + +global flags + --dry-run preview (supported by install/update/switch/rollback/storage/uninstall) + --force auto-accept prompts + --help, -h show this message or per-command help + +run 'x --help' for per-command help. +EOF +} + +cmd="${1:-help}" +shift || true + +case "$cmd" in + install|update|switch|doctor|rollback|storage|uninstall) + src="$XYDACSHELL_HOME/lib/cmds/$cmd.sh" + if [ ! -f "$src" ]; then + xs_err "command file missing: $src" + exit 1 + fi + # shellcheck source=/dev/null + . "$src" + "xs_cmd_$cmd" "$@" + ;; + help|--help|-h|"") + usage + ;; + *) + xs_err "unknown command: $cmd" + usage >&2 + exit 2 + ;; +esac diff --git a/bin/xydacshell b/bin/xydacshell deleted file mode 100755 index dffacb0..0000000 --- a/bin/xydacshell +++ /dev/null @@ -1,66 +0,0 @@ -#!/usr/bin/env bash -# xydacshell — subcommand dispatcher. -# Add $XYDACSHELL_HOME/bin to PATH (the profile zshrcs do this for you). - -set -euo pipefail - -: ${XYDACSHELL_HOME:=$HOME/.xydacshell} -export XYDACSHELL_HOME - -if [ ! -f "$XYDACSHELL_HOME/lib/util.sh" ]; then - echo "xydacshell: cannot find $XYDACSHELL_HOME/lib/util.sh — is XYDACSHELL_HOME correct?" >&2 - exit 1 -fi - -# shellcheck source=../lib/util.sh -. "$XYDACSHELL_HOME/lib/util.sh" - -usage() { - cat <<'EOF' -xydacshell — your terminal setup, managed. - -usage: xydacshell [args] - -commands - install [flags] run the installer (same as bash install.sh) - update git pull + submodule sync + reinstall - switch switch profile - doctor diagnose current install state - rollback [--stamp YYYYMMDDTHHMMSSZ] - restore from a timestamped backup - storage [--caches] [--top N] [--clean] - disk usage report; --clean prompts to prune - uninstall remove xydacshell, restore legacy backups - -global flags - --dry-run preview (supported by install/update/switch/rollback/storage/uninstall) - --force auto-accept prompts - --help, -h show this message or per-command help - -run 'xydacshell --help' for per-command help. -EOF -} - -cmd="${1:-help}" -shift || true - -case "$cmd" in - install|update|switch|doctor|rollback|storage|uninstall) - src="$XYDACSHELL_HOME/lib/cmds/$cmd.sh" - if [ ! -f "$src" ]; then - xs_err "command file missing: $src" - exit 1 - fi - # shellcheck source=/dev/null - . "$src" - "xs_cmd_$cmd" "$@" - ;; - help|--help|-h|"") - usage - ;; - *) - xs_err "unknown command: $cmd" - usage >&2 - exit 2 - ;; -esac diff --git a/bin/xydacshell b/bin/xydacshell new file mode 120000 index 0000000..c1b0730 --- /dev/null +++ b/bin/xydacshell @@ -0,0 +1 @@ +x \ No newline at end of file diff --git a/install.sh b/install.sh index 74bfe2d..15d3982 100755 --- a/install.sh +++ b/install.sh @@ -185,6 +185,21 @@ done # Write the profile file last. xs_profile_write "$XYDACSHELL_HOME" "$target_profile" +# Warn if another `x` is on PATH that isn't ours — it may shadow xydacshell's +# command in scripts or non-interactive shells. Aliases in zsh override PATH +# for interactive shells, so also prompt the user to check. +existing_x="$(type -ap x 2>/dev/null | grep -v "^${XYDACSHELL_HOME}/bin/x\$" || true)" +if [ -n "$existing_x" ]; then + xs_warn "another 'x' command is on your PATH:" + printf '%s\n' "$existing_x" | sed 's/^/ /' >&2 + xs_dim " after this install, xydacshell's 'x' will take precedence in new" + xs_dim " shells because \$XYDACSHELL_HOME/bin is prepended to PATH." + xs_dim " also check for shell aliases that would shadow it:" + xs_dim " alias | grep '^x='" + xs_dim " if you want to keep your existing 'x', use 'xydacshell' instead" + xs_dim " (it's a symlink to the same command)." +fi + # Verify sacred files are unchanged. if [ "$XS_DRY_RUN" != "1" ]; then post_zshrc_custom="$(snapshot_hash "$XYDACSHELL_HOME/zshrc.custom")" diff --git a/lib/cmds/doctor.sh b/lib/cmds/doctor.sh index 98bfd04..eb7f612 100644 --- a/lib/cmds/doctor.sh +++ b/lib/cmds/doctor.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# xydacshell doctor — report current install state. +# x doctor — report current install state. xs_cmd_doctor() { local xh="$XYDACSHELL_HOME" diff --git a/lib/cmds/install.sh b/lib/cmds/install.sh index 3aa97bb..703b484 100644 --- a/lib/cmds/install.sh +++ b/lib/cmds/install.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# xydacshell install — delegates to the root install.sh. +# x install — delegates to the root install.sh. xs_cmd_install() { (cd "$XYDACSHELL_HOME" && bash "$XYDACSHELL_HOME/install.sh" "$@") diff --git a/lib/cmds/rollback.sh b/lib/cmds/rollback.sh index a00bd40..6687f94 100644 --- a/lib/cmds/rollback.sh +++ b/lib/cmds/rollback.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# xydacshell rollback — restore files from a timestamped backup. +# x rollback — restore files from a timestamped backup. xs_cmd_rollback() { local xh="$XYDACSHELL_HOME" @@ -13,7 +13,7 @@ xs_cmd_rollback() { --force) FORCE=1; export FORCE; shift ;; -h|--help) cat <<'EOF' -usage: xydacshell rollback [--stamp YYYYMMDDTHHMMSSZ] [--dry-run] [--force] +usage: x rollback [--stamp YYYYMMDDTHHMMSSZ] [--dry-run] [--force] Restore files from a timestamped backup created by install.sh. If no --stamp is given, the most recent backup is used. Prompts before writing. diff --git a/lib/cmds/storage.sh b/lib/cmds/storage.sh index db1a415..5124c73 100644 --- a/lib/cmds/storage.sh +++ b/lib/cmds/storage.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# xydacshell storage — disk-usage report with optional cleanup prompts. +# x storage — disk-usage report with optional cleanup prompts. xs_cmd_storage() { local flag_caches_only=0 flag_clean=0 top=10 @@ -14,7 +14,7 @@ xs_cmd_storage() { --force) FORCE=1; export FORCE; shift ;; -h|--help) cat <<'EOF' -usage: xydacshell storage [--caches] [--top N] [--clean] [--dry-run] [--force] +usage: x storage [--caches] [--top N] [--clean] [--dry-run] [--force] Disk-usage report covering filesystems, $HOME top directories, package-manager caches, containers, and trash. diff --git a/lib/cmds/switch.sh b/lib/cmds/switch.sh index 97f0b93..3b012c5 100644 --- a/lib/cmds/switch.sh +++ b/lib/cmds/switch.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# xydacshell switch — shorthand for install --profile . +# x switch — shorthand for install --profile . xs_cmd_switch() { local profile="${1:-}" @@ -7,7 +7,7 @@ xs_cmd_switch() { classic|modern) ;; -h|--help|"") cat <<'EOF' -usage: xydacshell switch [--dry-run] [--force] +usage: x switch [--dry-run] [--force] Switches the active xydacshell profile. Equivalent to: bash install.sh --profile diff --git a/lib/cmds/uninstall.sh b/lib/cmds/uninstall.sh index 076b431..f90956a 100644 --- a/lib/cmds/uninstall.sh +++ b/lib/cmds/uninstall.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# xydacshell uninstall — remove our symlinks and restore legacy backups. +# x uninstall — remove our symlinks and restore legacy backups. # Never touches the xydacshell repo itself; user deletes manually. xs_cmd_uninstall() { @@ -11,7 +11,7 @@ xs_cmd_uninstall() { --force) FORCE=1; export FORCE; shift ;; -h|--help) cat <<'EOF' -usage: xydacshell uninstall [--dry-run] [--force] +usage: x uninstall [--dry-run] [--force] Remove xydacshell symlinks and restore the original pre-install files if they're in backup/.zshrc / backup/.vimrc. Does NOT delete the diff --git a/lib/cmds/update.sh b/lib/cmds/update.sh index 578ccf7..280e5b6 100644 --- a/lib/cmds/update.sh +++ b/lib/cmds/update.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# xydacshell update — git pull + submodule sync + reinstall. +# x update — git pull + submodule sync + reinstall. xs_cmd_update() { local xh="$XYDACSHELL_HOME" From b795ab6a5b0e81ad837fdfb1c72a80d4f337d485 Mon Sep 17 00:00:00 2001 From: xydac Date: Sun, 12 Apr 2026 09:55:03 -0700 Subject: [PATCH 06/12] Make 'x doctor' the upgrade path for classic users After printing the diagnostic, doctor now checks: is the user on the classic profile, is the repo clean, and is stdin a tty? If all three, it offers to preview (dry-run) and then apply a switch to the modern profile. Declining leaves everything untouched. This turns 'x doctor' into the friendly post-git-pull entry point for existing users. The upgrade flow becomes: cd ~/.xydacshell git stash && git pull --rebase && git submodule update --init --recursive && git stash pop exec zsh # new shell picks up the x command on PATH x doctor # report + optionally switch to modern Classic users who say no never see a change. Their shell remains byte-for-byte what it was. Also: --no-prompt / --report flag for doctor to skip the offer (useful for scripts and CI). --- CHANGELOG.md | 1 + README.md | 22 ++++++++++++++ lib/cmds/doctor.sh | 74 +++++++++++++++++++++++++++++++++++++++++++++- 3 files changed, 96 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7741234..15f5514 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ ## Unreleased — upgrade-path branch ### Added +- **`x doctor` offers profile upgrades.** When a user is on classic with a clean repo and an interactive tty, doctor prints the report and then offers to preview (`install.sh --dry-run --profile modern`) and, if accepted, apply the switch. Skippable with `--no-prompt`/`--report`. Intended as the friendly post-`git pull` entry point for existing classic users. - **`x` command** (with `xydacshell` as a symlink alias for discoverability). PATH-installed dispatcher (`bin/x`) with subcommands: `install`, `update`, `switch`, `doctor`, `rollback`, `storage`, `uninstall`. Both profile zshrcs prepend `$XYDACSHELL_HOME/bin` to PATH so it "just works" after install. The installer warns if another `x` is already on PATH (or may be shadowed by a shell alias). - **`xydacshell doctor`.** One-command diagnostic: current profile, managed symlinks, sacred custom file sizes, detected OS + package manager, modern-tool presence, most recent backup, git state. - **`xydacshell rollback`.** Restore files from a timestamped backup dir (most recent by default; `--stamp` to pick one). Prompts before writing; `--dry-run` previews. diff --git a/README.md b/README.md index 70eeb82..f7608f4 100644 --- a/README.md +++ b/README.md @@ -16,6 +16,28 @@ bash install.sh # fresh: defaults to classic bash install.sh --profile modern # opt into modern ``` +### Upgrading from a pre-2026 install + +Existing classic-profile installs keep working after a `git pull`. The updated +dispatcher defaults to classic when no profile file is present, so your shell +stays byte-for-byte the same. The only visible change is that the `x` command +appears on your `PATH` in new shells. + +```bash +cd ~/.xydacshell +git stash # only if you've hand-edited tracked files +git pull --rebase +git submodule update --init --recursive +git stash pop # only if you stashed +exec zsh # new shell picks up the x command + +x doctor # report + offer to switch to modern +``` + +`x doctor` detects that you're on classic, checks that the repo is clean, and +offers to dry-run and then apply a switch to the modern profile. Say no and +nothing changes. + The installer is idempotent — running it twice is safe. After it finishes, open a new shell. The `x` command (and its `xydacshell` alias) is on your `PATH`. > **Heads-up on the name `x`:** the installer warns you if another `x` command already exists on your PATH (or via shell alias). Our `x` will take precedence in new shells. If you'd rather keep your existing `x`, use the `xydacshell` symlink instead — it's the same command. diff --git a/lib/cmds/doctor.sh b/lib/cmds/doctor.sh index eb7f612..3475ad3 100644 --- a/lib/cmds/doctor.sh +++ b/lib/cmds/doctor.sh @@ -1,8 +1,32 @@ #!/usr/bin/env bash -# x doctor — report current install state. +# x doctor — report current install state, and offer profile upgrades +# when appropriate (classic + clean repo + interactive tty). xs_cmd_doctor() { local xh="$XYDACSHELL_HOME" + local flag_no_prompt=0 flag_report=0 + + while [ $# -gt 0 ]; do + case "$1" in + --no-prompt|--report) flag_no_prompt=1; flag_report=1; shift ;; + --dry-run) XS_DRY_RUN=1; export XS_DRY_RUN; shift ;; + --force) FORCE=1; export FORCE; shift ;; + -h|--help) + cat <<'EOF' +usage: x doctor [--no-prompt|--report] + +Reports the current install state (profile, symlinks, custom files, PM, +tool presence, backups, git state). + +When on the classic profile with a clean repo and an interactive terminal, +doctor offers to preview and switch to the modern profile. Pass --no-prompt +(alias: --report) to skip that and just print the diagnostic. +EOF + return 0 + ;; + *) xs_err "unknown flag: $1"; return 2 ;; + esac + done printf '\n%s\n' "xydacshell doctor" printf '==================\n' @@ -93,4 +117,52 @@ xs_cmd_doctor() { fi printf '\n' + + # Optional: offer a profile upgrade if conditions are right. + if [ "$flag_no_prompt" != 1 ]; then + _xs_doctor_maybe_offer_upgrade "$profile" + fi +} + +# If the user is on classic, the repo is clean, and stdin is a tty, offer +# to preview and switch to modern. Otherwise return silently. +_xs_doctor_maybe_offer_upgrade() { + local current="$1" + local xh="$XYDACSHELL_HOME" + + [ "$current" = classic ] || return 0 + [ -t 0 ] || return 0 + + if [ -d "$xh/.git" ]; then + local dirty + dirty="$(git -C "$xh" status --porcelain 2>/dev/null | wc -l | tr -d ' ')" + if [ "$dirty" != 0 ]; then + xs_dim "the modern profile is available, but the repo has uncommitted" + xs_dim "changes. commit or stash them, then re-run 'x doctor' to see the" + xs_dim "switch option." + return 0 + fi + fi + + xs_info "you're on the classic profile." + xs_dim " modern swaps in starship + nvim + fzf/zoxide/lsd/bat." + xs_dim " your zshrc.custom and vimrc.custom stay untouched." + xs_dim " revertible any time with 'x switch classic'." + + if ! xs_prompt_yn "preview a switch to modern?" "n"; then + xs_dim "staying on classic." + return 0 + fi + + printf '\n' + xs_info "preview (dry run):" + (cd "$xh" && XS_DRY_RUN=1 bash "$xh/install.sh" --dry-run --profile modern) || return 0 + + printf '\n' + if xs_prompt_yn "switch to modern now?" "n"; then + printf '\n' + (cd "$xh" && bash "$xh/install.sh" --profile modern --force) + else + xs_dim "staying on classic." + fi } From b41855542e4ae6e73a6cee1efaa34b83fae5abee Mon Sep 17 00:00:00 2001 From: xydac Date: Sun, 12 Apr 2026 09:56:31 -0700 Subject: [PATCH 07/12] Simplify first-upgrade recipe Drop the submodule update step from the README upgrade instructions. No submodule refs change in this PR, so it would be a no-op for the first upgrade. For subsequent pulls that may bump submodules, 'x update' handles it in one step (and install.sh itself does submodule update for the classic profile). --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index f7608f4..5298ec1 100644 --- a/README.md +++ b/README.md @@ -27,7 +27,6 @@ appears on your `PATH` in new shells. cd ~/.xydacshell git stash # only if you've hand-edited tracked files git pull --rebase -git submodule update --init --recursive git stash pop # only if you stashed exec zsh # new shell picks up the x command @@ -38,6 +37,9 @@ x doctor # report + offer to switch to modern offers to dry-run and then apply a switch to the modern profile. Say no and nothing changes. +From then on, `x update` handles future pulls (git pull + submodules + reinstall) +in one step. + The installer is idempotent — running it twice is safe. After it finishes, open a new shell. The `x` command (and its `xydacshell` alias) is on your `PATH`. > **Heads-up on the name `x`:** the installer warns you if another `x` command already exists on your PATH (or via shell alias). Our `x` will take precedence in new shells. If you'd rather keep your existing `x`, use the `xydacshell` symlink instead — it's the same command. From 7f5889c28f0692c10505f874c5d3ac0a58bed41a Mon Sep 17 00:00:00 2001 From: xydac Date: Sun, 12 Apr 2026 10:01:46 -0700 Subject: [PATCH 08/12] Add VHS tape for demo gif vhs/demo.tape scripts a ~25s showcase: 'x' help, 'x storage --top 5' (the real win), 'x doctor --no-prompt'. Renders to vhs/demo.gif. Rendering requires 'brew install vhs' (or equivalent on other platforms). Chrome sandbox restrictions in some Linux environments prevent vhs from rendering there; run it on macOS or a box with working Chrome sandbox. README embeds vhs/demo.gif so the gif appears at top once committed after the first render. --- README.md | 2 ++ vhs/README.md | 23 +++++++++++++++++++ vhs/demo.tape | 61 +++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 86 insertions(+) create mode 100644 vhs/README.md create mode 100644 vhs/demo.tape diff --git a/README.md b/README.md index 5298ec1..b92651b 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,8 @@ An opinionated terminal setup. Two profiles, one managed toolchain, safe to re-run. +![demo](vhs/demo.gif) + - **classic** — oh-my-zsh with the `materialshell-electro` theme, amix/vimrc, and a handful of zsh plugins. The original xydacshell stack. - **modern** — starship prompt, Neovim with a small `init.lua`, and graceful use of fzf / zoxide / lsd / bat / ncdu / dust / duf when they're installed. diff --git a/vhs/README.md b/vhs/README.md new file mode 100644 index 0000000..8dfe72c --- /dev/null +++ b/vhs/README.md @@ -0,0 +1,23 @@ +# vhs/ + +Scripted terminal recordings built with [VHS](https://github.com/charmbracelet/vhs). + +## Render + +```bash +# install VHS once (macOS) +brew install vhs + +# render the demo to a gif +cd ~/.xydacshell # or wherever this repo lives +vhs vhs/demo.tape # outputs vhs/demo.gif + +# optional: render an mp4 alongside +vhs vhs/demo.tape --publish # or edit the tape to add Output demo.mp4 +``` + +The tape uses a real zsh instance and your actual `$HOME` to produce an honest demo. If you'd rather hide your home-dir contents, edit the `Setup` block in `demo.tape` to `cd /tmp` or set a different working dir first. + +## Tapes + +- `demo.tape` — ~25 s showcase: `x` help → `x storage --top 5` → `x doctor --no-prompt`. diff --git a/vhs/demo.tape b/vhs/demo.tape new file mode 100644 index 0000000..a0ad77a --- /dev/null +++ b/vhs/demo.tape @@ -0,0 +1,61 @@ +# xydacshell demo — rendered with https://github.com/charmbracelet/vhs +# +# Build: vhs vhs/demo.tape +# Output: vhs/demo.gif + +Output vhs/demo.gif + +Set Shell "zsh" +Set FontSize 14 +Set Width 1100 +Set Height 700 +Set Padding 22 +Set TypingSpeed 40ms +Set Theme "Catppuccin Mocha" + +# Setup: put $XYDACSHELL_HOME/bin on PATH so `x` resolves in this demo shell. +# Hidden from the recording — the viewer sees a clean terminal to start. +Hide +Type "export XYDACSHELL_HOME=$(pwd)" +Enter +Type "export PATH=$XYDACSHELL_HOME/bin:$PATH" +Enter +Type "clear" +Enter +Sleep 500ms +Show + +# Act 1: the command surface. +Type "# xydacshell — one command, short and sharp:" +Enter +Sleep 1200ms +Type "x" +Enter +Sleep 5s + +Type "clear" +Enter +Sleep 400ms + +# Act 2: the storage report — the real win. +Type "# where did all my disk go?" +Enter +Sleep 1200ms +Type "x storage --top 5" +Enter +Sleep 7s + +Type "clear" +Enter +Sleep 400ms + +# Act 3: doctor — self-diagnose + upgrade offer. +Type "# what's my install state?" +Enter +Sleep 1200ms +Type "x doctor --no-prompt" +Enter +Sleep 6s + +# Fade out. +Sleep 1s From e7a7d79cdf00a2c4a4d1b0fd6799d0a5825bafb5 Mon Sep 17 00:00:00 2001 From: xydac Date: Sun, 12 Apr 2026 10:27:28 -0700 Subject: [PATCH 09/12] Fix CI: silence shellcheck warnings, keep errors MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Two changes: 1. Add '# shellcheck shell=bash' directive to profiles/{classic,modern}/zshrc. These files are sourced by the dispatcher (no shebang); shellcheck refused to lint them without a shell hint (SC2148 error). 2. Set severity=error on the shellcheck action so the pipeline doesn't fail on stylistic notes/warnings — unused ZSH_THEME/plugins/SAVEHIST variables (oh-my-zsh and zsh read them implicitly, but shellcheck can't see that), SC1091 for sourced files at runtime paths, SC2086 quoting notes inside zsh idioms, etc. Real errors still fail the build. --- .github/workflows/ci.yml | 1 + profiles/classic/zshrc | 1 + profiles/modern/zshrc | 1 + 3 files changed, 3 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 13919f6..3a9790b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -14,6 +14,7 @@ jobs: - name: Run shellcheck uses: ludeeus/action-shellcheck@master with: + severity: error scandir: "./" ignore_paths: | oh-my-zsh diff --git a/profiles/classic/zshrc b/profiles/classic/zshrc index cd7af7b..df5287f 100644 --- a/profiles/classic/zshrc +++ b/profiles/classic/zshrc @@ -1,4 +1,5 @@ # xydacshell — classic profile +# shellcheck shell=bash # This file mirrors the original pre-upgrade zshrc, minus the trailing # `source ... zshrc.custom` (the dispatcher at the repo root handles that). # diff --git a/profiles/modern/zshrc b/profiles/modern/zshrc index d16da73..e07024e 100644 --- a/profiles/modern/zshrc +++ b/profiles/modern/zshrc @@ -1,4 +1,5 @@ # xydacshell — modern profile zshrc. +# shellcheck shell=bash # Starship prompt · plain zsh (no oh-my-zsh) · graceful fallbacks for optional tools. # # Do not edit this file directly. From 4438b02fbf1c8420fd3da81ee9b1ae3749cc3597 Mon Sep 17 00:00:00 2001 From: xydac Date: Sun, 12 Apr 2026 10:31:24 -0700 Subject: [PATCH 10/12] Add rendered demo gif MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ~25s showcase: 'x' help → 'x storage --top 5' → 'x doctor --no-prompt'. Rendered with asciinema + agg on Linux (vhs failed here due to Chrome sandbox restrictions). vhs/demo.tape stays as the canonical script for future rerenders; use 'brew install vhs && vhs vhs/demo.tape' on macOS to rebuild. --- vhs/demo.gif | Bin 0 -> 129042 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 vhs/demo.gif diff --git a/vhs/demo.gif b/vhs/demo.gif new file mode 100644 index 0000000000000000000000000000000000000000..ffd965f4c520c9325e016b9d70100255777ff19e GIT binary patch literal 129042 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≷DmNaQsQvZZM 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 Date: Sun, 12 Apr 2026 10:36:01 -0700 Subject: [PATCH 11/12] README: upgrade path as a single git one-liner Use 'git pull --rebase --autostash' (built in since git 2.9) so the upgrade flow compresses to one line and works whether or not the user has local changes: cd ~/.xydacshell && git pull --rebase --autostash && git submodule update --init --recursive && exec zsh Then 'x doctor' in the new shell. Removed the multi-step stash / pull / pop recipe and the half-written upgrade.sh helper. --- README.md | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index b92651b..d6417bf 100644 --- a/README.md +++ b/README.md @@ -25,22 +25,21 @@ dispatcher defaults to classic when no profile file is present, so your shell stays byte-for-byte the same. The only visible change is that the `x` command appears on your `PATH` in new shells. +One-liner: + ```bash -cd ~/.xydacshell -git stash # only if you've hand-edited tracked files -git pull --rebase -git stash pop # only if you stashed -exec zsh # new shell picks up the x command +cd ~/.xydacshell && git pull --rebase --autostash && git submodule update --init --recursive && exec zsh +``` -x doctor # report + offer to switch to modern +Then: + +```bash +x doctor ``` -`x doctor` detects that you're on classic, checks that the repo is clean, and -offers to dry-run and then apply a switch to the modern profile. Say no and -nothing changes. +`--autostash` stashes local hand-edits before the rebase and pops them after, so this works whether or not you have uncommitted changes. `x doctor` detects that you're on classic, checks that the repo is clean, and offers to dry-run and then apply a switch to the modern profile. Say no and nothing changes. -From then on, `x update` handles future pulls (git pull + submodules + reinstall) -in one step. +From then on, `x update` handles future pulls (git pull + submodules + reinstall) in one step. The installer is idempotent — running it twice is safe. After it finishes, open a new shell. The `x` command (and its `xydacshell` alias) is on your `PATH`. From d14980800d5cd4aab879f8241655442c1227120e Mon Sep 17 00:00:00 2001 From: xydac Date: Sun, 12 Apr 2026 10:39:12 -0700 Subject: [PATCH 12/12] Promote 'x' over 'xydacshell' in visible output MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The user-facing help and doctor output no longer lead with the word 'xydacshell'. The header reads 'x — your terminal setup, managed.', doctor's banner is 'x doctor', and the uninstall line refers to 'installation' instead of 'xydacshell'. A small footer line retains '(also available as xydacshell.)' for discoverability. The repo and project are still called xydacshell; only the interactive command-line surface favors 'x'. The xydacshell symlink still works. Re-renders vhs/demo.gif with the updated help output. --- bin/x | 7 +++---- lib/cmds/doctor.sh | 6 +++--- vhs/demo.gif | Bin 129042 -> 128080 bytes 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/bin/x b/bin/x index 88f002b..b0afe8d 100755 --- a/bin/x +++ b/bin/x @@ -18,7 +18,7 @@ fi usage() { cat <<'EOF' -x — xydacshell command. +x — your terminal setup, managed. usage: x [args] @@ -31,9 +31,7 @@ commands restore from a timestamped backup storage [--caches] [--top N] [--clean] disk usage report; --clean prompts to prune - uninstall remove xydacshell, restore legacy backups - -(xydacshell is a symlink to x; both work.) + uninstall remove installation, restore legacy backups global flags --dry-run preview (supported by install/update/switch/rollback/storage/uninstall) @@ -41,6 +39,7 @@ global flags --help, -h show this message or per-command help run 'x --help' for per-command help. +(also available as `xydacshell`.) EOF } diff --git a/lib/cmds/doctor.sh b/lib/cmds/doctor.sh index 3475ad3..4ea5002 100644 --- a/lib/cmds/doctor.sh +++ b/lib/cmds/doctor.sh @@ -28,8 +28,8 @@ EOF esac done - printf '\n%s\n' "xydacshell doctor" - printf '==================\n' + printf '\n%s\n' "x doctor" + printf '=========\n' # Paths. printf '\npaths\n' @@ -54,7 +54,7 @@ EOF if [ -L "$f" ]; then printf ' %-44s → %s\n' "$f" "$(readlink "$f")" elif [ -e "$f" ]; then - printf ' %-44s (regular file, not managed by xydacshell)\n' "$f" + printf ' %-44s (regular file, not managed by x)\n' "$f" fi done diff --git a/vhs/demo.gif b/vhs/demo.gif index ffd965f4c520c9325e016b9d70100255777ff19e..dd1f2d9a6181851729d58097f4eecd04e593284e 100644 GIT binary patch delta 46990 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 delta 48135 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 R&00Q~-5#z-O9x=g{{br=Z?pga