function cmd::rule::list() {
  local rules_dir
  rules_dir="$(ctx::rules)"

  local rules=("${rules_dir}"/*.rule)
  if [[ ! -f "${rules[0]}" ]]; then
    log::wg "No rules configured"
    return 0
  fi

  log::section "Firewall Rules"
  printf "\n  %-20s %-40s %-8s %-8s %s\n" \
    "NAME" "DESCRIPTION" "ALLOWS" "BLOCKS" "PEERS"
  printf "  %s\n" "$(printf '─%.0s' {1..88})"

  local printing_base=false
  local current_group=""

  while IFS="|" read -r name desc n_allows n_blocks peer_count extends is_base group; do
    [[ -z "$name" ]] && continue

    if [[ "$is_base" == "True" && "$printing_base" == "false" ]]; then
      printf "\n  \033[0;37m── Base Rules \033[0m%s\n" \
        "$(printf '─%.0s' {1..74})"
      printing_base=true
    fi

    # Group header
    if [[ "$group" != "$current_group" ]]; then
      if [[ -n "$current_group" ]]; then
        printf "  %s\n" "$(printf '─%.0s' {1..88})"  # close previous group
      fi
      if [[ -n "$group" ]]; then
        local gdashes
        gdashes=$(printf '─%.0s' {1..$((88 - ${#group} - 5))})
        printf "\n  \033[0;37m── %s \033[0m%s\n" "$group" "$gdashes"
      fi
      current_group="$group"
    fi

    local short_desc="${desc:0:35}"
    [[ ${#desc} -gt 35 ]] && short_desc="${short_desc}..."

    # Em-dash correction
    local desc_col_width=40
    [[ "${short_desc}" == "—" || -z "$short_desc" ]] && desc_col_width=42

    # Main rule line
    if [[ "$is_base" == "True" ]]; then
      printf "  %-20s %-${desc_col_width}s %-8s %-8s %s\n" \
        "$name" "${short_desc:-—}" "$n_allows" "$n_blocks" "${peer_count} peers"
    else
      printf "  %-20s %-40s %-8s %-8s %s\n" \
        "$name" "${short_desc:-—}" "$n_allows" "$n_blocks" "${peer_count} peers"
    fi

    # Extends — one per line, indented
    if [[ -n "$extends" ]]; then
      IFS=',' read -ra extend_list <<< "$extends"
      for base in "${extend_list[@]}"; do
        # printf "  %-20s \033[0;37m↳ %s\033[0m\n" "" "$base"
        printf "  \033[0;37m  ↳ %-16s\033[0m\n" "$base"
      done
    fi

  done < <(json::rule_list_data "$rules_dir" "$(ctx::meta)")

  printf "\n"
}