penguin/utils

my env utils

commit 3bf762b877edbc72cfeb6e352874e0e2a71dacf7

author斟酌 鵬兄 <tgckpg@gmail.com>
date2026-06-28T01:26:21Z
subjectChecksum rbash_load
commit 3bf762b877edbc72cfeb6e352874e0e2a71dacf7
Author: 斟酌 鵬兄 <tgckpg@gmail.com>
Date:   2026-06-28T01:26:21Z

    Checksum rbash_load
---
 bash/core/20_io.bash      | 123 +++++++++-------
 bash/core/30_loader.bash  |  64 ++++----
 bash/core/40_sources.bash | 166 +++++++++++----------
 bash/core/99_main.bash    |   3 +-
 bash/dist/rbashrc         | 363 +++++++++++++++++++++++++---------------------
 bash/dist/sources.list    |   1 -
 bash/sources/09_ssh-agent |  35 -----
 7 files changed, 396 insertions(+), 359 deletions(-)

diff --git a/bash/core/20_io.bash b/bash/core/20_io.bash
index 4d585dd..3d00abc 100755
--- a/bash/core/20_io.bash
+++ b/bash/core/20_io.bash
@@ -1,70 +1,89 @@
 rbash_url() {
-  local path="$1"
-  printf '%s/%s/raw/%s/%s/%s\n' \
-    "$RBASH_REMOTE" "$RBASH_REPO" "$RBASH_REF" "$RBASH_PATH" "$path"
+	local path="$1"
+	printf '%s/%s/raw/%s/%s/%s\n' \
+		"$RBASH_REMOTE" "$RBASH_REPO" "$RBASH_REF" "$RBASH_PATH" "$path"
 }
 
 rbash_download() {
-  local url="$1"
+	local url="$1"
 
-  if command -v curl >/dev/null 2>&1; then
-    curl -fsSL "$url" || {
-      local rc=$?
-      echo "rbash: download failed: $url" >&2
-      echo "rbash: curl exit code: $rc" >&2
-      return "$rc"
-    }
-  elif command -v wget >/dev/null 2>&1; then
-    wget -qO- "$url" || {
-      local rc=$?
-      echo "rbash: download failed: $url" >&2
-      echo "rbash: wget exit code: $rc" >&2
-      return "$rc"
-    }
-  else
-    echo "rbash: curl or wget is required" >&2
-    return 127
-  fi
+	if command -v curl >/dev/null 2>&1; then
+		curl -fsSL "$url" || {
+			local rc=$?
+			echo "rbash: download failed: $url" >&2
+			echo "rbash: curl exit code: $rc" >&2
+			return "$rc"
+		}
+	elif command -v wget >/dev/null 2>&1; then
+		wget -qO- "$url" || {
+			local rc=$?
+			echo "rbash: download failed: $url" >&2
+			echo "rbash: wget exit code: $rc" >&2
+			return "$rc"
+		}
+	else
+		echo "rbash: curl or wget is required" >&2
+		return 127
+	fi
+}
+
+function rbash_download_sig {
+	local _URL _LOC _SIG tmp
+
+	_SIG="$1"
+	_URL="$2"
+	_LOC="$3"
+
+	tmp=$( mktemp )
+	rbash_download "$_URL" > "$tmp"
+	sha256sum "$tmp" | grep -q "$_SIG"
+	if [ $? -eq 0 ]; then
+		mv "$tmp" "$_LOC"
+	else
+		echo "Download $_LOC: Signature mismatch" >&2
+		return 1
+	fi
 }
 
 rbash_cache() {
-  local url="$1"
-  local key file
+	local sig="$1"
+	local url="$2"
+	local key file
 
-  if [ -z "${RBASH_CACHE_DIR:-}" ]; then
-    echo "rbash: RBASH_CACHE_DIR is not set" >&2
-    return 1
-  fi
+	if [ -z "${RBASH_CACHE_DIR:-}" ]; then
+		echo "rbash: RBASH_CACHE_DIR is not set" >&2
+		return 1
+	fi
 
-  mkdir -p "$RBASH_CACHE_DIR" || {
-    echo "rbash: failed to create cache dir: $RBASH_CACHE_DIR" >&2
-    return 1
-  }
+	mkdir -p "$RBASH_CACHE_DIR" || {
+		echo "rbash: failed to create cache dir: $RBASH_CACHE_DIR" >&2
+		return 1
+	}
 
-  if command -v md5sum >/dev/null 2>&1; then
-    key="$(printf '%s' "$url" | md5sum | cut -d' ' -f1)"
-  else
-    key="$(printf '%s' "$url" | md5 | cut -d' ' -f1)"
-  fi
+	if command -v md5sum >/dev/null 2>&1; then
+		key="$(printf '%s' "$url" | md5sum | cut -d' ' -f1)"
+	else
+		key="$(printf '%s' "$url" | md5 | cut -d' ' -f1)"
+	fi
 
-  file="$RBASH_CACHE_DIR/$key"
+	file="$RBASH_CACHE_DIR/$key"
 
-  if [ ! -f "$file" ]; then
-    rbash_download "$url" > "$file" || {
-      local rc=$?
-      rm -f "$file"
-      echo "rbash: download failed: $url" >&2
-      return "$rc"
-    }
-    chmod 700 "$file"
-  fi
+	if [ ! -f "$file" ]; then
+		rbash_download_sig "$sig" "$url" "$file" || {
+			local rc=$?
+			rm -f "$file"
+			echo "rbash: download failed: $url" >&2
+			return "$rc"
+		}
+		chmod 700 "$file"
+	fi
 
-  printf '%s\n' "$file"
+	printf '%s\n' "$file"
 }
 
 _require_jq() {
-  if ! command -v jq >/dev/null 2>&1; then
-    echo "This command requires jq." >&2
-    return 1
-  fi
+	if ! command -v jq >/dev/null 2>&1; then
+		echo "This command requires jq." >&2
+		return 1
+	fi
 }
diff --git a/bash/core/30_loader.bash b/bash/core/30_loader.bash
index 3859090..a5f15b4 100755
--- a/bash/core/30_loader.bash
+++ b/bash/core/30_loader.bash
@@ -38,37 +38,39 @@ __rbash_autoload() {
 }
 
 rbash_load() {
-  local rel="$1"
-  local url file
-
-  # Normal startup should not individually fetch sources.
-  # It should source RBASH_MERGED via __rbash_autoload.
-  if [ -z "${_RBASH_MERGE_START:-}" ]; then
-    __rbash_autoload
-    return 0
-  fi
-
-  echo "Load: $rel"
-
-  url="$(rbash_url "$rel")"
-  file="$(rbash_cache "$url")" || {
-    echo "    ..download failed" >&2
-    return 1
-  }
-
-  # shellcheck source=/dev/null
-  if source "$file"; then
-    {
-      printf 'echo "Load: %s"\n' "$rel"
-      cat "$file"
-      printf '\n'
-    } >> "$RBASH_MERGED"
-  else
-    echo "    ..failed" >&2
-    printf 'echo "Skipped: %s. Use rbash-reload to try again."\n' "$rel" >> "$RBASH_MERGED"
-  fi
-
-  chmod 700 "$RBASH_MERGED"
+	local rel="$1"
+	local url file
+
+	# Normal startup should not individually fetch sources.
+	# It should source RBASH_MERGED via __rbash_autoload.
+	if [ -z "${_RBASH_MERGE_START:-}" ]; then
+		__rbash_autoload
+		return 0
+	fi
+
+	echo "Load: $rel"
+
+	url="$(rbash_url "$rel")"
+	key="$(printf '%s' "$rel" | sed "s|^sources/||g" | grep -o '^[0-9]\+' || true)"
+	sig="${_RBASH_SOURCES_SUM["s$key"]}"
+	file="$(rbash_cache "$sig" "$url")" || {
+		echo "    ..download failed" >&2
+		return 1
+	}
+
+	# shellcheck source=/dev/null
+	if source "$file"; then
+		{
+			printf 'echo "Load: %s"\n' "$rel"
+			cat "$file"
+			printf '\n'
+		} >> "$RBASH_MERGED"
+	else
+		echo "    ..failed" >&2
+		printf 'echo "Skipped: %s. Use rbash-reload to try again."\n' "$rel" >> "$RBASH_MERGED"
+	fi
+
+	chmod 700 "$RBASH_MERGED"
 }
 
 rbash-run() {
diff --git a/bash/core/40_sources.bash b/bash/core/40_sources.bash
index 8ce1c21..03585b2 100755
--- a/bash/core/40_sources.bash
+++ b/bash/core/40_sources.bash
@@ -1,103 +1,117 @@
-rbash_sources_json_url() {
-  printf '%s/%s/tree/%s/tree.json\n' \
-    "$RBASH_REMOTE" "$RBASH_REPO" "$RBASH_REF"
+rbash_sources_list() {
+  printf '%s/%s/raw/master/bash/dist/sources.list\n' \
+    "$RBASH_REMOTE" "$RBASH_REPO"
 }
 
 declare -gA _RBASH_DICT
+declare -gA _RBASH_SOURCES_SUM
+
+rbash_sources_load() {
+	local hash path item key sources_list
+
+	_RBASH_DICT=()
+	_RBASH_SOURCES_SUM=()
+
+	sources_list=$(rbash_cache "$RBASH_SOURCES_SUM" "$(rbash_sources_list)" "sources.list")
+
+	while read -r hash path; do
+		[ -n "$hash" ] || continue
+		[ -n "$path" ] || continue
+
+		item="${path#sources/}"
+
+		key="$(printf '%s' "$item" | grep -o '^[0-9]\+' || true)"
+		[ -n "$key" ] || continue
+
+		_RBASH_DICT["s$key"]="$item"
+		_RBASH_SOURCES_SUM["s$key"]="$hash"
+	done < "$sources_list"
+}
 
 rbash-list() {
-  _require_jq || return 1
-
-  local item key enabled_marker
-  echo "Available sources:"
-
-  while IFS= read -r item; do
-    key="$(printf '%s' "$item" | grep -o '^[0-9]\+' || true)"
-    [ -n "$key" ] && _RBASH_DICT["s$key"]="$item"
-
-    enabled_marker=" "
-    if grep -q -F "rbash_load \"sources/$item\"" "$RBASH_CONFIG"; then
-      enabled_marker="*"
-    fi
-
-    printf '  %s %s\n' "$enabled_marker" "$item"
-  done < <(
-    rbash_download "$(rbash_sources_json_url)" |
-      jq -r '
-        .[]
-        | select(.path == "bash/sources" or (.path | startswith("bash/sources/")))
-        | .path
-        | sub("^bash/sources/?"; "")
-        | select(length > 0)
-      '
-  )
+	local key item enabled_marker
+
+	rbash_sources_load || return 1
+
+	echo "Available sources:"
+
+	while IFS= read -r key; do
+		item="${_RBASH_DICT[$key]}"
+
+		enabled_marker=" "
+		if grep -q -F "rbash_load \"sources/$item\"" "$RBASH_CONFIG"; then
+			enabled_marker="*"
+		fi
+
+		printf '  %s %s\n' "$enabled_marker" "$item"
+	done < <(printf '%s\n' "${!_RBASH_DICT[@]}" | sort -V)
 }
 
 r2ensource() {
-  rbash-list || return 1
+	rbash-list || return 1
 
-  local ids id selected tmp
-  local -a enable=()
+	local ids id selected tmp
+	local -a enable=()
 
-  read -r -p "Enter the script id XX, delimited by space: " ids
+	read -r -p "Enter the script id XX, delimited by space: " ids
 
-  for id in $ids; do
-    selected="${_RBASH_DICT["s$id"]}"
+	for id in $ids; do
+		selected="${_RBASH_DICT["s$id"]}"
 
-    if [ -z "$selected" ]; then
-      echo "No such id: $id" >&2
-      return 1
-    fi
+		if [ -z "$selected" ]; then
+			echo "No such id: $id" >&2
+			return 1
+		fi
 
-    if grep -q -F "rbash_load \"sources/$selected\"" "$RBASH_CONFIG"; then
-      echo "$selected is already enabled."
-      continue
-    fi
+		if grep -q -F "rbash_load \"sources/$selected\"" "$RBASH_CONFIG"; then
+			echo "$selected is already enabled."
+			continue
+		fi
 
-    enable+=("$selected")
-  done
+		enable+=("$selected")
+	done
 
-  tmp="$(mktemp)"
-  cp "$RBASH_CONFIG" "$tmp"
+	tmp="$(mktemp)"
+	cp "$RBASH_CONFIG" "$tmp"
 
-  for selected in "${enable[@]}"; do
-    echo "rbash_load \"sources/$selected\"" >> "$tmp"
-    echo "Enabling $selected"
-  done
+	for selected in "${enable[@]}"; do
+		echo "rbash_load \"sources/$selected\"" >> "$tmp"
+		echo "Enabling $selected"
+	done
 
-  sort -u "$tmp" > "$RBASH_CONFIG"
-  rm -f "$tmp"
-  rm -rf "$RBASH_CACHE_DIR"
+	sort -u "$tmp" > "$RBASH_CONFIG"
+	rm -f "$tmp"
+	rm -rf "$RBASH_CACHE_DIR"
 }
 
 r2dissource() {
-  local ids id tmp pattern
+	local ids id tmp pattern
 
-  echo "Currently enabled sources:"
-  grep -E '^rbash_load "sources/' "$RBASH_CONFIG" |
-    sed 's/^rbash_load "sources\///; s/"$//' |
-    sed 's/^/    /'
+	echo "Currently enabled sources:"
+	grep -E '^rbash_load "sources/' "$RBASH_CONFIG" |
+		sed 's/^rbash_load "sources\///; s/"$//' |
+		sed 's/^/		/'
 
-  read -r -p "Enter the script id XX, delimited by space: " ids
+	read -r -p "Enter the script id XX, delimited by space: " ids
 
-  tmp="$(mktemp)"
-  cp "$RBASH_CONFIG" "$tmp"
+	tmp="$(mktemp)"
+	cp "$RBASH_CONFIG" "$tmp"
 
-  for id in $ids; do
-    pattern="rbash_load \"sources/${id}_"
+	for id in $ids; do
+		pattern="rbash_load \"sources/${id}_"
 
-    if ! grep -q -F "$pattern" "$tmp"; then
-      echo "No such id: $id" >&2
-      rm -f "$tmp"
-      return 1
-    fi
+		if ! grep -q -F "$pattern" "$tmp"; then
+			echo "No such id: $id" >&2
+			rm -f "$tmp"
+			return 1
+		fi
 
-    echo "Disabling $id"
-    grep -v -F "$pattern" "$tmp" > "$tmp.next"
-    mv "$tmp.next" "$tmp"
-  done
+		echo "Disabling $id"
+		grep -v -F "$pattern" "$tmp" > "$tmp.next"
+		mv "$tmp.next" "$tmp"
+	done
 
-  sort -u "$tmp" > "$RBASH_CONFIG"
-  rm -f "$tmp"
-  rm -rf "$RBASH_CACHE_DIR"
-}
\ No newline at end of file
+	sort -u "$tmp" > "$RBASH_CONFIG"
+	rm -f "$tmp"
+	rm -rf "$RBASH_CACHE_DIR"
+}
diff --git a/bash/core/99_main.bash b/bash/core/99_main.bash
index 112b8fc..a72a4e9 100644
--- a/bash/core/99_main.bash
+++ b/bash/core/99_main.bash
@@ -8,9 +8,10 @@ __rbash_main() {
     source "$RBASH_ENV"
   fi
 
+  rbash_sources_load
   __rbash_autoload
   __rbash_setup_prompt
 }
 
 __rbash_main
-unset -f __rbash_main
\ No newline at end of file
+unset -f __rbash_main
diff --git a/bash/dist/rbashrc b/bash/dist/rbashrc
index 3a6d25a..8d6061e 100755
--- a/bash/dist/rbashrc
+++ b/bash/dist/rbashrc
@@ -18,7 +18,7 @@ RBASH_CONFIG="$RBASH_HOME/config"
 RBASH_ENV="$RBASH_HOME/env"
 RBASH_MERGED="$RBASH_CACHE_DIR/merged"
 RBASH_BIN="$RBASH_HOME/bin"
-RBASH_SOURCES_SUM="341fa76e725056b648a8ef9f42b5c969bd6a69f6908b5a2409b5fae14035bd58"
+RBASH_SOURCES_SUM="073b8c3e23fe1a4bc0d479cab97877357e56df00efd9371008613e6aff8f40df"
 
 
 # ---- rbash: bash/core/00_env.bash ----
@@ -104,74 +104,93 @@ __func_help() {
 # ---- rbash: bash/core/20_io.bash ----
 
 rbash_url() {
-  local path="$1"
-  printf '%s/%s/raw/%s/%s/%s\n' \
-    "$RBASH_REMOTE" "$RBASH_REPO" "$RBASH_REF" "$RBASH_PATH" "$path"
+	local path="$1"
+	printf '%s/%s/raw/%s/%s/%s\n' \
+		"$RBASH_REMOTE" "$RBASH_REPO" "$RBASH_REF" "$RBASH_PATH" "$path"
 }
 
 rbash_download() {
-  local url="$1"
-
-  if command -v curl >/dev/null 2>&1; then
-    curl -fsSL "$url" || {
-      local rc=$?
-      echo "rbash: download failed: $url" >&2
-      echo "rbash: curl exit code: $rc" >&2
-      return "$rc"
-    }
-  elif command -v wget >/dev/null 2>&1; then
-    wget -qO- "$url" || {
-      local rc=$?
-      echo "rbash: download failed: $url" >&2
-      echo "rbash: wget exit code: $rc" >&2
-      return "$rc"
-    }
-  else
-    echo "rbash: curl or wget is required" >&2
-    return 127
-  fi
+	local url="$1"
+
+	if command -v curl >/dev/null 2>&1; then
+		curl -fsSL "$url" || {
+			local rc=$?
+			echo "rbash: download failed: $url" >&2
+			echo "rbash: curl exit code: $rc" >&2
+			return "$rc"
+		}
+	elif command -v wget >/dev/null 2>&1; then
+		wget -qO- "$url" || {
+			local rc=$?
+			echo "rbash: download failed: $url" >&2
+			echo "rbash: wget exit code: $rc" >&2
+			return "$rc"
+		}
+	else
+		echo "rbash: curl or wget is required" >&2
+		return 127
+	fi
 }
 
-rbash_cache() {
-  local url="$1"
-  local key file
-
-  if [ -z "${RBASH_CACHE_DIR:-}" ]; then
-    echo "rbash: RBASH_CACHE_DIR is not set" >&2
-    return 1
-  fi
-
-  mkdir -p "$RBASH_CACHE_DIR" || {
-    echo "rbash: failed to create cache dir: $RBASH_CACHE_DIR" >&2
-    return 1
-  }
-
-  if command -v md5sum >/dev/null 2>&1; then
-    key="$(printf '%s' "$url" | md5sum | cut -d' ' -f1)"
-  else
-    key="$(printf '%s' "$url" | md5 | cut -d' ' -f1)"
-  fi
-
-  file="$RBASH_CACHE_DIR/$key"
-
-  if [ ! -f "$file" ]; then
-    rbash_download "$url" > "$file" || {
-      local rc=$?
-      rm -f "$file"
-      echo "rbash: download failed: $url" >&2
-      return "$rc"
-    }
-    chmod 700 "$file"
-  fi
+function rbash_download_sig {
+	local _URL _LOC _SIG tmp
+
+	_SIG="$1"
+	_URL="$2"
+	_LOC="$3"
+
+	tmp=$( mktemp )
+	rbash_download "$_URL" > "$tmp"
+	sha256sum "$tmp" | grep -q "$_SIG"
+	if [ $? -eq 0 ]; then
+		mv "$tmp" "$_LOC"
+	else
+		echo "Download $_LOC: Signature mismatch" >&2
+		return 1
+	fi
+}
 
-  printf '%s\n' "$file"
+rbash_cache() {
+	local sig="$1"
+	local url="$2"
+	local key file
+
+	if [ -z "${RBASH_CACHE_DIR:-}" ]; then
+		echo "rbash: RBASH_CACHE_DIR is not set" >&2
+		return 1
+	fi
+
+	mkdir -p "$RBASH_CACHE_DIR" || {
+		echo "rbash: failed to create cache dir: $RBASH_CACHE_DIR" >&2
+		return 1
+	}
+
+	if command -v md5sum >/dev/null 2>&1; then
+		key="$(printf '%s' "$url" | md5sum | cut -d' ' -f1)"
+	else
+		key="$(printf '%s' "$url" | md5 | cut -d' ' -f1)"
+	fi
+
+	file="$RBASH_CACHE_DIR/$key"
+
+	if [ ! -f "$file" ]; then
+		rbash_download_sig "$sig" "$url" "$file" || {
+			local rc=$?
+			rm -f "$file"
+			echo "rbash: download failed: $url" >&2
+			return "$rc"
+		}
+		chmod 700 "$file"
+	fi
+
+	printf '%s\n' "$file"
 }
 
 _require_jq() {
-  if ! command -v jq >/dev/null 2>&1; then
-    echo "This command requires jq." >&2
-    return 1
-  fi
+	if ! command -v jq >/dev/null 2>&1; then
+		echo "This command requires jq." >&2
+		return 1
+	fi
 }
 
 
@@ -217,37 +236,39 @@ __rbash_autoload() {
 }
 
 rbash_load() {
-  local rel="$1"
-  local url file
-
-  # Normal startup should not individually fetch sources.
-  # It should source RBASH_MERGED via __rbash_autoload.
-  if [ -z "${_RBASH_MERGE_START:-}" ]; then
-    __rbash_autoload
-    return 0
-  fi
-
-  echo "Load: $rel"
-
-  url="$(rbash_url "$rel")"
-  file="$(rbash_cache "$url")" || {
-    echo "    ..download failed" >&2
-    return 1
-  }
-
-  # shellcheck source=/dev/null
-  if source "$file"; then
-    {
-      printf 'echo "Load: %s"\n' "$rel"
-      cat "$file"
-      printf '\n'
-    } >> "$RBASH_MERGED"
-  else
-    echo "    ..failed" >&2
-    printf 'echo "Skipped: %s. Use rbash-reload to try again."\n' "$rel" >> "$RBASH_MERGED"
-  fi
-
-  chmod 700 "$RBASH_MERGED"
+	local rel="$1"
+	local url file
+
+	# Normal startup should not individually fetch sources.
+	# It should source RBASH_MERGED via __rbash_autoload.
+	if [ -z "${_RBASH_MERGE_START:-}" ]; then
+		__rbash_autoload
+		return 0
+	fi
+
+	echo "Load: $rel"
+
+	url="$(rbash_url "$rel")"
+	key="$(printf '%s' "$rel" | sed "s|^sources/||g" | grep -o '^[0-9]\+' || true)"
+	sig="${_RBASH_SOURCES_SUM["s$key"]}"
+	file="$(rbash_cache "$sig" "$url")" || {
+		echo "    ..download failed" >&2
+		return 1
+	}
+
+	# shellcheck source=/dev/null
+	if source "$file"; then
+		{
+			printf 'echo "Load: %s"\n' "$rel"
+			cat "$file"
+			printf '\n'
+		} >> "$RBASH_MERGED"
+	else
+		echo "    ..failed" >&2
+		printf 'echo "Skipped: %s. Use rbash-reload to try again."\n' "$rel" >> "$RBASH_MERGED"
+	fi
+
+	chmod 700 "$RBASH_MERGED"
 }
 
 rbash-run() {
@@ -265,110 +286,125 @@ rbash-run() {
 
 # ---- rbash: bash/core/40_sources.bash ----
 
-rbash_sources_json_url() {
-  printf '%s/%s/tree/%s/tree.json\n' \
-    "$RBASH_REMOTE" "$RBASH_REPO" "$RBASH_REF"
+rbash_sources_list() {
+  printf '%s/%s/raw/master/bash/dist/sources.list\n' \
+    "$RBASH_REMOTE" "$RBASH_REPO"
 }
 
 declare -gA _RBASH_DICT
+declare -gA _RBASH_SOURCES_SUM
+
+rbash_sources_load() {
+	local hash path item key sources_list
+
+	_RBASH_DICT=()
+	_RBASH_SOURCES_SUM=()
+
+	sources_list=$(rbash_cache "$RBASH_SOURCES_SUM" "$(rbash_sources_list)" "sources.list")
+
+	while read -r hash path; do
+		[ -n "$hash" ] || continue
+		[ -n "$path" ] || continue
+
+		item="${path#sources/}"
+
+		key="$(printf '%s' "$item" | grep -o '^[0-9]\+' || true)"
+		[ -n "$key" ] || continue
+
+		_RBASH_DICT["s$key"]="$item"
+		_RBASH_SOURCES_SUM["s$key"]="$hash"
+	done < "$sources_list"
+}
 
 rbash-list() {
-  _require_jq || return 1
+	local key item enabled_marker
 
-  local item key enabled_marker
-  echo "Available sources:"
+	rbash_sources_load || return 1
 
-  while IFS= read -r item; do
-    key="$(printf '%s' "$item" | grep -o '^[0-9]\+' || true)"
-    [ -n "$key" ] && _RBASH_DICT["s$key"]="$item"
+	echo "Available sources:"
 
-    enabled_marker=" "
-    if grep -q -F "rbash_load \"sources/$item\"" "$RBASH_CONFIG"; then
-      enabled_marker="*"
-    fi
+	while IFS= read -r key; do
+		item="${_RBASH_DICT[$key]}"
+
+		enabled_marker=" "
+		if grep -q -F "rbash_load \"sources/$item\"" "$RBASH_CONFIG"; then
+			enabled_marker="*"
+		fi
 
-    printf '  %s %s\n' "$enabled_marker" "$item"
-  done < <(
-    rbash_download "$(rbash_sources_json_url)" |
-      jq -r '
-        .[]
-        | select(.path == "bash/sources" or (.path | startswith("bash/sources/")))
-        | .path
-        | sub("^bash/sources/?"; "")
-        | select(length > 0)
-      '
-  )
+		printf '  %s %s\n' "$enabled_marker" "$item"
+	done < <(printf '%s\n' "${!_RBASH_DICT[@]}" | sort -V)
 }
 
 r2ensource() {
-  rbash-list || return 1
+	rbash-list || return 1
 
-  local ids id selected tmp
-  local -a enable=()
+	local ids id selected tmp
+	local -a enable=()
 
-  read -r -p "Enter the script id XX, delimited by space: " ids
+	read -r -p "Enter the script id XX, delimited by space: " ids
 
-  for id in $ids; do
-    selected="${_RBASH_DICT["s$id"]}"
+	for id in $ids; do
+		selected="${_RBASH_DICT["s$id"]}"
 
-    if [ -z "$selected" ]; then
-      echo "No such id: $id" >&2
-      return 1
-    fi
+		if [ -z "$selected" ]; then
+			echo "No such id: $id" >&2
+			return 1
+		fi
 
-    if grep -q -F "rbash_load \"sources/$selected\"" "$RBASH_CONFIG"; then
-      echo "$selected is already enabled."
-      continue
-    fi
+		if grep -q -F "rbash_load \"sources/$selected\"" "$RBASH_CONFIG"; then
+			echo "$selected is already enabled."
+			continue
+		fi
 
-    enable+=("$selected")
-  done
+		enable+=("$selected")
+	done
 
-  tmp="$(mktemp)"
-  cp "$RBASH_CONFIG" "$tmp"
+	tmp="$(mktemp)"
+	cp "$RBASH_CONFIG" "$tmp"
 
-  for selected in "${enable[@]}"; do
-    echo "rbash_load \"sources/$selected\"" >> "$tmp"
-    echo "Enabling $selected"
-  done
+	for selected in "${enable[@]}"; do
+		echo "rbash_load \"sources/$selected\"" >> "$tmp"
+		echo "Enabling $selected"
+	done
 
-  sort -u "$tmp" > "$RBASH_CONFIG"
-  rm -f "$tmp"
-  rm -rf "$RBASH_CACHE_DIR"
+	sort -u "$tmp" > "$RBASH_CONFIG"
+	rm -f "$tmp"
+	rm -rf "$RBASH_CACHE_DIR"
 }
 
 r2dissource() {
-  local ids id tmp pattern
+	local ids id tmp pattern
 
-  echo "Currently enabled sources:"
-  grep -E '^rbash_load "sources/' "$RBASH_CONFIG" |
-    sed 's/^rbash_load "sources\///; s/"$//' |
-    sed 's/^/    /'
+	echo "Currently enabled sources:"
+	grep -E '^rbash_load "sources/' "$RBASH_CONFIG" |
+		sed 's/^rbash_load "sources\///; s/"$//' |
+		sed 's/^/		/'
 
-  read -r -p "Enter the script id XX, delimited by space: " ids
+	read -r -p "Enter the script id XX, delimited by space: " ids
 
-  tmp="$(mktemp)"
-  cp "$RBASH_CONFIG" "$tmp"
+	tmp="$(mktemp)"
+	cp "$RBASH_CONFIG" "$tmp"
 
-  for id in $ids; do
-    pattern="rbash_load \"sources/${id}_"
+	for id in $ids; do
+		pattern="rbash_load \"sources/${id}_"
 
-    if ! grep -q -F "$pattern" "$tmp"; then
-      echo "No such id: $id" >&2
-      rm -f "$tmp"
-      return 1
-    fi
+		if ! grep -q -F "$pattern" "$tmp"; then
+			echo "No such id: $id" >&2
+			rm -f "$tmp"
+			return 1
+		fi
 
-    echo "Disabling $id"
-    grep -v -F "$pattern" "$tmp" > "$tmp.next"
-    mv "$tmp.next" "$tmp"
-  done
+		echo "Disabling $id"
+		grep -v -F "$pattern" "$tmp" > "$tmp.next"
+		mv "$tmp.next" "$tmp"
+	done
 
-  sort -u "$tmp" > "$RBASH_CONFIG"
-  rm -f "$tmp"
-  rm -rf "$RBASH_CACHE_DIR"
+	sort -u "$tmp" > "$RBASH_CONFIG"
+	rm -f "$tmp"
+	rm -rf "$RBASH_CACHE_DIR"
 }
 
+
 # ---- rbash: bash/core/50_upgrade.bash ----
 
 rbash-upgrade() {
@@ -495,9 +531,10 @@ __rbash_main() {
     source "$RBASH_ENV"
   fi
 
+  rbash_sources_load
   __rbash_autoload
   __rbash_setup_prompt
 }
 
 __rbash_main
-unset -f __rbash_main
\ No newline at end of file
+unset -f __rbash_main
diff --git a/bash/dist/sources.list b/bash/dist/sources.list
index aaa53ad..0e0d282 100644
--- a/bash/dist/sources.list
+++ b/bash/dist/sources.list
@@ -1,4 +1,3 @@
-02f2e97343c190295dd83d6a58fa6f5c17ee54a7df0fc71dc328bc2d267fccdf  sources/09_ssh-agent
 c4b84e73ff9c54631cb24131082e0c15eb53b6fbff47429a0a24aea65c002c52  sources/10_aliases
 e50644286373408263ce5a6f455bf967585a767cce055e67423bd33fdafeab9f  sources/12_shortcuts
 043a103f7602304732b37c8219ba4f74bc8af37278fc6d2f63d642ef9a29a6fe  sources/13_shortcuts_macos
diff --git a/bash/sources/09_ssh-agent b/bash/sources/09_ssh-agent
deleted file mode 100755
index 440f103..0000000
--- a/bash/sources/09_ssh-agent
+++ /dev/null
@@ -1,35 +0,0 @@
-#!/bin/bash
-
-# ssh-agent key lifetime
-alias ssh-add="ssh-add -t 43200"
-
-SSH_ENV="$HOME/.ssh/environment"
-
-function start_agent {
-    echo "Initialising new SSH agent..."
-    /usr/bin/ssh-agent | sed 's/^echo/#echo/' > "${SSH_ENV}"
-    echo succeeded
-    chmod 600 "${SSH_ENV}"
-    . "${SSH_ENV}" > /dev/null
-
-    # Test the ssh-add if status return 0/1, agent is initialized
-    /usr/bin/ssh-add;
-    ST=$?
-    if [ $ST -ne 0 ] && [ $ST -ne 1 ]; then
-        return $ST
-    fi
-
-    return 0
-}
-
-# Source SSH settings, if applicable
-
-if [ -f "${SSH_ENV}" ]; then
-    . "${SSH_ENV}" > /dev/null
-    #ps ${SSH_AGENT_PID} doesn't work under cywgin
-    ps -ef | grep ${SSH_AGENT_PID} | grep ssh-agent$ > /dev/null || {
-        start_agent;
-    }
-else
-    start_agent;
-fi