はじめに
前回の記事「[Claude Code + Codex を卒業して GitHub Copilot 一本化した「何でも相談」環境の中身]」で、相談・開発用の環境を GitHub Copilot(VS Code)に寄せた話を書きました。そこから約1か月で、また Claude Code に戻しています。この記事では、戻したあとの今の構成を全部公開します。
前々回の「[Claude Code × Codex × Obsidian Vault ― AI 二刀流で作る「何でも相談」環境の全設定公開]」から読んでいる方には「一周して帰ってきた」話になりますが、中身は最初の Claude Code 時代とはかなり違います。Copilot 期に整理した構成を、ほぼそのまま Claude Code の仕組みに載せ替えたからです。Obsidian は未経験でも読めるように書きます。
なぜ戻したのか
理由は単純で、Copilot の利用枠が月単位で、翌月にリセットされる仕組みが自分の使い方に合いませんでした。それだけです。
機能面で Copilot に不満があったわけではありません。instructions・カスタムエージェント・スキル・hooks をひとつのツールにまとめられたのは良い経験で、そこで作った「ルール本文は1か所、読み込みはポインタで」という形は Claude Code にそのまま持ち帰れました。今回の移行は、Copilot 期の設計を Claude Code の設定ファイルに翻訳する作業がほとんどでした。
Copilot 期からの対応表
何がどこへ移ったかを先に表にしておきます。
| Copilot 期 | 今(Claude Code) | 備考 |
|---|---|---|
.github/copilot-instructions.md |
CLAUDE.md |
常時ロードされる共通指示の正本 |
.github/instructions/(applyTo) |
.claude/rules/(paths) |
作業種別ごとのポインタ |
.github/agents/ |
.claude/agents/ |
reviewer は廃止し、project-auditor だけ残した |
.github/hooks/ |
.claude/settings.json の hooks
|
実処理の hooks/*.cjs はそのまま |
.github/skills/(28個) |
.claude/skills/ |
22個を移植。組み込みと重複する6個は置かない |
.vscode/mcp.json と .mcp.json
|
.mcp.json だけ |
二重管理が消えた |
/memories/ |
自動メモリー + memory-db | 後述 |
Copilot 用の設定は消さずに legacy-claude-codex/github-copilot/ へ退避してあります。いつでも戻せるようにしておく、という方針は前回から変えていません。
フォルダ構成
何でも相談-pj/
├── CLAUDE.md # 共通指示の正本(毎セッション自動ロード)
├── README.md # 初回セットアップ手順
├── .mcp.json # MCPサーバ定義(AWS Documentation / Playwright)
├── .claude/
│ ├── settings.json # 共有設定の正本(モデル・effort・権限・hooks・MCP承認)
│ ├── settings.local.json # この PC 専用の許可の蓄積(正本ではない)
│ ├── launch.json # 開発サーバのプレビュー起動設定
│ ├── rules/ # 作業種別ごとのルール(paths 付きポインタ)
│ ├── agents/ # カスタムサブエージェント(project-auditor)
│ └── skills/ # プロジェクト固有スキル(SKILL.md)
├── guidelines/ # ルール本文の正本置き場(.claude/rules/ から参照)
├── scripts/ # 補助スクリプト置き場(memory-db など)
├── hooks/ # hook の実処理スクリプト置き場
├── legacy-claude-codex/ # 旧設定の退避先(非アクティブ)
└── obsidian-vault/ # Obsidian Vault ルート(ノート/成果物は全部この下)
├── .obsidian/ # Obsidian 設定
├── daily/ # デイリーノート(YYYY-MM-DD.md)
├── coding/ # コーディング相談・実プロジェクト(reviews/ は過去のレビュー記録)
├── research/ # 技術調査・学習メモ
├── docs/ # ドキュメント下書き・成果物
├── references/ # 参考資料・URL・PDF等
└── archive/ # 終了した相談のアーカイブ
Vault 側は前回とほぼ同じです。プロジェクトルートの .github/ と .vscode/ が消え、CLAUDE.md と .claude/ に置き換わりました。前々回の Claude Code 時代にあった AGENTS.md・.codex/・.agents/ は戻していません。今は Claude Code しか使わないので、共通の入口を別に用意する必要がないからです。
CLAUDE.md ― 常時ロードされる指示の正本
CLAUDE.md は毎セッション自動で読まれるファイルで、Copilot 期の copilot-instructions.md の役割をそのまま引き継いでいます。書いているのは会話ルール、作業前の確認、フォルダごとの責務、外部送信の境界などで、細かいルール本文は書きません。
## フォルダ構成と責務
| 場所 | 役割 |
| --- | --- |
| `CLAUDE.md` | このファイル。プロジェクト共通指示の正本 |
| `.claude/settings.json` | モデル(Sonnet 5.5 / effort xhigh)、権限、hooks、MCP 承認の共有設定。設定の正本 |
| `.claude/settings.local.json` | この PC 専用の許可の蓄積。正本ではなく、消しても再作成できる |
| `.claude/rules/` | 作業種別ごとのルール。`paths` 付きポインタで、該当ファイルを読んだときだけロードされる |
| `guidelines/` | 思想、文体、ルール本文の正本置き場。`.claude/rules/` から参照する |
| `obsidian-vault/` | Obsidian Vault ルート。ノートや成果物は全てこの下に置く |
| `legacy-claude-codex/` | 旧設定(Claude Code / Codex 期、GitHub Copilot 期)の退避先。非アクティブで、参照のみ |
もうひとつ、地味に効いているのが「外部送信と本番書き込みの境界」の節です。
## 外部送信と本番書き込みの境界
次の操作は、ユーザーの明示許可があるまで preview、dry-run、読み取り、または計画提示で止めます。
- Slack、LINE、Gmail、社内ドキュメントへの投稿や送信
- Google Drive、クラウドストレージ、カレンダーの作成、更新、削除、共有変更
- 本番DB、本番API、課金、公開、削除を伴う操作
- APIキー、cookie、token、認証ファイルへのアクセスや変更
Claude Code はコネクタ経由で Gmail や Google Drive にも触れるので、「どこまでなら黙ってやってよいか」を先に書いておくと安心です。
常時ロードされるファイルは長くなるほどコンテキストを食うので、目安は200行以内にしています。
.claude/rules/ と guidelines/ ― 本文は1か所、ポインタは薄く
Copilot 期に作った二階建て構造は、ほぼそのまま移しました。ルール本文は guidelines/ に置き、.claude/rules/ にはそこを指すポインタだけを置きます。ポインタの frontmatter に paths を書いておくと、該当するファイルを扱うときだけ読み込まれます。Copilot の applyTo とほぼ同じ感覚で使えました。
---
paths:
- "obsidian-vault/coding/**"
---
# Git/gh コマンドルール(ポインタ)
`obsidian-vault/coding/` 配下のリポジトリや Git/gh 操作を扱うときは、`guidelines/git-gh-rules.md` のルールに従う。
ルール本文の正本は `guidelines/git-gh-rules.md`。ここはポインタで、内容を二重管理しない。
今あるルールは4本です。
| ポインタ | paths |
本文(正本) | 内容 |
|---|---|---|---|
encoding.md |
*.sh *.ps1 *.py *.json *.toml など |
guidelines/encoding-rules.md |
文字コード・改行・先頭行のルール |
git-gh.md |
obsidian-vault/coding/** |
guidelines/git-gh-rules.md |
Git/gh コマンドの禁止・許可制・読み取り専用の分類 |
obsidian-markdown.md |
obsidian-vault/**/*.md |
guidelines/obsidian-markdown-rules.md |
frontmatter・wikilinks・embeds・callouts |
skill-policy.md |
obsidian-vault/** |
guidelines/skill-policy.md |
スキル一覧と適用場面、humanizer の適用範囲 |
Copilot 期にあった review-flow のポインタは、後述するレビューフローの廃止と一緒に外しました。
git-gh.md だけはポインタに「要点」を数行残しています。git push は単独で実行しない、ft/ ブランチは最新の main から切る、といった事故につながる項目は、本文を読みに行く前にも目に入っていてほしいからです。
.claude/settings.json ― モデル・権限・hooks を共有設定に寄せる
プロジェクトの挙動を決める設定は .claude/settings.json に集めています。要点だけ抜粋します。
{
"model": "claude-sonnet-5-5",
"modelSettings": {
"claude-sonnet-5-5": {
"effortLevel": "xhigh"
}
},
"language": "japanese",
"claudeMdExcludes": [
"**/legacy-claude-codex/**"
],
"enabledMcpjsonServers": [
"awslabs.aws-documentation-mcp-server"
],
"disabledMcpjsonServers": [
"playwright"
],
"permissions": {
"ask": [
"Bash(git push *)",
"Bash(git reset --hard *)",
"Bash(gh pr merge *)",
"Bash(gh repo delete *)",
"PowerShell(git push *)",
"PowerShell(gh pr merge *)",
"Read(.env)",
"Read(.env.*)",
"Read(!.env.example)"
]
}
}
それぞれの狙いはこうです。
-
modelとmodelSettings:Sonnet 5.5 に固定し、effort はxhighにしています。Sonnet 5.5 はトップレベルのeffortLevelを見ないので、モデル別のmodelSettingsに書く必要があります。重い作業のときだけ、セッション内で/modelや/effortを使って切り替えます -
language:応答言語を日本語にそろえます -
claudeMdExcludes:legacy-claude-codex/には昔のCLAUDE.mdや rules が残っています。これを除外しておかないと、退避フォルダのファイルに触れたときに古い指示まで読み込まれてしまいます -
enabledMcpjsonServers/disabledMcpjsonServers:.mcp.jsonに定義したサーバのうち、どれを有効にするかをここで決めます(MCP の節で詳しく書きます) -
permissions.ask:git push、gh pr merge、gh repo deleteのようなリモート書き込みや破壊的な操作は、必ず確認プロンプトが出るようにしています。Windows では PowerShell ツール経由で同じコマンドが走ることがあるので、Bash(...)とPowerShell(...)の両方を書いています。.envの読み取りも ask にしました
権限ルールは deny → ask → allow の順で評価されます。そのため、PC ごとの settings.local.json に Bash(gh pr *) のような広い allow が溜まっていても、settings.json の ask に当たる操作では確認が出ます。両 OS で共通にしたい設定は settings.json、その PC だけの一時的な許可は settings.local.json という分け方です。
skills/ ― プロジェクト固有のスキルだけを置く
スキルの考え方は前回までと同じで、SKILL.md の description を見て、関連しそうなときだけ本文が読まれます。今 .claude/skills/ にあるのは23個です。そのうち、このプロジェクトで使い分けを決めているのは次の8つです。
| スキル | 適用場面 |
|---|---|
obsidian-markdown |
Vault 内に .md を作成・編集するとき |
humanizer |
ノート・ドキュメント・記事などの本文を生成・編集するとき |
obsidian-bases |
.base ファイルを作る・編集するとき |
json-canvas |
.canvas ファイルを作る・編集するとき |
obsidian-cli |
Obsidian 起動中に CLI から Vault を操作するとき |
defuddle |
Web ページからクリーンな Markdown を抽出するとき |
note-article-writing |
note.com 向け記事の執筆・整形・公開前チェック |
spec-writer |
開発したものの仕様書を単一 HTML(仕様書.html)で作る・更新するとき |
新しく増えたのは spec-writer です。作ったツールの現在の仕様を、コードと設定から読み起こして目次付きの HTML にまとめるスキルで、「仕様書を作って」と頼むだけで動きます。残りの15個は、フロントエンドのデザインや Web アプリのテスト、動画編集などの汎用スキルです。
逆に、Claude Code に組み込みで同じものがあるスキル(claude-api、docx、pdf、pptx、xlsx、skill-creator)は移植しませんでした。同じ名前のスキルが2つあると、スキル一覧のぶんだけコンテキストを無駄に使うからです。Copilot 期には自前で持っていたものなので、ここは Claude Code に戻して身軽になった部分です。
humanizer の適用範囲は guidelines/skill-policy.md に書いています。コードブロック・YAML frontmatter・コマンド出力・原文引用には使わない、spec-writer の仕様書では spec-writer 側の文体規則を優先する、といった線引きです。
agents/ ― 棚卸し役の1体だけ残した
Copilot 期は reviewer と project-auditor の2体を置いていましたが、今は project-auditor だけです。
---
name: project-auditor
description: ユーザーが「設定の棚卸し」「整合性チェック」などを明示的に依頼したときだけ使う。このプロジェクトの設定(CLAUDE.md、.claude/ 配下の settings・rules・agents・skills、guidelines、scripts、hooks、.mcp.json)の矛盾や二重管理を点検する。読み取り専用。
tools: Read, Grep, Glob
---
tools を Read, Grep, Glob に絞っているので、このエージェントはファイルを書き換えられません。Copilot 期に tools: [read, search] でやっていたことと同じです。
Copilot には「メインエージェントに勝手に呼ばせない」設定(disable-model-invocation)がありましたが、Claude Code のサブエージェントでは同じ書き方をしていません。代わりに description の頭に「明示的に依頼したときだけ使う」と書き、CLAUDE.md にも同じことを書いています。設定の棚卸しは頻繁にやる作業ではないので、明示的に呼んだときだけ動けば十分です。
hooks/ ― 守らせたいルールはコードで縛る
hook の実処理は Copilot 期と同じ hooks/*.cjs を使い回しています。変わったのは呼び出し側で、.claude/settings.json の hooks に書いています。
{
"hooks": {
"PreToolUse": [
{
"matcher": "Edit|Write|MultiEdit|NotebookEdit",
"hooks": [
{
"type": "command",
"command": "node",
"args": ["${CLAUDE_PROJECT_DIR}/hooks/prevent-secret-edit.cjs"],
"timeout": 15,
"statusMessage": "機密ファイルチェック中..."
}
]
}
],
"PostToolUse": [
{
"matcher": "Edit|Write|MultiEdit",
"hooks": [
{
"type": "command",
"command": "node",
"args": ["${CLAUDE_PROJECT_DIR}/hooks/check-obsidian-frontmatter.cjs"],
"timeout": 15
}
]
}
]
}
}
ポイントは "command": "node" と args を分けて書く形にしたことです。シェルを経由しないので、Windows と Mac でクォートの扱いやシェルの違いを気にしなくて済みます。スクリプトの場所は ${CLAUDE_PROJECT_DIR} で指定しているので、設定ファイルに個人環境の絶対パスも入りません。
-
prevent-secret-edit.cjs(PreToolUse):.env系、credentials、SSH 秘密鍵、.pem.keyなどの鍵・証明書は常にブロックします。json・yaml・txt などのデータ系ファイルは、ファイル名にsecrettokenpasswordなどが単語として含まれるときだけ止めます。.mdや.jsは、名前にtokenが入っていても通します。前回の記事で書いた「誤爆しないための調整」はそのまま引き継いでいます -
check-obsidian-frontmatter.cjs(PostToolUse):obsidian-vault/内の.mdに frontmatter が無いと警告します。ユーザー向けのsystemMessageと、Claude が読むadditionalContextの両方を返すので、Claude 自身も警告に気づいて直せます。ブロックはしません。この記事のような Qiita 下書きは、わざと frontmatter を付けていないからです
MCP 設定 ― .mcp.json だけにした
Copilot 期は、VS Code の Chat 用に .vscode/mcp.json(servers キー)、Agent Host 用にルートの .mcp.json(mcpServers キー)と、同じ中身を2か所に書いていました。Claude Code は .mcp.json しか読まないので、今は1ファイルです。
{
"mcpServers": {
"awslabs.aws-documentation-mcp-server": {
"command": "uvx",
"args": ["awslabs.aws-documentation-mcp-server@latest"],
"env": {
"FASTMCP_LOG_LEVEL": "ERROR",
"AWS_DOCUMENTATION_PARTITION": "aws"
}
},
"playwright": {
"command": "npx",
"args": ["-y", "@playwright/mcp@latest"]
}
}
}
どれを有効にするかは、さきほどの settings.json の enabledMcpjsonServers / disabledMcpjsonServers で決めています。AWS Documentation は常時有効にして、AWS の質問では Web 検索より先にこちらで一次情報を引くよう CLAUDE.md に書いています。Playwright は既定でオフにしてあり、ブラウザ操作が必要なときだけ /mcp から有効にして、終わったら戻します。使わない MCP はツール定義のぶんだけコンテキストを減らすので、この方針は前々回から変えていません。
レビューフローをやめた
前々回は Codex、前回は reviewer サブエージェントに、obsidian-vault/coding/reviews/ のレビュー依頼ノートを読ませてレビューさせていました。これは今回の移行でやめています。
もともと「実行役とレビュー役を分ける」のは、Claude と Codex という別のエージェントを組み合わせるための仕組みでした。Codex を使わなくなった時点で、毎回ノートを作ってまでレビューを回す理由が薄くなっていたので、Claude Code に戻すついでに整理しました。今は必要なときに組み込みのコマンドを使っています。
| コマンド | 使いどころ |
|---|---|
/code-review |
現在の差分のバグ・品質レビュー |
/security-review |
セキュリティ観点のレビュー |
/simplify |
変更したコードの重複や無駄の整理 |
review-note スキル、reviewer サブエージェント、review-flow のルールと本文は legacy-claude-codex/review-flow-2026-10-03/ に退避しました。これまでのレビューノートは記録として Vault に残していて、他のノートからの wikilink もそのまま生きています。
メモリー ― 自動メモリーと、その写しの SQLite
前回の記事では、Copilot の /memories/ に作業メモを残せるのが大きいと書きました。Claude Code にも自動メモリーがあり、ユーザーの環境や過去の決定、プロジェクトの経緯などを ~/.claude/projects/<slug>/memory/ に1件1ファイルの .md で書きためてくれます。目次の MEMORY.md が毎回読まれるので、「前にこう決めた」をいちいち説明し直さなくて済みます。
ただ、自動メモリーはプロジェクトの外にあるので、消えたり上書きされたりしても気づきにくい。そこで scripts/memory-db/ に、メモリーと過去のセッションの要約を SQLite にまとめる小さなツールを作りました。
- 正本はあくまで自動メモリーの
.mdで、SQLite はその写しです - メモリーは内容が変わったときだけ全文を変更履歴に残すので、前の版との違いを後から見られます
- 会話ログからは日時・タイトル・依頼文の先頭・編集したファイルなどだけを抜き出します。AI の API は呼びません
-
start.cmd(Mac はstart.sh)で127.0.0.1だけで待ち受ける画面が開き、ブラウザで検索・編集できます - 追加パッケージは不要で、Node 組み込みの
node:sqliteだけで動きます
Claude 側からはコマンドで使います。
node scripts/memory-db/query.js search <語> # 削除済み・古い版も含めて探す
node scripts/memory-db/query.js sessions # 最近のセッションの一覧
node scripts/memory-db/query.js restore <ファイル名> # 消えたメモリーの中身を確認(--apply で書き戻し)
この使い方は CLAUDE.md に書いています。CLAUDE.md はプロジェクトの中にあるので、自動メモリーが丸ごと消えても残り、毎回読まれます。「自動メモリーに見当たらない経緯を聞かれたら DB を探す」と書いておけば、Claude が自分で DB を引きに行ってくれます。書き戻しはユーザーの了承を取ってから --apply を付ける決まりにしています。
注意点として、memory.db 自体も Google Drive の同期対象なので、Windows と Mac で同時に起動しないようにしています。2台で同時に書くとファイルがぶつかるからです。
旧構成の扱い
legacy-claude-codex/ には、これまでの構成が3層で残っています。
| 時期 | 場所 | 中身 |
|---|---|---|
| 2026-09-10 | フォルダ直下 | Claude Code / Codex 期の .claude/・.codex/・.agents/・AGENTS.md など |
| 2026-10-03 | github-copilot/ |
Copilot 期の .github/・.vscode/ と、移行で書き換えたファイルの移行前の版 |
| 2026-10-03 | review-flow-2026-10-03/ |
廃止したレビューフロー一式 |
それぞれに README を置いて、どこから何を退避したか、戻すなら何をすればよいかを書いています。Copilot に戻したくなったら .github/ と .vscode/ をルートに戻せば動く状態です。github-copilot/ には移行で書き換えたファイルの移行前の版も残してあるので、CLAUDE.md や guidelines/ をどう書き換えたかも後から見比べられます。
まとめ:今日からマネできる最小セット
Claude Code でこの環境を組む場合の最小手順です。
- プロジェクトフォルダの中に
obsidian-vault/を作り、dailycodingresearchdocsreferencesarchiveを切る - ルートの
CLAUDE.mdに、常に守ってほしいことだけを書く(会話の言語、成果物は Vault 配下に置く、フォルダごとの責務表、外部送信の境界)。200行以内を目安に薄く保つ - 作業ごとの細かいルールは
guidelines/*.mdに本文を書き、.claude/rules/*.mdにpaths付きのポインタを置く。直すときは本文の1ファイルだけで済む -
.claude/settings.jsonでモデルと effort を固定し、git pushなどの危ない操作をpermissions.askに入れる。Sonnet 5.5 の effort はmodelSettingsに書く - 繰り返し使う知識は
.claude/skills/<スキル名>/SKILL.mdにまとめる。組み込みと同じスキルは置かない - 絶対に止めたいもの(機密ファイルの編集など)は hook にする。
"command": "node"+argsの形で${CLAUDE_PROJECT_DIR}を使うと、Mac と Windows で同じ設定が使える - MCP は
.mcp.jsonに定義し、常時使うものだけenabledMcpjsonServersで有効にする - 使わなくなった設定は消さずに退避フォルダへ移し、
claudeMdExcludesで読み込み対象から外す
3つのツールを渡り歩いてみて、残ったのは「本文は1か所、ポインタは薄く」「守らせたいことは設定とコードで縛る」「使わないものは退避して読み込ませない」という3つの考え方でした。ツールが変わっても、この3つはそのまま持ち運べています。