language-serverslisted
Install: claude install-skill devbasex/ai-plugins
# 言語サーバを設定する
**この Skill はプロジェクト(リポジトリ)ごとに実行する。利用者単位で 1 回ではない。**
言語の設定(`.serena/project.yml`)はリポジトリごとに持つため、プラグインを入れただけでは
どのリポジトリにも言語サーバは設定されない。打ち直すのは、セッションの開始の通知が
食い違い(設定に無い言語・欠けた LSP)を知らせたときである。
| 何が | 単位 |
| --- | --- |
| この Skill の実行(言語の検出・`project.yml` の書き込み・1 言語ずつの起動の検証) | プロジェクト |
| `project.yml` を追跡するか | プロジェクト(追跡すれば、同じリポジトリの他の利用者は打たずに済む) |
| 言語サーバの本体と Claude Code の LSP プラグインの導入 | 利用者(マシン・コンテナ)。この Skill は欠けを示すだけで入れない |
判断の要らない手順はすべて `scripts/serena-lsp.py` が行う。この Skill が持つのは、次の 4 つの
判断だけである。
1. 導入のコマンドを打つか(利用者に確認する)
2. `.serena/project.yml` を追跡するか(利用者に確認する)
3. 検証に失敗した言語の原因と次の手
4. 検出の誤りを名指しで直すか(`--only`)
## 1. プラグインルートを決める
Claude Code だけが `${CLAUDE_PLUGIN_ROOT}` を置き換える。Codex では、**打つ前に
`<この Skill のディレクトリ>` をランタイムから渡された実際のパスへ置き換える**。Kiro CLI は
installer が張った `.kiro/skills/language-servers` の symlink で当たる。
```bash
PLUGIN_ROOT='${CLAUDE_PLUGIN_ROOT}'
case "$PLUGIN_ROOT" in '$'*) PLUGIN_ROOT= ;; esac
ROOT=
for candidate in \
${PLUGIN_ROOT:+"$PLUGIN_ROOT/skills/language-servers"} \
"<この Skill のディレクトリ>" \
".kiro/skills/language-servers"
do
# symlink のまま上がると .kiro/ を指すため、実体へ解決してから 2 つ上がる
dir=$(cd -P "$candidate" 2>/dev/null && pwd) || continue
[ -f "$dir/../../scripts/serena-lsp.py" ] || continue
ROOT=$(cd "$dir/../.." && pwd)
break
done
[ -n "$ROOT" ] || { echo "mcp-serena のプラグインルートを解決できない" >&2; exit 1; }
echo "$ROOT"
```
以降のコマンドは、同じシェルか、`ROOT` を上の値で置き換えて打つ。
## 2. 検出して書き、1 言語ずつ検証する
```bash
python3 "$ROOT/scripts/serena-lsp.py" configure --root . --json