blog.yuzu441.com

claude code on the webでprivate marketplaceを利用する方法

tags:

claude codeには claude code on the web というブラウザやアプリからclaude codeを使える機能がある。 anthropicが用意してくれるvm環境で開発することになるので、ローカルのpcに繋いで遠隔で開発する remote control などと違いスリープ対策などを考える必要がない。 そういう訳でやってみようと思った所、privateなmarketplace repoを読み込むのにめちゃくちゃ手こずったのでメモ。

結論としては、セッション開始時にmarketplaceのリポジトリも一緒に選択して、cloneされたローカルパスに対してclaude plugin marketplace addする。

setup

駄目だった方法

vmのセットアップスクリプトでインストールコマンドを実行

vm起動時にshell scriptを実行できるのでそこでclaude plugin marketplace addを実行するという方法 これはやってみたがvmに開発対象のリポジトリ以外のcloneできないらしく、見れないということでエラーになった。

このvmはgitのトークンを直接扱わずproxy経由で触る様になっているみたいで、setup scriptのタイミングだと自分でgit cloneできる状態になっていないっぽい。 実際、起動後であればproxy経由のadd_repoで追加してもらえたが、毎回claudeに追加指示を投げてセットアップするのは面倒すぎるのでボツ。

PATトークン

厳密には試した方法ではないが、chatgptにも相談してみた所PATトークンを使って取る方法を勧められた。漏れた時のことやローテーションの手間を考えるとやりたくないよなということで試しすらしなかった。

実現できた方法

セッション開始時にリポジトリを選択する部分で作業対象のリポジトリだけでなく、複数のリポジトリを選択しcloneできるため、marketplaceのリポジトリも選択しローカルにcloneしてもらってローカルのディレクトリに対してaddを実行する。 以下は実際に設定しているsetup scriptなのでユーザースコープのCLAUDE.mdなどをsymlinkで設定する部分も入っている。

ちなみに選択しgit cloneされたリポジトリは/home/user/<リポジトリ名>という形で展開される。 claude plugin marketplace addはgitのurlだけでなくローカルパスも受け付けるので、cloneは自分でやらずにclaude code on the web側に任せて、展開されたパスを渡すだけでいい。

#!/bin/bash

set -uo pipefail

readonly ROOT_HOME='/root'
readonly CLAUDE_DIR="${ROOT_HOME}/.claude"
readonly REPO_HOME='/home/user'
# グローバルのclaude.mdやmarketplaceに入れていないものがいくつか入っている
readonly TOOLS_SETTINGS="${REPO_HOME}/claude-tools"
readonly MARKETPLACE_REPO="${REPO_HOME}/claude-marketplace"
readonly LINKED_ENTRIES=(
  CLAUDE.md
  settings.json
  agents
  commands
  rules
  skills
)

err() {
  echo "$*" >&2
}

link_entry() {
  local name="$1"
  local src="${TOOLS_SETTINGS}/${name}"
  local dest="${CLAUDE_DIR}/${name}"

  if [[ ! -e "${src}" ]]; then
    err "missing source: ${src}"
    return 0
  fi

  if [[ -d "${dest}" && ! -L "${dest}" ]]; then
    rm -rf "${dest}" || err "rm failed: ${dest}"
  fi

  ln -sfn "${src}" "${dest}" || err "symlink failed: ${src} -> ${dest}"
}

main() {
  if [[ -L "${CLAUDE_DIR}" ]]; then
    err "aborted: ${CLAUDE_DIR} is a symlink; remove it first"
    return 0
  fi

  if mkdir -p "${CLAUDE_DIR}"; then
    local name
    for name in "${LINKED_ENTRIES[@]}"; do
      link_entry "${name}"
    done
  else
    err "mkdir failed: ${CLAUDE_DIR}"
  fi

  claude plugin marketplace add "${MARKETPLACE_REPO}" || {
    err "marketplace add failed: $?"
    return 0
  }
  # xxx@yyy は <プラグイン名>@<marketplace名> に置き換える
  claude plugin install xxx@yyy \
    || err "plugin install failed: $?"
}

main "$@"

exit 0

まとめ

結局色々試してcloneするリポジトリを増やし、ローカルのmarketplaceを追加するという方法になった。 公式がいい感じの方法を提供して欲しいが、remote controlが出てきた所などあまりwebで開発していく方向性ではなく、webはscheduleの実行環境という形になっていくのだろうか。

作業するリポジトリだけ選択して、claude plugin marketplace addだけで行けるのが理想だけど、他にいい感じのセットアップ方法知りたい。

やろうと思えばvpsやaws ec2, google cloudのgceで用意できるけど、前者は固定費がかかり、後者はspot instanceなどで料金は抑えられるもののどちらも管理が面倒という問題がありwebに頑張って欲しい。