@cocorograph/hub-agent 0.5.19 → 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.
- package/package.json +1 -1
- package/scripts/install.sh +171 -10
package/package.json
CHANGED
package/scripts/install.sh
CHANGED
|
@@ -10,16 +10,20 @@
|
|
|
10
10
|
#
|
|
11
11
|
# 内容:
|
|
12
12
|
# 1. macOS なら Homebrew (なければ install)
|
|
13
|
+
# - 管理者権限が無い環境では自動で $HOME/homebrew にユーザーローカル
|
|
14
|
+
# インストールに切り替わる (HUB_AGENT_USER_BREW=1 で強制も可)
|
|
13
15
|
# 2. tmux + node (なければ install via brew / apt)
|
|
14
16
|
# 3. npm i -g @cocorograph/hub-agent
|
|
15
|
-
# 4.
|
|
16
|
-
# 5. hub-agent
|
|
17
|
+
# 4. npm i -g @anthropic-ai/claude-code (既存があれば upgrade のみ)
|
|
18
|
+
# 5. HUB_AGENT_TOKEN が設定されていれば hub-agent enroll を自動実行
|
|
19
|
+
# 6. hub-agent install-service で OS サービス化
|
|
17
20
|
# =============================================================================
|
|
18
21
|
|
|
19
22
|
set -euo pipefail
|
|
20
23
|
|
|
21
24
|
NODE_MIN_MAJOR=20
|
|
22
25
|
PACKAGE_NAME="@cocorograph/hub-agent"
|
|
26
|
+
CLAUDE_CODE_PACKAGE="@anthropic-ai/claude-code"
|
|
23
27
|
|
|
24
28
|
color_step() { printf "\033[1;34m==> %s\033[0m\n" "$1"; }
|
|
25
29
|
color_ok() { printf "\033[1;32m✓ %s\033[0m\n" "$1"; }
|
|
@@ -28,24 +32,77 @@ color_err() { printf "\033[1;31m✗ %s\033[0m\n" "$1" >&2; }
|
|
|
28
32
|
|
|
29
33
|
present() { command -v "$1" >/dev/null 2>&1; }
|
|
30
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
|
+
|
|
31
49
|
ensure_brew() {
|
|
32
50
|
if [[ "$(uname)" != "Darwin" ]]; then return 0; fi
|
|
51
|
+
|
|
52
|
+
# 既に brew がインストールされている場合の判定:
|
|
53
|
+
# - ユーザーが書き込み可能 → そのまま使用(system / user-local どちらでも OK)
|
|
54
|
+
# - 書き込み不可(他ユーザー所有の brew が居る)→ $HOME/homebrew に並列で user-local 化
|
|
33
55
|
if present brew; then
|
|
34
|
-
|
|
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
|
|
63
|
+
return 0
|
|
64
|
+
fi
|
|
65
|
+
|
|
66
|
+
# brew コマンドが PATH にない場合の判定:
|
|
67
|
+
# - 環境変数 HUB_AGENT_USER_BREW=1 で明示強制
|
|
68
|
+
# - sudo がパスワードなしで通らない = 管理者ではない可能性が高いと判定
|
|
69
|
+
local use_user_mode=0
|
|
70
|
+
if [[ "${HUB_AGENT_USER_BREW:-0}" == "1" ]]; then
|
|
71
|
+
use_user_mode=1
|
|
72
|
+
color_step "HUB_AGENT_USER_BREW=1 → ユーザーローカル Homebrew を使用"
|
|
73
|
+
elif ! sudo -n true 2>/dev/null; then
|
|
74
|
+
color_warn "管理者権限なしと判定 → \$HOME/homebrew にユーザーローカル Homebrew をインストール"
|
|
75
|
+
use_user_mode=1
|
|
76
|
+
fi
|
|
77
|
+
|
|
78
|
+
if (( use_user_mode == 1 )); then
|
|
79
|
+
_install_user_local_brew
|
|
35
80
|
else
|
|
36
|
-
color_step "Homebrew
|
|
81
|
+
color_step "Homebrew をシステムインストール"
|
|
37
82
|
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
|
|
38
83
|
# Apple Silicon の brew はデフォルト PATH に入らないので追加
|
|
39
84
|
if [[ -d /opt/homebrew/bin ]]; then
|
|
40
85
|
export PATH="/opt/homebrew/bin:$PATH"
|
|
41
86
|
fi
|
|
42
|
-
|
|
87
|
+
persist_brew_shellenv
|
|
88
|
+
fi
|
|
89
|
+
present brew || { color_err "brew install failed"; exit 1; }
|
|
90
|
+
}
|
|
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"
|
|
43
101
|
fi
|
|
44
|
-
#
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
persist_brew_shellenv
|
|
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
|
|
49
106
|
}
|
|
50
107
|
|
|
51
108
|
# Apple Silicon Mac で brew のパスを zsh / bash 永続化する。既に追記済みなら no-op。
|
|
@@ -53,6 +110,11 @@ ensure_brew() {
|
|
|
53
110
|
# HOMEBREW_PREFIX / PATH / MANPATH / INFOPATH すべてを新規シェルで自動セットする。
|
|
54
111
|
persist_brew_shellenv() {
|
|
55
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
|
|
56
118
|
if [[ -x /opt/homebrew/bin/brew ]]; then
|
|
57
119
|
brew_bin="/opt/homebrew/bin/brew"
|
|
58
120
|
elif [[ -x /usr/local/bin/brew ]]; then
|
|
@@ -80,6 +142,68 @@ persist_brew_shellenv() {
|
|
|
80
142
|
done
|
|
81
143
|
}
|
|
82
144
|
|
|
145
|
+
# user-mode($HOME/homebrew)用の shellenv 永続化。
|
|
146
|
+
# system 版 persist_brew_shellenv と同じ仕組みだが対象 brew が $HOME 配下。
|
|
147
|
+
persist_user_brew_shellenv() {
|
|
148
|
+
local brew_bin="$HOME/homebrew/bin/brew"
|
|
149
|
+
[[ -x "$brew_bin" ]] || return 0
|
|
150
|
+
local snippet="eval \"\$(${brew_bin} shellenv)\""
|
|
151
|
+
local marker="# >>> hub-agent: brew shellenv (user-local) >>>"
|
|
152
|
+
local end_marker="# <<< hub-agent: brew shellenv <<<"
|
|
153
|
+
local target
|
|
154
|
+
for target in "$HOME/.zprofile" "$HOME/.bash_profile"; do
|
|
155
|
+
if [[ -f "$target" ]] && grep -Fq "$snippet" "$target"; then
|
|
156
|
+
color_ok "user-local brew shellenv は既に $target にあります"
|
|
157
|
+
continue
|
|
158
|
+
fi
|
|
159
|
+
color_step "$target に user-local brew shellenv を追記"
|
|
160
|
+
{
|
|
161
|
+
printf '\n%s\n' "$marker"
|
|
162
|
+
printf '%s\n' "$snippet"
|
|
163
|
+
printf '%s\n' "$end_marker"
|
|
164
|
+
} >> "$target"
|
|
165
|
+
color_ok "$target に追記しました (新規シェルから有効)"
|
|
166
|
+
done
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
# user-mode の場合、npm の global prefix を $HOME/.npm-global に切り替える。
|
|
170
|
+
# brew が $HOME/homebrew にいるとき、その prefix への書き込み権限はあるものの、
|
|
171
|
+
# 後で system 版 node / npm に切り替わる可能性も考えて user 領域に逃がしておく。
|
|
172
|
+
# system mode(/opt/homebrew 等)では何もしない(既存挙動を温存)。
|
|
173
|
+
ensure_npm_user_prefix() {
|
|
174
|
+
[[ "$(uname)" != "Darwin" ]] && return 0
|
|
175
|
+
[[ -d "$HOME/homebrew" ]] || return 0 # user-mode 検知
|
|
176
|
+
|
|
177
|
+
# 既に $HOME/.npm-global が prefix なら何もしない
|
|
178
|
+
local cur_prefix
|
|
179
|
+
cur_prefix="$(npm config get prefix 2>/dev/null || echo '')"
|
|
180
|
+
if [[ "$cur_prefix" == "$HOME/.npm-global" ]]; then
|
|
181
|
+
color_ok "npm global prefix は既に $HOME/.npm-global"
|
|
182
|
+
return 0
|
|
183
|
+
fi
|
|
184
|
+
|
|
185
|
+
color_step "npm global prefix を \$HOME/.npm-global に切替 (user-mode)"
|
|
186
|
+
mkdir -p "$HOME/.npm-global"
|
|
187
|
+
npm config set prefix "$HOME/.npm-global"
|
|
188
|
+
export PATH="$HOME/.npm-global/bin:$PATH"
|
|
189
|
+
|
|
190
|
+
local snippet='export PATH="$HOME/.npm-global/bin:$PATH"'
|
|
191
|
+
local marker="# >>> hub-agent: npm-global PATH (user-mode) >>>"
|
|
192
|
+
local end_marker="# <<< hub-agent: npm-global PATH <<<"
|
|
193
|
+
local target
|
|
194
|
+
for target in "$HOME/.zprofile" "$HOME/.bash_profile"; do
|
|
195
|
+
if [[ -f "$target" ]] && grep -Fq "$snippet" "$target"; then
|
|
196
|
+
continue
|
|
197
|
+
fi
|
|
198
|
+
{
|
|
199
|
+
printf '\n%s\n' "$marker"
|
|
200
|
+
printf '%s\n' "$snippet"
|
|
201
|
+
printf '%s\n' "$end_marker"
|
|
202
|
+
} >> "$target"
|
|
203
|
+
color_ok "$target に npm-global PATH を追記"
|
|
204
|
+
done
|
|
205
|
+
}
|
|
206
|
+
|
|
83
207
|
ensure_pkg() {
|
|
84
208
|
local cmd="$1"
|
|
85
209
|
local brew_pkg="$2"
|
|
@@ -134,6 +258,26 @@ ensure_global_install() {
|
|
|
134
258
|
color_ok "hub-agent $(hub-agent --version)"
|
|
135
259
|
}
|
|
136
260
|
|
|
261
|
+
# Claude Code CLI を同梱でセットアップ。Cockpit 側から claude を呼び出すので、
|
|
262
|
+
# 同じ npm-global prefix に入れておくとパス解決が一貫する。
|
|
263
|
+
# 既存があれば upgrade のみ(破壊しない)。
|
|
264
|
+
ensure_claude_code() {
|
|
265
|
+
if present claude; then
|
|
266
|
+
local cur
|
|
267
|
+
cur=$(claude --version 2>/dev/null || echo "unknown")
|
|
268
|
+
color_step "Claude Code (現在 $cur) を最新版にアップデート"
|
|
269
|
+
npm install -g "$CLAUDE_CODE_PACKAGE" || color_warn "Claude Code upgrade に失敗 (既存版で継続)"
|
|
270
|
+
else
|
|
271
|
+
color_step "$CLAUDE_CODE_PACKAGE を install"
|
|
272
|
+
npm install -g "$CLAUDE_CODE_PACKAGE"
|
|
273
|
+
fi
|
|
274
|
+
if present claude; then
|
|
275
|
+
color_ok "claude $(claude --version 2>/dev/null || echo 'installed')"
|
|
276
|
+
else
|
|
277
|
+
color_warn "claude コマンドが PATH に見つかりません。新規シェルで再確認してください"
|
|
278
|
+
fi
|
|
279
|
+
}
|
|
280
|
+
|
|
137
281
|
do_enroll() {
|
|
138
282
|
if [[ -z "${HUB_AGENT_TOKEN:-}" ]]; then
|
|
139
283
|
color_warn "HUB_AGENT_TOKEN が未設定。enroll は skip します"
|
|
@@ -154,17 +298,34 @@ do_install_service() {
|
|
|
154
298
|
color_ok "install-service 完了。ログ: ~/.hub/agent.log"
|
|
155
299
|
}
|
|
156
300
|
|
|
301
|
+
macos_perm_guidance() {
|
|
302
|
+
[[ "$(uname)" != "Darwin" ]] && return 0
|
|
303
|
+
cat <<'EOF'
|
|
304
|
+
|
|
305
|
+
📣 macOS の権限ダイアログについて
|
|
306
|
+
hub-agent は tmux/pty を中継するため、初回起動時に macOS から
|
|
307
|
+
「node がローカルネットワーク上の機器を検出することを求めています」
|
|
308
|
+
「node がアクセシビリティを制御することを求めています」
|
|
309
|
+
などのダイアログが出る場合があります。すべて「許可」を選んでください。
|
|
310
|
+
許可は「システム設定 > プライバシーとセキュリティ」から後で変更できます。
|
|
311
|
+
|
|
312
|
+
EOF
|
|
313
|
+
}
|
|
314
|
+
|
|
157
315
|
main() {
|
|
158
316
|
color_step "hub-agent ワンライナーセットアップを開始"
|
|
159
317
|
ensure_brew
|
|
160
318
|
ensure_pkg tmux tmux tmux
|
|
161
319
|
ensure_node_version
|
|
320
|
+
ensure_npm_user_prefix
|
|
162
321
|
ensure_global_install
|
|
322
|
+
ensure_claude_code
|
|
163
323
|
do_enroll
|
|
164
324
|
do_install_service
|
|
165
325
|
echo ""
|
|
166
326
|
color_ok "セットアップ完了。Hub UI で online 表示を確認してください"
|
|
167
327
|
echo " https://hub.cocorograph.com/user/cockpit/agents"
|
|
328
|
+
macos_perm_guidance
|
|
168
329
|
}
|
|
169
330
|
|
|
170
331
|
main "$@"
|