環境
- Claude Code 2.1.140
- codex 0.130.0
やりたいこと
codex 向けに .agents/skills 以下で管理している skill を、Claude Code からもそのまま使いたい。
ただしClaude Codeは .agents を直接見てくれず、.claude/skills 以下に置いた skill しか認識しないようだった。
同じ内容を二重管理したくないので、.claude/skills 側にはシンボリックリンクだけ作って済ませたい。
手順
やりたいことだけ見ると、次のコマンドでいけそうに見える。
ln -s .agents/skills/drizzle-sqlite-schema .claude/skills/drizzle-sqlite-schema
しかしこれは期待通りに動かない。正しくはこうである。
ln -s ../../.agents/skills/drizzle-sqlite-schema .claude/skills/drizzle-sqlite-schema
なぜ俺のシンボリックリンクは動かないのか
理由は、ln -s の第1引数に渡した相対パスが「コマンドを実行したカレントディレクトリ基準」ではなく、「作られるシンボリックリンク自身が置かれる場所基準」で解決されるからだ。
今回作りたいリンクは .claude/skills/drizzle-sqlite-schema なので、リンクの実体は .claude/skills ディレクトリの中に置かれる。そのため、リンク先も .claude/skills から見た相対パスで書かないといけない。
ディレクトリ構造で書くとこうなる。
project-root/ ├── .agents/skills/drizzle-sqlite-schema └── .claude/skills/
.claude/skills から .agents/skills/drizzle-sqlite-schema へ行くには、いったん ../../ でプロジェクトルートまで戻る必要がある。
だからリンク先は ../../.agents/skills/drizzle-sqlite-schema になる。
逆に最初のように .agents/skills/drizzle-sqlite-schema とだけ書くと、.claude/skills から見て .claude/skills/.agents/skills/drizzle-sqlite-schema を探しにいくことになる。
そんなパスは存在しないので、壊れたリンクになるわけである。
この仕様を知らないと「プロジェクトルートで実行したのになぜ .agents/... でダメなのか」で毎回ハマる。ln -s は実行場所よりも、リンクファイルが最終的にどこへ置かれるかを意識したほうが理解しやすい。
もちろん絶対パスで書いても動く。
ln -s /absolute/path/to/project/.agents/skills/drizzle-sqlite-schema .claude/skills/drizzle-sqlite-schema
ただ、リポジトリを別の場所に clone したときに壊れやすいので、こういう用途なら相対パスで張っておくほうが扱いやすい。
まとめ
ln -s <リンク先> <リンク名>の<リンク先>が相対パスなら、基準は「リンク名が置かれるディレクトリ」- 迷ったら「リンクが置かれるディレクトリに
cdしたつもり」で相対パスを書く
自分はファイルのシンボリックリンクではあまり意識していなかったが、ディレクトリ同士をつなぐとこの仕様がかなり露骨に効いてくる。Claude Code用の skill を既存管理ディレクトリから流用したいときも、このルールを知っていれば素直に解決できる。