@cocorograph/hub-agent 0.5.20 → 0.5.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/package.json +1 -1
  2. package/scripts/install.sh +48 -9
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cocorograph/hub-agent",
3
- "version": "0.5.20",
3
+ "version": "0.5.21",
4
4
  "description": "Hub Hosted Cockpit のローカル常駐 agent。Hub と outbound WSS で接続し、ローカルの tmux/pty を中継する。",
5
5
  "type": "module",
6
6
  "license": "UNLICENSED",
@@ -32,18 +32,40 @@ color_err() { printf "\033[1;31m✗ %s\033[0m\n" "$1" >&2; }
32
32
 
33
33
  present() { command -v "$1" >/dev/null 2>&1; }
34
34
 
35
+ # 現在 PATH にある brew が、このユーザーで書き込み可能か判定する。
36
+ # 「brew はあるが Cellar が他ユーザー所有で書き込み不可」というケースを検知して
37
+ # user-local Homebrew にフォールバックするための判定関数。
38
+ _existing_brew_writable() {
39
+ local prefix
40
+ prefix="$(brew --prefix 2>/dev/null || echo '')"
41
+ [[ -z "$prefix" ]] && return 1
42
+ # Cellar / opt が書き込み可能か(または未作成でも prefix 自体が書き込み可能か)
43
+ if [[ -w "$prefix/Cellar" ]] || ( [[ ! -e "$prefix/Cellar" ]] && [[ -w "$prefix" ]] ); then
44
+ return 0
45
+ fi
46
+ return 1
47
+ }
48
+
35
49
  ensure_brew() {
36
50
  if [[ "$(uname)" != "Darwin" ]]; then return 0; fi
51
+
52
+ # 既に brew がインストールされている場合の判定:
53
+ # - ユーザーが書き込み可能 → そのまま使用(system / user-local どちらでも OK)
54
+ # - 書き込み不可(他ユーザー所有の brew が居る)→ $HOME/homebrew に並列で user-local 化
37
55
  if present brew; then
38
- color_ok "brew already installed"
39
- persist_brew_shellenv
56
+ if _existing_brew_writable; then
57
+ color_ok "brew already installed and writable ($(brew --prefix))"
58
+ persist_brew_shellenv
59
+ return 0
60
+ fi
61
+ color_warn "既存 brew ($(brew --prefix 2>/dev/null)) は書き込み不可 → \$HOME/homebrew にユーザーローカル Homebrew を並列インストール"
62
+ _install_user_local_brew
40
63
  return 0
41
64
  fi
42
65
 
43
- # 管理者権限の有無を判定して user-mode に切り替える。
66
+ # brew コマンドが PATH にない場合の判定:
44
67
  # - 環境変数 HUB_AGENT_USER_BREW=1 で明示強制
45
68
  # - sudo がパスワードなしで通らない = 管理者ではない可能性が高いと判定
46
- # user-mode では $HOME/homebrew にユーザーローカルインストール(sudo 不要)。
47
69
  local use_user_mode=0
48
70
  if [[ "${HUB_AGENT_USER_BREW:-0}" == "1" ]]; then
49
71
  use_user_mode=1
@@ -54,11 +76,7 @@ ensure_brew() {
54
76
  fi
55
77
 
56
78
  if (( use_user_mode == 1 )); then
57
- color_step "Homebrew をユーザーローカルインストール (\$HOME/homebrew)"
58
- mkdir -p "$HOME/homebrew"
59
- curl -L https://github.com/Homebrew/brew/tarball/master | tar xz --strip 1 -C "$HOME/homebrew"
60
- export PATH="$HOME/homebrew/bin:$PATH"
61
- persist_user_brew_shellenv
79
+ _install_user_local_brew
62
80
  else
63
81
  color_step "Homebrew をシステムインストール"
64
82
  /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
@@ -71,11 +89,32 @@ ensure_brew() {
71
89
  present brew || { color_err "brew install failed"; exit 1; }
72
90
  }
73
91
 
92
+ # user-local Homebrew のインストール本体(重複排除のため関数化)。
93
+ # 既に $HOME/homebrew が展開済みなら再展開せず PATH/shellenv だけ整える。
94
+ _install_user_local_brew() {
95
+ if [[ -x "$HOME/homebrew/bin/brew" ]]; then
96
+ color_ok "\$HOME/homebrew は既に展開済み"
97
+ else
98
+ color_step "Homebrew をユーザーローカルインストール (\$HOME/homebrew)"
99
+ mkdir -p "$HOME/homebrew"
100
+ curl -L https://github.com/Homebrew/brew/tarball/master | tar xz --strip 1 -C "$HOME/homebrew"
101
+ fi
102
+ # PATH を user-local 優先で並べる(既存 /usr/local/bin/brew より先)
103
+ export PATH="$HOME/homebrew/bin:$PATH"
104
+ hash -r 2>/dev/null || true # bash のコマンドキャッシュをクリア
105
+ persist_user_brew_shellenv
106
+ }
107
+
74
108
  # Apple Silicon Mac で brew のパスを zsh / bash 永続化する。既に追記済みなら no-op。
75
109
  # `eval "$(/opt/homebrew/bin/brew shellenv)"` を書くことで、Homebrew が用意する
76
110
  # HOMEBREW_PREFIX / PATH / MANPATH / INFOPATH すべてを新規シェルで自動セットする。
77
111
  persist_brew_shellenv() {
78
112
  local brew_bin=""
113
+ # $HOME/homebrew が PATH 上で優先されているなら、user-local 側で永続化する
114
+ if [[ -x "$HOME/homebrew/bin/brew" ]] && [[ "$(command -v brew)" == "$HOME/homebrew/bin/brew" ]]; then
115
+ persist_user_brew_shellenv
116
+ return 0
117
+ fi
79
118
  if [[ -x /opt/homebrew/bin/brew ]]; then
80
119
  brew_bin="/opt/homebrew/bin/brew"
81
120
  elif [[ -x /usr/local/bin/brew ]]; then