Ctrl K
ComunidadGuías…

install-mac.sh

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
#!/usr/bin/env bash
# OpenWorkBuddy · macOS 一键装应用(不走浏览器下载,绕开 Gatekeeper 那道墙)
#
#   curl -fsSL https://raw.githubusercontent.com/CatCatUncle/openworkbuddy/main/install-mac.sh | bash
#
# 为什么要有这个脚本:这个项目没有 Apple 的付费开发者证书(99 美元/年),
# 包只做了 ad-hoc 签名。浏览器下载的文件会被打上 com.apple.quarantine 标记,
# 于是 macOS 15 起双击只有一个「移到废纸篓 / 完成」的弹窗——没有「打开」这个选项,
# 照着老教程右键打开也没用,绝大多数人到这一步就放弃了,以为「这软件是坏的」。
#
# curl 下下来的文件不带那个标记。所以这条路上一个弹窗都不会有:
# 下载 → 解压 → 放进「应用程序」→ 打开。你的数据仍在 ~/OpenWorkBuddy,覆盖装不动它。
#
# 想装指定版本:OPENWORKBUDDY_VERSION=v0.6.4 bash install-mac.sh
# 想装到别处:  OPENWORKBUDDY_APPDIR=~/Applications bash install-mac.sh

set -euo pipefail

REPO="${OPENWORKBUDDY_REPO_SLUG:-CatCatUncle/openworkbuddy}"
WANT="${OPENWORKBUDDY_VERSION:-}"

say()  { printf "\033[1;34m▸\033[0m %s\n" "$*"; }
ok()   { printf "\033[1;32m✓\033[0m %s\n" "$*"; }
die()  { printf "\033[1;31m✗ %s\033[0m\n" "$*" >&2; exit 1; }

[ "$(uname -s)" = "Darwin" ] || die "这个脚本只管 macOS。Linux / 服务器用 install.sh,Windows 去 Releases 下 -win-setup.exe。"

case "$(uname -m)" in
  arm64)  ARCH=arm64 ;;
  x86_64) ARCH=x64 ;;
  *) die "不认识这个架构:$(uname -m)" ;;
esac
say "芯片:$(uname -m) → 下 mac-$ARCH 的包"

# ---------- 1. 找包 ----------
API="https://api.github.com/repos/$REPO/releases/latest"
[ -n "$WANT" ] && API="https://api.github.com/repos/$REPO/releases/tags/$WANT"
say "查最新版本…"
JSON="$(curl -fsSL -H 'Accept: application/vnd.github+json' "$API")" \
  || die "连不上 GitHub。挂了代理的话先关掉,或者自己去 https://github.com/$REPO/releases 下 zip。"

TAG="$(printf '%s' "$JSON" | sed -n 's/.*"tag_name"[[:space:]]*:[[:space:]]*"\([^"]*\)".*/\1/p' | head -1)"
# 只认 zip:dmg 得挂载再卸载,多两个能失败的步骤,装应用这件事上没有任何好处
URL="$(printf '%s' "$JSON" | tr ',' '\n' | sed -n 's/.*"browser_download_url"[[:space:]]*:[[:space:]]*"\([^"]*mac-'"$ARCH"'\.zip\)".*/\1/p' | head -1)"
[ -n "$URL" ] || die "这个版本里没有 mac-$ARCH 的 zip。去 https://github.com/$REPO/releases 看看。"
ok "找到 ${TAG:-最新版}"

# ---------- 2. 下 ----------
TMP="$(mktemp -d)"
trap 'rm -rf "$TMP"' EXIT
say "下载中(160 MB 左右,慢的话去倒杯水)…"
curl -fL --retry 3 --progress-bar -o "$TMP/owb.zip" "$URL" || die "下载失败。"
[ -s "$TMP/owb.zip" ] || die "下下来是个空文件,重跑一次试试。"

say "解压…"
/usr/bin/ditto -x -k "$TMP/owb.zip" "$TMP/out" || die "解压失败,八成是没下完。重跑一次。"
SRC="$(/usr/bin/find "$TMP/out" -maxdepth 2 -name '*.app' -print -quit)"
[ -n "$SRC" ] || die "包里没找到 .app,这不该发生——请开个 issue 带上这行输出。"

# ---------- 3. 放进应用程序 ----------
APPDIR="${OPENWORKBUDDY_APPDIR:-/Applications}"
if [ ! -w "$APPDIR" ]; then
  APPDIR="$HOME/Applications"
  mkdir -p "$APPDIR"
  say "/Applications 写不了,改装到 $APPDIR"
fi
DEST="$APPDIR/$(basename "$SRC")"
if [ -e "$DEST" ]; then
  # 反过来也要防一手:scripts/make-mac-app.sh 的开发壳固定写在 ~/Applications,
  # 跟上面这条「/Applications 写不了就退到 ~/Applications」正好撞在同一个名字上。
  # 那是个指向本机仓库的壳,删掉等于把人家的开发入口删了
  if grep -q "make-mac-app.sh" "$DEST/Contents/Resources/app/main.js" 2>/dev/null; then
    die "$DEST 是源码仓库的开发壳(scripts/make-mac-app.sh 生成的),没敢覆盖。换个地方装:OPENWORKBUDDY_APPDIR=\"$HOME/Desktop\" bash install-mac.sh"
  fi
  say "覆盖旧版本(你的配置和成果文件在 ~/OpenWorkBuddy,不会动)"
  rm -rf "$DEST"
fi
/bin/mv "$SRC" "$DEST" || die "移到 $APPDIR 失败。"

# 保险起见再摘一次隔离标记:curl 下的本来就没有,但万一 zip 是从别处拷来的
/usr/bin/xattr -dr com.apple.quarantine "$DEST" 2>/dev/null || true

# 签名自愈:包里本来就带 ad-hoc 签名,但拷贝、同步盘、解压工具都可能把它弄坏。
# 坏了的话 Apple Silicon 上直接起不来,而且报的错是「已损坏」,看不出真正原因
if ! /usr/bin/codesign --verify --deep --strict "$DEST" >/dev/null 2>&1; then
  say "签名对不上,重新做一次 ad-hoc 签名…"
  /usr/bin/codesign --force --deep --sign - "$DEST" >/dev/null 2>&1 \
    || die "重签失败。装了 Xcode Command Line Tools 吗?xcode-select --install"
fi

ok "装好了:$DEST"
say "第一次打开要填个模型 API Key;你的东西都在 ~/OpenWorkBuddy,卸载不会删。"
# 只装不开:测试和批量部署要的是这个,不然每台机器都弹一个窗
if [ "${OPENWORKBUDDY_NO_OPEN:-}" = "1" ]; then exit 0; fi
/usr/bin/open "$DEST" || say "自动打开失败,去「应用程序」里双击它。"