#!/usr/bin/env bash
#
# install.sh — dgate CLI 正式版安装入口（零依赖，仅需 curl/wget + bash）。
#
# 一键安装（线上 prod）:
#   curl -fsSL <OSS>/dgate/install.sh | bash
# 控制台一键安装（install_token 兑换凭证 + Agent 身份）:
#   curl -fsSL <OSS>/dgate/install.sh | bash -s -- \
#     --install-token dit_xxxxxxxx \
#     --region cn-hangzhou --install-ide cursor,codex
# 预发 beta 版请使用 install-beta.sh
#
# 安装目录：优先选用已在 PATH 中且可写的目录（偏好 ~/.local/bin、~/bin）；
#           无法解析 PATH 时回退 ~/bin。也可用 --prefix / DGATE_INSTALL_DIR 覆盖。
# quickstart：真实终端（/dev/tty）走交互式；Agent/CI 环境走 --yes 非交互。
#
set -euo pipefail

DEFAULT_BASE_URL="https://dg-agent-cn-hangzhou.oss-cn-hangzhou.aliyuncs.com/dgate"
CHANNEL="prd"

REGION="${DGATE_REGION:-}"
ACCESS_TOKEN="${DGATE_ACCESS_TOKEN:-}"
INSTALL_TOKEN="${DGATE_INSTALL_TOKEN:-}"
VERSION="${DGATE_VERSION:-}"
PREFIX="${DGATE_INSTALL_DIR:-}"
DATA_HOME="${DGATE_HOME:-$HOME/.dgate}"
BASE_URL="${DGATE_BASE_URL:-$DEFAULT_BASE_URL}"
SKIP_COMPLETION="${DGATE_SKIP_COMPLETION:-}"
SKIP_QUICKSTART="${DGATE_SKIP_QUICKSTART:-}"
INSTALL_IDE="${DGATE_INSTALL_IDE:-}"
CREDENTIAL_OK=0
QUICKSTART_OK=0
COMPLETION_ATTEMPTED=0
COMPLETION_OK=0
COMPLETION_EXIT=0
SECURITY_HINT_SHOWN=0
PREFIX_WAS_ON_PATH=0
PATH_PERSISTED=0
PATH_RC_FILE=""
PATH_RC_HINT=""

while [[ $# -gt 0 ]]; do
  case "$1" in
    --region)          REGION="$2"; shift 2 ;;
    --access-token)    ACCESS_TOKEN="$2"; shift 2 ;;
    --install-token)   INSTALL_TOKEN="$2"; shift 2 ;;
    --version)         VERSION="$2"; shift 2 ;;
    --prefix)          PREFIX="$2"; shift 2 ;;
    --home)            DATA_HOME="$2"; shift 2 ;;
    --base-url)        BASE_URL="$2"; shift 2 ;;
    --skip-completion) SKIP_COMPLETION=1; shift ;;
    --skip-quickstart) SKIP_QUICKSTART=1; shift ;;
    --install-ide)
      if [[ $# -lt 2 || -z "${2:-}" ]]; then
        echo "错误: --install-ide 需要指定目标（如 cursor 或 cursor,codex）" >&2
        exit 2
      fi
      INSTALL_IDE="$2"
      shift 2
      ;;
    --channel|--env)   echo "install.sh 为正式版安装脚本，不支持 --channel/--env；预发请用 install-beta.sh"; exit 2 ;;
    -h|--help) sed -n '2,16p' "$0"; exit 0 ;;
    *) echo "未知参数: $1"; exit 2 ;;
  esac
done

INSTALL_IDE="${INSTALL_IDE:-}"

if [[ -n "$ACCESS_TOKEN" && -n "$INSTALL_TOKEN" ]]; then
  echo "不能同时指定 --access-token 与 --install-token"; exit 2
fi

BASE_URL="${BASE_URL%/}"

normalize_install_ide() {
  local raw="$1"
  local item out=""
  local IFS=','
  for item in $raw; do
    item="$(echo "$item" | tr '[:upper:]' '[:lower:]' | sed 's/^[[:space:]]*//;s/[[:space:]]*$//')"
    [[ -z "$item" ]] && continue
    case "$item" in
      cc) item=claude ;;
    esac
    case "$item" in
      cursor|codex|qoder|qoderwork|claude|copaw|codebuddy|opencode) ;;
      *) echo "install-ide 不支持: $item（支持 cursor,codex,qoder,qoderwork,claude/cc,copaw,codebuddy,opencode）" >&2; exit 2 ;;
    esac
    out="${out:+$out,}$item"
  done
  echo "$out"
}
if [[ -n "$INSTALL_IDE" ]]; then
  INSTALL_IDE="$(normalize_install_ide "$INSTALL_IDE")"
fi

# --- 安装目录：按 PATH 智能选择 ---
expand_home() {
  case "$1" in
    ~|"~/"*) echo "$HOME${1#\~}" ;;
    *) echo "$1" ;;
  esac
}

norm_path() {
  local p
  p="$(expand_home "$1")"
  p="${p%/}"
  [[ -n "$p" ]] || return 1
  if command -v python3 >/dev/null 2>&1; then
    python3 -c 'import os,sys; print(os.path.normpath(os.path.expanduser(sys.argv[1])))' "$p" 2>/dev/null || echo "$p"
  else
    echo "$p"
  fi
}

path_contains() {
  local needle="$1" entry
  local IFS=':'
  for entry in $PATH; do
    [[ -z "$entry" || "$entry" == "." ]] && continue
    entry="$(norm_path "$entry" 2>/dev/null || echo "$entry")"
    [[ "$entry" == "$needle" ]] && return 0
  done
  return 1
}

can_install_to() {
  local d="$1"
  [[ -n "$d" && "$d" != "/" && "$d" != "." ]] || return 1
  if [[ -d "$d" ]]; then
    [[ -w "$d" ]]
    return $?
  fi
  local parent
  parent="$(dirname "$d")"
  [[ -d "$parent" && -w "$parent" ]] && return 0
  # 允许在 $HOME 下创建常见用户 bin
  case "$d" in
    "$HOME"/*) [[ -w "$HOME" ]] ;;
    *) return 1 ;;
  esac
}

resolve_install_prefix() {
  local fallback="$HOME/bin"
  local preferred=("$HOME/.local/bin" "$HOME/bin")
  local dig candidate entry

  if [[ -z "${PATH:-}" ]]; then
    echo "$fallback"
    return
  fi

  for candidate in "${preferred[@]}"; do
    dig="$(norm_path "$candidate")"
    if path_contains "$dig" && can_install_to "$dig"; then
      echo "$dig"
      return
    fi
  done

  # PATH 中其它可写目录：优先 $HOME 下
  local home_hit="" other_hit=""
  local IFS=':'
  for entry in $PATH; do
    [[ -z "$entry" || "$entry" == "." ]] && continue
    dig="$(norm_path "$entry" 2>/dev/null || true)"
    [[ -n "$dig" ]] || continue
    can_install_to "$dig" || continue
    case "$dig" in
      "$HOME"/*)
        [[ -z "$home_hit" ]] && home_hit="$dig"
        ;;
      *)
        # 跳过典型系统只读/风险路径即使用户偶发可写
        case "$dig" in
          /bin|/sbin|/usr/bin|/usr/sbin|/usr/local/sbin) continue ;;
        esac
        [[ -z "$other_hit" ]] && other_hit="$dig"
        ;;
    esac
  done
  if [[ -n "$home_hit" ]]; then
    echo "$home_hit"
    return
  fi
  if [[ -n "$other_hit" ]]; then
    echo "$other_hit"
    return
  fi

  # PATH 存在但无可写目录：回退 ~/bin（后续会补 PATH）
  echo "$fallback"
}

persist_prefix_on_path() {
  local prefix="$1"
  local cur_shell rc line
  cur_shell="$(basename "${SHELL:-zsh}")"
  case "$cur_shell" in
    bash)
      if [[ "${OS:-}" == "darwin" ]]; then
        if [[ -f "$HOME/.bash_profile" ]]; then
          rc="$HOME/.bash_profile"
        elif [[ -f "$HOME/.bash_login" ]]; then
          rc="$HOME/.bash_login"
        elif [[ -f "$HOME/.profile" ]]; then
          rc="$HOME/.profile"
        else
          rc="$HOME/.bash_profile"
        fi
      else
        rc="$HOME/.bashrc"
      fi
      ;;
    fish)
      rc="$HOME/.config/fish/config.fish"
      PATH_RC_FILE="$rc"
      line="fish_add_path $prefix"
      mkdir -p "$(dirname "$rc")"
      if [[ -f "$rc" ]] && grep -Fq "$prefix" "$rc" 2>/dev/null; then
        PATH_PERSISTED=1
        return 0
      fi
      printf '\n# dgate CLI\n%s\n' "$line" >> "$rc"
      PATH_PERSISTED=1
      echo "    已写入 PATH 到 $rc"
      return 0
      ;;
    *) rc="$HOME/.zshrc" ;;
  esac
  PATH_RC_FILE="$rc"
  line="export PATH=\"$prefix:\$PATH\""
  if [[ -f "$rc" ]] && grep -Fq "$prefix" "$rc" 2>/dev/null; then
    PATH_PERSISTED=1
    return 0
  fi
  touch "$rc"
  printf '\n# dgate CLI\n%s\n' "$line" >> "$rc"
  PATH_PERSISTED=1
  echo "    已写入 PATH 到 $rc"
}

display_home_path() {
  case "$1" in
    "$HOME") echo "~" ;;
    "$HOME"/*) echo "~/${1#"$HOME"/}" ;;
    *) echo "$1" ;;
  esac
}

# --- 环境识别：交互终端 vs Agent/CI ---
is_agent_or_ci() {
  [[ -n "${CI:-}" || -n "${GITHUB_ACTIONS:-}" || -n "${GITLAB_CI:-}" || -n "${BUILDKITE:-}" ]] && return 0
  [[ -n "${CURSOR_AGENT:-}" || -n "${CURSOR_TRACE_ID:-}" || -n "${CURSOR_SESSION_ID:-}" ]] && return 0
  [[ "${CURSOR_EXTENSION_HOST_ROLE:-}" == "agent-exec" ]] && return 0
  [[ -n "${CODEX_CI:-}" || -n "${CODEX_THREAD_ID:-}" || -n "${CODEX_SANDBOX:-}" ]] && return 0
  [[ -n "${CLAUDECODE:-}" || -n "${CLAUDE_CODE:-}" || -n "${AIDER:-}" ]] && return 0
  case "${DGATE_QUICKSTART_MODE:-}" in
    yes|noninteractive|agent) return 0 ;;
  esac
  return 1
}

can_use_tty() {
  [[ -e /dev/tty && -r /dev/tty && -w /dev/tty ]] || return 1
  # curl|bash 时 stdin 是管道，但 /dev/tty 仍可交互
  return 0
}

want_interactive_quickstart() {
  case "${DGATE_QUICKSTART_MODE:-}" in
    interactive|tty) return 0 ;;
    yes|noninteractive|agent|skip) return 1 ;;
  esac
  is_agent_or_ci && return 1
  can_use_tty
}

print_agent_decision_hint() {
  cat <<'EOF' >&2
    【给 Agent】安装脚本无法直接弹出 Cursor/Codex 决策框。
    请先用你的决策/询问工具让用户选择要注入 Skill 的 Agent（如 cursor,codex），再执行：
      dgate quickstart --yes --agents <用户选择>
    或在安装命令中增加：--install-ide cursor,codex
EOF
}

run_installed_cli() {
  # 保留 CLI 自身 stderr，但收敛 Bash 在子进程被 SIGKILL 时打印的作业诊断。
  { "$@" 2>&3; } 3>&2 2>/dev/null
}

print_sigkill_security_hint() {
  local executable="$1"
  [[ "$SECURITY_HINT_SHOWN" == "1" ]] && return
  SECURITY_HINT_SHOWN=1
  echo "      安全提示：检测到进程被系统强制终止（signal 9）。"
  echo "      企业设备可能有内部安全软件或终端管控进程拦截外部 CLI 的安装或运行。"
  echo "      请检查公司安全软件和终端管控策略；如无法自行处理，请联系公司安全人员协助确认并放行。"
  echo "      可向安全人员提供：程序路径 ${executable}，版本 ${VERSION}，以及上方 SHA256 校验值。"
}

print_credential_failure() {
  local bin_name="$1" executable="$2" unfinished="$3" token_hint="$4" retry_command="$5"
  {
    echo ""
    echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
    echo "!! 凭证绑定失败：CLI 已安装成功，但 Agent 身份未注册成功"
    echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
    echo "    已完成：${bin_name} 主程序已安装到 ${executable}"
    echo "    未完成：${unfinished}"
    echo "    ${token_hint}"
    echo "    稍后重试：${retry_command}"
  } >&2
}

fetch() {
  if command -v curl >/dev/null 2>&1; then curl -fsSL "$1";
  elif command -v wget >/dev/null 2>&1; then wget -qO- "$1";
  else echo "需要 curl 或 wget" >&2; exit 1; fi
}
fetch_to() {
  if command -v curl >/dev/null 2>&1; then curl -fsSL "$1" -o "$2";
  else wget -qO "$2" "$1"; fi
}
sha256_of() {
  if command -v sha256sum >/dev/null 2>&1; then sha256sum "$1" | awk '{print $1}';
  else shasum -a 256 "$1" | awk '{print $1}'; fi
}

uname_s="$(uname -s)"; uname_m="$(uname -m)"
case "$uname_s" in
  Darwin) OS="darwin" ;;
  Linux)  OS="linux" ;;
  *) echo "不支持的系统: $uname_s（Windows 请用 npx 或 install-beta.ps1）"; exit 1 ;;
esac
case "$uname_m" in
  x86_64|amd64) ARCH="amd64" ;;
  arm64|aarch64) ARCH="arm64" ;;
  *) echo "不支持的架构: $uname_m"; exit 1 ;;
esac

if [[ -z "$PREFIX" ]]; then
  PREFIX="$(resolve_install_prefix)"
fi
PREFIX="$(norm_path "$PREFIX")"
if path_contains "$PREFIX"; then
  PREFIX_WAS_ON_PATH=1
fi

CHAN_URL="$BASE_URL/$CHANNEL"
if [[ -z "$VERSION" ]]; then
  VERSION="$(fetch "$CHAN_URL/latest.txt" | tr -d '[:space:]')"
  [[ -z "$VERSION" ]] && { echo "无法解析渠道最新版本: $CHAN_URL/latest.txt"; exit 1; }
fi

ARTIFACT="dgate_${OS}_${ARCH}"
VER_URL="$CHAN_URL/$VERSION"
echo "==> 安装 dgate v$VERSION (prod) [$OS/$ARCH]"
echo "    安装目录: $PREFIX"

tmp="$(mktemp -d)"; trap 'rm -rf "$tmp"' EXIT
fetch_to "$VER_URL/$ARTIFACT" "$tmp/dgate"

want=""
if want="$(fetch "$VER_URL/$ARTIFACT.sha256" 2>/dev/null | awk '{print $1}')"; then :; fi
if [[ -n "$want" ]]; then
  got="$(sha256_of "$tmp/dgate")"
  [[ "$got" == "$want" ]] || { echo "校验失败：期望 $want，实际 $got"; exit 1; }
  echo "    校验通过 ($got)"
else
  echo "    警告：未取到校验和，跳过校验"
fi

mkdir -p "$PREFIX" "$DATA_HOME"
install -m 0755 "$tmp/dgate" "$PREFIX/dgate"
echo "==> dgate CLI 主程序已安装: $PREFIX/dgate"
echo "    数据目录: $DATA_HOME"

export DGATE_HOME="$DATA_HOME"
# 仅供安装脚本后续步骤调用刚安装的 CLI；子进程无法修改调用方当前终端的 PATH。
export PATH="$PREFIX:$PATH"

if [[ "$PREFIX_WAS_ON_PATH" != "1" ]]; then
  echo "==> 安装目录原先不在调用终端的 PATH"
  case "$PREFIX" in
    "$HOME"/*) persist_prefix_on_path "$PREFIX" ;;
  esac
  if [[ "$PATH_PERSISTED" == "1" ]]; then
    PATH_RC_HINT="$(display_home_path "$PATH_RC_FILE")"
    echo "    PATH 已持久化；当前终端仍需执行: source $PATH_RC_HINT"
  else
    echo "    当前终端仍需执行: export PATH=\"$PREFIX:\$PATH\""
  fi
fi

cfg="$DATA_HOME/config.json"
write_cfg() {
  if command -v python3 >/dev/null 2>&1; then
    python3 - "$cfg" "$REGION" <<'PY'
import json, os, sys
p, region = sys.argv[1:3]
c = {}
if os.path.isfile(p):
    with open(p) as f:
        c = json.load(f)
if region:
    c["region"] = region
os.makedirs(os.path.dirname(p) or ".", exist_ok=True)
with open(p, "w") as f:
    json.dump(c, f, indent=2)
    f.write("\n")
PY
  else
    if [[ -n "$REGION" ]]; then
      echo "{\"region\":\"$REGION\"}" > "$cfg"
    fi
  fi
}
if [[ -z "$INSTALL_TOKEN" && -z "$ACCESS_TOKEN" ]]; then
  write_cfg
  [[ -n "$REGION" ]] && echo "    已写入 config.region=$REGION"
fi

if [[ -n "$INSTALL_TOKEN" ]]; then
  echo "==> 兑换 install_token 并绑定凭证..."
  bind_args=(install bind "$INSTALL_TOKEN")
  [[ -n "$REGION" ]] && bind_args+=(--region "$REGION")
  if run_installed_cli "$PREFIX/dgate" "${bind_args[@]}"; then
    CREDENTIAL_OK=1
  else
    CLI_EXIT=$?
    if [[ "$CLI_EXIT" == "137" ]]; then
      echo "    提示：install_token 兑换尚未完成；CLI 主程序已安装。"
      print_sigkill_security_hint "$PREFIX/dgate"
    else
      print_credential_failure "dgate" "$PREFIX/dgate" \
        "install_token 兑换和 Agent 身份注册" \
        "请确认使用有效且未过期的 install_token（dit_...），不是 Access Token（dms_sk_...）" \
        "dgate install bind dit_... --region ${REGION:-cn-hangzhou}"
    fi
  fi
fi

if [[ -n "$ACCESS_TOKEN" ]]; then
  echo "==> 保存 Access Token 并验证身份..."
  token_args=(config set-token "$ACCESS_TOKEN")
  [[ -n "$REGION" ]] && token_args+=(--region "$REGION")
  if run_installed_cli "$PREFIX/dgate" "${token_args[@]}"; then
    CREDENTIAL_OK=1
  else
    CLI_EXIT=$?
    if [[ "$CLI_EXIT" == "137" ]]; then
      echo "    提示：Access Token 保存/验证尚未完成；CLI 主程序已安装。"
      print_sigkill_security_hint "$PREFIX/dgate"
    else
      print_credential_failure "dgate" "$PREFIX/dgate" \
        "Access Token 保存和身份验证" \
        "请确认使用有效的 Access Token（dms_sk_...），不是 install_token（dit_...）" \
        "dgate config set-token dms_sk_... --region ${REGION:-cn-hangzhou}"
    fi
  fi
fi

if [[ -n "${INSTALL_IDE:-}" ]]; then
  echo "==> 安装 Skill/Rule 到 Agent（${INSTALL_IDE}）..."
  if run_installed_cli "$PREFIX/dgate" install skills --agents "${INSTALL_IDE}"; then
    echo "    已写入并校验对应 Agent 全局 Skill/Rule 目录"
  else
    CLI_EXIT=$?
    [[ "$CLI_EXIT" == "137" ]] && print_sigkill_security_hint "$PREFIX/dgate"
    echo "✗ Skill/Rule 安装失败；上方日志包含具体目标和失败原因。" >&2
    echo "  修复后重试: dgate install skills --agents ${INSTALL_IDE}" >&2
    exit 1
  fi
fi

if [[ -z "$SKIP_COMPLETION" ]]; then
  COMPLETION_ATTEMPTED=1
  echo "==> 配置 Tab 补全（可选）..."
  if run_installed_cli "$PREFIX/dgate" completion install >/dev/null 2>&1; then
    COMPLETION_OK=1
    echo "    Tab 补全已配置（新开终端或 source 后生效）"
  else
    COMPLETION_EXIT=$?
    echo "    提示：Tab 补全尚未自动启用；CLI 主程序已安装，补全属于可选体验。"
    echo "      如需启用，可稍后执行: dgate completion install"
    if [[ "$COMPLETION_EXIT" == "137" ]]; then
      print_sigkill_security_hint "$PREFIX/dgate"
    fi
  fi
fi

run_quickstart() {
  local mode="$1"
  local quickstart_exit=0
  local qs_args=(quickstart --home "$DATA_HOME")
  if [[ -n "$INSTALL_IDE" ]]; then
    qs_args+=(--skip-skills)
  fi
  if [[ "$mode" == "interactive" ]]; then
    echo "==> 运行 quickstart（交互式，当前终端）..."
    if { "$PREFIX/dgate" "${qs_args[@]}" </dev/tty >/dev/tty 2>&3; } 3>/dev/tty 2>/dev/null; then
      QUICKSTART_OK=1
      echo "    quickstart 完成"
    else
      quickstart_exit=$?
      echo "    提示：快速配置尚未完成；CLI 主程序已安装，可稍后执行: dgate quickstart"
      [[ "$quickstart_exit" == "137" ]] && print_sigkill_security_hint "$PREFIX/dgate"
    fi
    return
  fi

  echo "==> 运行 quickstart（非交互）..."
  if is_agent_or_ci && [[ -z "$INSTALL_IDE" ]]; then
    print_agent_decision_hint
  fi
  qs_args+=(--yes)
  if { "$PREFIX/dgate" "${qs_args[@]}" 2>&3; } 3>&2 2>/dev/null; then
    QUICKSTART_OK=1
    echo "    quickstart 完成"
  else
    quickstart_exit=$?
    echo "    提示：快速配置尚未完成；CLI 主程序已安装，可稍后执行: dgate quickstart --yes"
    [[ "$quickstart_exit" == "137" ]] && print_sigkill_security_hint "$PREFIX/dgate"
  fi
}

if [[ -z "$SKIP_QUICKSTART" ]]; then
  if want_interactive_quickstart; then
    # 交互式可补凭证；token 已消费时也能继续引导
    run_quickstart interactive
  elif [[ "$CREDENTIAL_OK" == "1" ]]; then
    run_quickstart noninteractive
  else
    echo "==> 跳过自动 quickstart（无有效凭证）。可稍后执行: dgate quickstart" >&2
    if is_agent_or_ci; then
      print_agent_decision_hint
    fi
  fi
fi

cur_shell="$(basename "${SHELL:-zsh}")"
case "$cur_shell" in
  bash) RC_HINT="~/.bashrc" ;;
  fish) RC_HINT="~/.config/fish/config.fish" ;;
  *)    RC_HINT="~/.zshrc" ;;
esac

echo ""
echo "✓ dgate CLI 安装完成"
echo "  可执行文件: $PREFIX/dgate"
echo "下一步:"
COMPLETION_SOURCE_SHOWN=0
if [[ "$PREFIX_WAS_ON_PATH" != "1" ]]; then
  if [[ "$PATH_PERSISTED" == "1" ]]; then
    if [[ "$COMPLETION_ATTEMPTED" == "1" && "$COMPLETION_OK" == "1" && "$PATH_RC_HINT" == "$RC_HINT" ]]; then
      echo "  source $PATH_RC_HINT                       # 让当前终端识别 dgate 并启用 Tab 补全"
      COMPLETION_SOURCE_SHOWN=1
    else
      echo "  source $PATH_RC_HINT                       # 让当前终端识别 dgate（或新开终端）"
    fi
  else
    echo "  export PATH=\"$PREFIX:\$PATH\"          # 让当前终端识别 dgate"
  fi
fi
if [[ -z "$INSTALL_TOKEN" && -z "$ACCESS_TOKEN" ]]; then
  echo "  curl .../install.sh | bash -s -- --install-token dit_xxx --region cn-hangzhou"
  echo "  dgate config set-token dms_sk_xxx --region cn-hangzhou"
fi
if [[ "$COMPLETION_ATTEMPTED" == "1" ]]; then
  if [[ "$COMPLETION_OK" == "1" ]]; then
    if [[ "$COMPLETION_SOURCE_SHOWN" != "1" ]]; then
      echo "  source $RC_HINT                       # 启用 Tab 补全（或新开终端）"
    fi
  else
    echo "  dgate completion install              # 可选：需要 Tab 补全时执行"
  fi
fi
if [[ "$QUICKSTART_OK" != "1" ]]; then
  if want_interactive_quickstart 2>/dev/null; then
    echo "  dgate quickstart                       # 可选：继续快速配置"
  else
    echo "  dgate quickstart --yes                 # 可选：继续快速配置"
  fi
fi
echo "  dgate meta catalog list"
