<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Chezmoi on AIquoteBA</title>
        <link>https://blog.mayaton.net/tags/chezmoi/</link>
        <description>Recent content in Chezmoi on AIquoteBA</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>ja-jp</language>
        <lastBuildDate>Thu, 17 Sep 2026 04:00:00 +0900</lastBuildDate><atom:link href="https://blog.mayaton.net/tags/chezmoi/index.xml" rel="self" type="application/rss+xml" /><item>
            <title>ghq環境でorg別にAGENTS.mdを配ったら @ 参照でハマった</title>
            <link>https://blog.mayaton.net/posts/ghq-org-agents-md/</link>
            <pubDate>Thu, 17 Sep 2026 04:00:00 +0900</pubDate>
            <guid>https://blog.mayaton.net/posts/ghq-org-agents-md/</guid>
            <description>&lt;h2 id=&#34;概要&#34;&gt;概要&#xA;&lt;/h2&gt;&lt;ul&gt;&#xA;&lt;li&gt;ghqで &lt;code&gt;~/ghq/github.com/&amp;lt;org&amp;gt;/&lt;/code&gt; 配下にリポジトリを並べている&lt;/li&gt;&#xA;&lt;li&gt;orgごとにClaude Code向けの共通指示を持たせたくて、&lt;code&gt;&amp;lt;org&amp;gt;/CLAUDE.md&lt;/code&gt; を置いていた&lt;/li&gt;&#xA;&lt;li&gt;あとから &lt;code&gt;AGENTS.md&lt;/code&gt; にも対応させようとしたら、&lt;code&gt;CLAUDE.md&lt;/code&gt; 側の &lt;code&gt;@AGENTS.md&lt;/code&gt; 参照が静かに解決失敗していた&lt;/li&gt;&#xA;&lt;li&gt;原因はchezmoiで貼っているsymlinkと、Claude Codeの &lt;code&gt;@&lt;/code&gt; パス解決の相性&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;前提-ghqのorg別ディレクトリ構成&#34;&gt;前提: ghqのorg別ディレクトリ構成&#xA;&lt;/h2&gt;&lt;p&gt;ghqを使うと、リポジトリは &lt;code&gt;~/ghq/github.com/&amp;lt;org&amp;gt;/&amp;lt;repo&amp;gt;/&lt;/code&gt; に整列する。&lt;br&gt;&#xA;&lt;code&gt;&amp;lt;org&amp;gt;&lt;/code&gt; ディレクトリはただの入れ物なので、ここに共通ファイルを置いておくと便利。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;~/ghq/github.com/&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;├── myorg/&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;│   ├── CLAUDE.md          # myorg 全体の共通指示&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;│   ├── repo-a/&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;│   └── repo-b/&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;└── workorg/&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ├── CLAUDE.md          # workorg 全体の共通指示&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ├── repo-x/&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    └── repo-y/&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Claude Codeはcwdから親方向に &lt;code&gt;CLAUDE.md&lt;/code&gt; を探すので、&lt;code&gt;~/ghq/github.com/myorg/repo-a/&lt;/code&gt; で起動したセッションは &lt;code&gt;myorg/CLAUDE.md&lt;/code&gt; を自動で読んでくれる。&lt;br&gt;&#xA;org単位で「このリポジトリ群は何のためのものか」「共通で守ってほしいルール」を渡せるのはかなり良い。&lt;/p&gt;&#xA;&lt;h2 id=&#34;chezmoiでsymlink配布する構成&#34;&gt;chezmoiでsymlink配布する構成&#xA;&lt;/h2&gt;&lt;p&gt;&lt;code&gt;&amp;lt;org&amp;gt;/CLAUDE.md&lt;/code&gt; の実体はdotfilesリポジトリの中に持っておきたい。&lt;br&gt;&#xA;そこでchezmoi側にファイルを集め、&lt;code&gt;.chezmoiscripts/&lt;/code&gt; からsymlinkを張る形にした。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;~/ghq/github.com/myorg/dotfiles/&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;└── org-agent-md/&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ├── myorg-claude.md&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    └── workorg-claude.md&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;chezmoiのonchangeスクリプトが、この &lt;code&gt;&amp;lt;org&amp;gt;-claude.md&lt;/code&gt; を &lt;code&gt;~/ghq/github.com/&amp;lt;org&amp;gt;/CLAUDE.md&lt;/code&gt; にsymlinkで貼る。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ln -sfn org-agent-md/myorg-claude.md ~/ghq/github.com/myorg/CLAUDE.md&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;これでdotfilesをどのマシンに配っても、org別 &lt;code&gt;CLAUDE.md&lt;/code&gt; が自動で並ぶ。&lt;/p&gt;&#xA;&lt;h2 id=&#34;agentsmdを追加したくなった&#34;&gt;AGENTS.mdを追加したくなった&#xA;&lt;/h2&gt;&lt;p&gt;Claude Codeに加えて他のエージェント (Codex等) も同居させたくなり、&lt;code&gt;AGENTS.md&lt;/code&gt; を追加することにした。&lt;br&gt;&#xA;共通の指示は &lt;code&gt;AGENTS.md&lt;/code&gt; に寄せて、&lt;code&gt;CLAUDE.md&lt;/code&gt; からは &lt;code&gt;@AGENTS.md&lt;/code&gt; の1行で参照させれば重複が消えて楽になる。&lt;/p&gt;&#xA;&lt;p&gt;構成をこう拡張した。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;~/ghq/github.com/myorg/dotfiles/&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;└── org-agent-md/&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ├── myorg-agents.md&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ├── myorg-claude.md         # 中身は「@AGENTS.md」の 1 行&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ├── workorg-agents.md&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    └── workorg-claude.md       # 中身は「@AGENTS.md」の 1 行&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;symlinkスクリプトも &lt;code&gt;-agents.md&lt;/code&gt; 側を扱うように拡張し、chezmoi applyで両方張るようにした。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ln -sfn org-agent-md/myorg-agents.md ~/ghq/github.com/myorg/AGENTS.md&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ln -sfn org-agent-md/myorg-claude.md ~/ghq/github.com/myorg/CLAUDE.md&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;これで &lt;code&gt;~/ghq/github.com/myorg/repo-a/&lt;/code&gt; でClaude Codeを起動すれば、&lt;code&gt;CLAUDE.md&lt;/code&gt; → &lt;code&gt;@AGENTS.md&lt;/code&gt; の連鎖でorg共通指示が読み込まれる、はずだった。&lt;/p&gt;&#xA;&lt;h2 id=&#34;ハマったポイント&#34;&gt;ハマったポイント&#xA;&lt;/h2&gt;&lt;p&gt;しばらく作業していて、Claude Codeがorg共通指示に沿った挙動をしていないことに気付いた。&lt;br&gt;&#xA;確認したら、&lt;code&gt;AGENTS.md&lt;/code&gt; の中身がまったく参照されていなかった。&lt;/p&gt;&#xA;&lt;p&gt;原因は &lt;code&gt;@AGENTS.md&lt;/code&gt; の解決先。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Claude Codeは &lt;code&gt;CLAUDE.md&lt;/code&gt; から &lt;code&gt;@AGENTS.md&lt;/code&gt; を辿るとき、&lt;strong&gt;実ファイルのあるディレクトリを基準に解決する&lt;/strong&gt;&lt;/li&gt;&#xA;&lt;li&gt;今回の &lt;code&gt;CLAUDE.md&lt;/code&gt; の実体は &lt;code&gt;dotfiles/org-agent-md/myorg-claude.md&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;なので &lt;code&gt;@AGENTS.md&lt;/code&gt; は &lt;code&gt;dotfiles/org-agent-md/AGENTS.md&lt;/code&gt; を探しに行く&lt;/li&gt;&#xA;&lt;li&gt;そのディレクトリに置いてあるのは &lt;code&gt;myorg-agents.md&lt;/code&gt; であって &lt;code&gt;AGENTS.md&lt;/code&gt; ではない&lt;/li&gt;&#xA;&lt;li&gt;ファイルが無いので静かに解決失敗する&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;エラーや警告は一切出ないため、Claude Codeの挙動を見ながら「なんか薄いな」と気付くまで時間がかかった。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;~/ghq/github.com/myorg/CLAUDE.md            (symlink)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    │&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    ▼&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;dotfiles/org-agent-md/myorg-claude.md       (実体)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    │  「@AGENTS.md」&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    ▼&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;dotfiles/org-agent-md/AGENTS.md             ← 無い！&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                                              (あるのは myorg-agents.md)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;~/.claude/CLAUDE.md&lt;/code&gt; の側は同ディレクトリに実体の &lt;code&gt;AGENTS.md&lt;/code&gt; を置いているので問題が起きず、org側だけで再現する構図になっていた。&lt;/p&gt;&#xA;&lt;h2 id=&#34;対策&#34;&gt;対策&#xA;&lt;/h2&gt;&lt;p&gt;symlink構成を維持したまま直すなら、&lt;code&gt;&amp;lt;org&amp;gt;-claude.md&lt;/code&gt; の中で参照名を実ファイル名に合わせるのが一番小さい。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-diff&#34; data-lang=&#34;diff&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;- @AGENTS.md&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;+ @myorg-agents.md&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;これで &lt;code&gt;dotfiles/org-agent-md/myorg-agents.md&lt;/code&gt; が確実に読まれる。&lt;br&gt;&#xA;orgが増えても &lt;code&gt;&amp;lt;org&amp;gt;-claude.md&lt;/code&gt; の中身を &lt;code&gt;@&amp;lt;org&amp;gt;-agents.md&lt;/code&gt; に揃えるだけで済むので、chezmoiの運用ともかみ合う。&lt;/p&gt;&#xA;&lt;p&gt;別解として &lt;code&gt;dotfiles/org-agent-md/&lt;/code&gt; の中にリンク解決用の &lt;code&gt;AGENTS.md&lt;/code&gt; をorgごとに別ディレクトリで持つ手もある。&lt;br&gt;&#xA;とはいえorg別に実体ディレクトリを増やす分だけ構成が重くなるので、今回は不採用にした。&lt;/p&gt;&#xA;&lt;h2 id=&#34;感想&#34;&gt;感想&#xA;&lt;/h2&gt;&lt;ul&gt;&#xA;&lt;li&gt;「symlinkの中身が同じ内容なら見え方も同じ」という素朴な期待は成立しない&lt;/li&gt;&#xA;&lt;li&gt;相対参照は実ファイル基準で解決される&lt;/li&gt;&#xA;&lt;li&gt;Claude Code側は &lt;code&gt;@&lt;/code&gt; の解決失敗を静かに握りつぶすので、参照が効いているかは実挙動で確認するしかなかった&lt;/li&gt;&#xA;&lt;li&gt;chezmoiのように「実体は別ディレクトリ、公開先はsymlink」という配布形態を取るときは、実体側で相対参照が閉じるようにファイル名を設計しておく必要がある&lt;/li&gt;&#xA;&lt;li&gt;ghqのorg別ディレクトリを「共通指示の置き場」として使うアイデア自体はかなり便利なので、この落とし穴を踏まずに広めていきたい&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
        </item></channel>
</rss>
