💡

ClaudeCodeの日本語入力問題、完全に理解した

に公開

Aくんの新しい相棒

エンジニアのAくんは、最近話題のClaudeCodeに魅了されていました。AI駆動のコーディングアシスタントということで、「これは革命的なツールかもしれない」と期待に胸を膨らませながら使い始めたのです。

最初の1週間、Aくんは様々なプログラムを書いてClaudeCodeの能力を試していました。

1日目: シンプルなToDoアプリのPythonスクリプト
2日目: データ分析用のJupyter Notebook
3日目: REST APIのFastAPIアプリケーション
4日目: フロントエンド用のReactコンポーネント
5日目: 自動化スクリプトのBashファイル群

「すごいな、これ。まるで経験豊富なペアプログラミングパートナーと一緒に作業しているみたいだ」

ClaudeCodeの提案は的確で、コードの品質も高く、Aくんは完全にこのツールの虜になっていました。

日本語の壁

しかし、使い続けるうちに、一つの大きな問題が浮上してきました。日本語でのプロンプト入力が、予想以上にストレスフルだったのです。

最初は軽微な問題だと思っていました。たまに文字が重複したり、カーソルの位置がおかしくなったりする程度。「まあ、新しいツールだし、こんなものかな」と我慢していました。

ところが、日が経つにつれて問題は深刻化していきました。

ある日のプロンプト入力の様子:

今日はユーザー認証機能を追加したいと思います。JWTトークンを使って...

こんな風に入力しようとしているのに、気がつくと以下のような状態になっているのです:

│ > 今日はユーザー認証機今日はユーザー認証機能を追加したいと思います。JWT    │
│   トークンを使って今日はユーザー認証機能を追加したいと思います。JWTトーク    │
│   ンを使って今日はユーザー認証機能を追加したいと思います。JWTトークンを使っ    │
│   て今日はユーザー認証機能を追加したいと思います。JWTトークンを使って今日は    │
│   ユーザー認証機能を追加したいと思います。JWTトークンを使って今日はユーザー    │
│   認証機能を追加したいと思います。JWTトークンを使って...               │

「なにこれ!?」

文字が無限に繰り返され、まるで古いコンピューターがフリーズしたような状態です。Aくんは慌てて入力を中断し、ターミナルをリセットしなければなりませんでした。

エスカレートする問題

この問題は日を追うごとに頻発するようになりました。特に以下のような場面で顕著に現れました:

  • 長い説明を書こうとした時
    「今回の機能では、ユーザーがアカウントを作成する際に...」→ 文字化け地獄

  • 丁寧な敬語を使った時
    「お疲れ様です。いつもありがとうございます。本日は...」→ 無限ループ

  • 複雑な仕様を説明しようとした時
    「データベースのリレーションについて相談があります。UserテーブルとPostテーブルが...」→ 入力不能

特に困ったのは、ClaudeCodeとのコミュニケーションが雑になってしまうことでした。本来なら丁寧に状況を説明し、具体的な要望を伝えたいのに、日本語入力の問題を避けるために、どうしても短く、素っ気ない指示になってしまいます。

「コード直して」
「エラー修正」
「テスト追加」

これでは、まるで機械に命令しているようで、Aくんが求めていた「経験豊富なペアプログラミングパートナー」との協働からは程遠い状態でした。

限界点

一週間が経った頃、Aくんはついに限界を感じました。

「このままじゃ、ClaudeCodeの本当の価値を活用できない...」

素晴らしいツールなのに、インターフェースの問題で十分に活用できない。これは本当にもったいないことでした。他の開発者たちがSNSでClaudeCodeの素晴らしい活用例を投稿しているのを見る度に、Aくんは歯がゆい思いをしていました。

「みんなはこの問題に遭遇していないのかな?それとも、何か回避方法があるのかな?」

そんな疑問を抱きながら、Aくんは解決策を模索し始めました。この日本語入力問題を解決しない限り、ClaudeCodeとの真のパートナーシップは築けないと確信していたからです。

閃きの瞬間

ある日、Aくんはいつものように日本語入力と格闘していました。

「今回はAPIのエンドポイントを...」

また始まった。文字が踊り、重複し、入力不能状態になる。Aくんは深いため息をつきながら、Ctrl+Cでプロセスを中断しました。

「もう嫌だ...毎回毎回...」

そのとき、ふと思いついたのです。

「そうだ!ファイルに書いておけばいいじゃないか!」

プログラマーとして日常的にファイルを扱っているAくん。なぜ今まで気づかなかったのでしょうか。ClaudeCodeはプロジェクトのファイルを認識できるのだから、指示をファイルに書いて参照してもらえばいいのです。

「これは画期的なアイデアかもしれない」

Aくんは早速、プロジェクトディレクトリにnote.mdというファイルを作成しました。

こんにちは!いつもお世話になっています。
今日はAPIのエンドポイントを追加したいと思います。

具体的には以下の機能を実装してください:
- ユーザー情報を取得するGETエンドポイント
- ユーザー情報を更新するPUTエンドポイント
- 適切なエラーハンドリング
- バリデーション機能

よろしくお願いします!

そして、ClaudeCodeのプロンプトには短く:

@note.md

とだけ入力しました。

魔法のような体験

結果は驚くべきものでした。

「おお!これは!」

ClaudeCodeはnote.mdの内容を完璧に理解し、Aくんが求めていた通りのAPIエンドポイントを実装してくれました。しかも、丁寧に書いた指示の意図をくみ取って、エラーハンドリングやバリデーション機能まで含めた高品質なコードを生成してくれたのです。

「なんで今まで気づかなかったんだろう。これなら日本語入力の問題とは完全におさらばできる!」

Aくんは興奮していました。さらに便利なことに、CLIは入力候補をサジェストしてくれます。@noと入力すると、note.mdが候補として表示され、タブキーで補完できるのです。

「これは革命的だ!完璧な解決策を見つけた!」

新たな問題の発覚

しかし、数日間この方法を使い続けているうちに、Aくんは新たな問題に気づきました。

Gitのコミット時のことです。いつものようにgit add .を実行して、変更をステージングエリアに追加しようとした時、Aくんは気づきました。

$ git status
On branch main
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

	modified:   src/api/users.py
	modified:   tests/test_users.py
	new file:   note.md

「あ...」

note.mdがコミット対象に含まれていたのです。ファイルの中身を確認してみると:

昨日の件の続きです。ちょっと個人的な事情で作業が遅れていますが、
今日中には必ず完成させます。

あと、来週のミーティングの件で相談があります。
例の機密プロジェクトの進捗について...

「まずい!これをコミットしたら...」

Aくんの顔が青ざめました。このファイルには:

  • 個人的な事情についての言及
  • 社内の機密情報への間接的な言及
  • クライアントとの打ち合わせ内容
  • 時には愚痴やプライベートな感情

これらがコミット履歴に永久に残ってしまうのです。しかも、チームの他のメンバーや、将来プロジェクトに参加する人たちも見ることができてしまいます。

「これは絶対にコミットするわけにはいかない」

Aくんは慌ててnote.md.gitignoreに追加しました。

# 既存の設定...

# ClaudeCode用の作業メモ
note.md

これで、Gitの管理対象から除外されました。安心です。

新たな不便さ

しかし、.gitignoreに追加したことで、別の問題が発生しました。

次の日、いつものように@noと入力してタブキーを押したのですが...

「あれ?候補が出てこない」

ClaudeCodeのファイル補完機能は、Gitで管理されているファイルを優先的にサジェストします。.gitignoreに追加されたnote.mdは、候補から除外されてしまったのです。

動作に問題はありません。@note.mdと完全に入力すれば、ClaudeCodeは正しくファイルを読み込んでくれます。しかし、入力の手間が微妙に増えてしまいました。

「うーん、これはジレンマだな...」

Aくんは悩みました:

  • Gitで管理する:サジェスト機能は使えるが、プライバシー情報の漏洩リスクがある
  • Gitで管理しない:プライバシーは守られるが、入力の利便性が低下する

「なんとか、両方の利点を活かす方法はないものか...」

完璧だと思った解決策に、思わぬ落とし穴があったのです。Aくんの探求は、まだまだ続きそうでした。

カスタムスラッシュコマンドとの出会い

技術ブログでの発見

ジレンマに悩んでいたAくんは、気分転換に技術ブログを読んでいました。ClaudeCodeの活用事例を探していると、興味深い記事を発見したのです。

「ClaudeCodeのカスタムスラッシュコマンドでコードレビューを効率化する」

「スラッシュコマンド?そんな機能があったのか」

記事を読み進めると、カスタムスラッシュコマンドの魅力的な活用例が紹介されていました。

コードレビュー専用コマンドの例

ある開発チームは、コードレビューの品質を向上させるために、以下のようなカスタムスラッシュコマンドを作成していました:

# .claude/commands/code-review.md

以下の観点でコードレビューを実施してください:

## 命名規則のチェック
- 変数名、関数名、クラス名が適切で分かりやすいか
- 省略形を使いすぎていないか
- ビジネスロジックを適切に表現しているか

## 構造の問題
- 1つの関数が長すぎないか(30行以上は要検討)
- 責務が分離されているか
- 適切な抽象化レベルになっているか

## セキュリティとパフォーマンス
- SQLインジェクションなどのセキュリティ脆弱性はないか
- N+1問題などのパフォーマンス問題はないか
- 不要な処理やメモリリークの可能性はないか

## 保守性
- コメントは適切に書かれているか
- エラーハンドリングは十分か
- テストは網羅的に書かれているか

具体的な改善提案と理由も含めて回答してください。

このコマンドを/project:code-reviewとして呼び出すだけで、AIは一貫した観点で詳細なコードレビューを実施してくれるというのです。

「これは素晴らしいアイデアだ!」

他の活用例

記事には他にも魅力的な例が紹介されていました:

ドキュメント作成コマンド

# .claude/commands/documentation.md

以下の形式でAPI仕様書を作成してください:

## エンドポイント概要
- URL、HTTPメソッド、概要説明

## リクエスト仕様
- パラメータの型、必須/任意、説明
- リクエストボディの例

## レスポンス仕様
- 正常系・異常系のレスポンス例
- ステータスコードと意味

## 使用例
- curlコマンドでの実行例
- 実際のレスポンス例

技術者以外にも理解しやすい説明を心がけてください。

テスト作成コマンド

# .claude/commands/test-creation.md

以下の観点で包括的なテストを作成してください:

## 正常系テスト
- 期待される動作が正しく実行されるか
- 境界値での動作確認

## 異常系テスト
- 不正な入力に対する適切なエラーハンドリング
- エッジケースでの動作確認

## パフォーマンステスト
- 大量データでの動作確認
- メモリ使用量の確認

テストケースには分かりやすい名前を付け、
何をテストしているかコメントで明記してください。

スラッシュコマンドへの期待

カスタムスラッシュコマンドの記事を読み終えたAくんは、すっかり興奮していました。

「これで全ての問題が解決する!」

彼の頭の中では、既に完璧なワークフローが描かれていました:

  1. .claude/commands/ディレクトリに作業指示を書く
  2. /project:コマンド名で呼び出す
  3. 日本語入力問題を回避しつつ、Gitの管理からも外せる
  4. しかも、プロジェクト専用のコマンドとして体系化できる

「まさに一石三鳥だ!なぜ最初からこの方法を思いつかなかったんだろう」

Aくんは早速、プロジェクトディレクトリに.claude/commands/フォルダを作成し、note.mdファイルを作りました。

こんにちは。いつもお世話になっています。伝わったら「伝わりました」と返答してください。

シンプルなテストメッセージです。まずは基本的な動作確認から始めようと思ったのです。

「よし、これで準備完了!」

記事で読んだ通り、プロンプトに/project:noteと入力しました。EnterキーE押す瞬間、Aくんの心は期待で高鳴っていました。

期待外れの結果

しかし、ClaudeCodeの返答は期待していたものとは全く違いました。

プロジェクトは完成しています。現在のファイル構成を確認したところ、APIエンドポイント、テストファイル、ドキュメントが適切に整備されており...

「え?」

Aくんは画面を見つめ直しました。ClaudeCodeは彼の作成したnote.mdの内容ではなく、プロジェクト全体の状況報告を始めたのです。

「おかしいな...手順は間違っていないはずなのに」

Aくんは記事をもう一度確認しました。.claude/commands/ディレクトリ、ファイル名、呼び出し方法...全て記事の通りです。

「なぜ伝わらないんだ?」

状況の説明

Aくんは少し混乱しながらも、ClaudeCodeに直接状況を説明することにしました。

「カスタムスラッシュコマンドについて質問があります。技術ブログで読んだのですが、.claude/commands/note.mdというファイルを作成して、/project:noteで呼び出せるということでした。実際に試してみたのですが、うまく動作していないようです。何か設定が必要でしょうか?」

ClaudeCodeの返答は前向きでした:

カスタムスラッシュコマンドの設定は正しく行われているようですね。もう一度 /project:note を試してみてください。今度は認識されるはずです。

「そうか、最初は認識に時間がかかることもあるのかもしれない」

Aくんは希望を抱きました。しかし、念のためにテストをより明確にしようと思い、note.mdの内容を少し変更しました。

こんにちは。いつもお世話になっています。伝わったら「伝わりました」ではなく「伝わったよ」と返答してください。

「これなら、確実に判断できる」

今度こそうまくいくはず。Aくんは期待を込めながら、再び/project:noteと入力しました。

落胆の瞬間

ClaudeCodeからの返答が画面に表示された瞬間、Aくんの心は沈みました。

伝わりました。

「...伝わってない」

Aくんは力なく椅子に座り込みました。ファイルの内容を「伝わったよ」に変更したにも関わらず、ClaudeCodeは相変わらず「伝わりました」と返答したのです。これは明らかに、カスタムスラッシュコマンドが機能していない証拠でした。

「なんで...なんでうまくいかないんだ」

期待が大きかっただけに、落胆も深いものでした。完璧だと思った解決策が、実際には動作しない。またしても、日本語入力問題の根本的な解決は遠のいてしまいました。

「記事の人たちは本当にこの方法で成功しているのかな?それとも、僕が何か根本的に間違えているのかな?」

Aくんは画面を見つめながら、深いため息をつきました。新しい希望の光が見えたと思った矢先に、また暗闇に戻されてしまった気分でした。

「まだ何か他に方法があるはずだ...諦めるわけにはいかない」

一筋の希望

落胆したAくんでしたが、完全に諦めるわけにはいきませんでした。ClaudeCodeに状況を詳しく説明することにしたのです。

「先ほど、note.mdの内容を『伝わったよ』に変更したのですが、まだ『伝わりました』という返答でした。カスタムスラッシュコマンドが認識されていないようです」

すると、ClaudeCodeから興味深い推測が返ってきました:

スラッシュコマンドの変更は即時反映されない可能性があります。セッションの再起動が必要かもしれません。一度 /exit でセッションを終了して、再度起動してみてください。

「なるほど!そういうことか!」

Aくんの心に再び希望の光が差しました。確かに、新しく作成したコマンドがすぐに認識されないのは、技術的には自然なことです。キャッシュの問題かもしれないし、設定ファイルの再読み込みが必要なのかもしれません。

「よし、試してみよう」

再起動での検証

Aくんは素早く /exit と入力してセッションを終了しました。そして、改めてClaudeCodeを起動し直しました。

「さあ、今度こそ...」

プロンプトに /pro と入力した瞬間、Aくんの目が輝きました。

「おお!」

画面にサジェストが表示されたのです。/project:note という候補が、はっきりと表示されていました。これは明らかに、カスタムスラッシュコマンドが認識された証拠です。

「これは期待できそうだ!」

Aくんは興奮しながら、タブキーで補完して /project:note を実行しました。

伝わったよ。

「やった!!」

Aくんは思わず声を上げました。ClaudeCodeは確実に変更後の note.md の内容を読み取り、「伝わったよ」と返答してくれたのです。カスタムスラッシュコマンドが、ついに正常に動作しました。

「成功だ!完璧な解決策を見つけた!」

現実の壁

しかし、喜びもつかの間でした。Aくんの頭に、冷静な疑問が浮かんできたのです。

「待てよ...これって、指示を変更する度にセッションを再起動しなければならないということか?」

現実を考えてみると、これは非常に不便です。Aくんが求めているのは:

  • 日中の作業で、頻繁に指示内容を変更する
  • その都度、ClaudeCodeとやり取りしながら作業を進める
  • 一つの作業が完了したら、次の作業指示に切り替える

つまり、一日に何度も note.md の内容を書き換えることが想定されます。その度にセッションを再起動していては、作業効率が大幅に低下してしまいます。

「これは...実用的じゃないな」

Aくんは徐々に現実を理解しました。カスタムスラッシュコマンドは確かに動作します。しかし、彼の用途には向いていないのです。

スラッシュコマンドは本来、「一度作成したら繰り返し使用する」ことを前提としています。コードレビューやドキュメント作成のように、定型的な指示を効率化するためのものなのです。

一方、Aくんが必要としているのは「その場限りの、動的な指示」です。これは、スラッシュコマンドの設計思想とは根本的に異なります。

振り出しに戻る

「結局、最初の @note.md が一番確実だったということか...」

Aくんは苦笑いを浮かべました。新しい技術に期待を抱き、試行錯誤を重ねた結果、最初に見つけた解決策が最も実用的だったという、皮肉な結論に到達したのです。

カスタムスラッシュコマンドという新しい可能性を知ることができたのは収穫でした。しかし、彼の日本語入力問題に対する根本的な解決策としては機能しませんでした。

「まあ、これも勉強だ。少なくとも、スラッシュコマンドの仕組みは理解できた」

Aくんは前向きに考えることにしました。振り出しに戻ったとはいえ、@note.md という方法は確実に動作します。完璧ではないかもしれませんが、日本語入力問題を回避する実用的な解決策であることに変わりはありません。

「よし、この方法で作業を続けよう。完璧な解決策を求めすぎて、実用的な方法を見失ってはいけない」

Aくんは改めて決意を固めました。技術の探求は続けつつも、現実的な解決策でClaudeCodeとの協働を継続していくことにしたのです。

新たなアドバイザーとの出会い

振り出しに戻ったAくんでしたが、諦めるつもりはありませんでした。しかし、一人で考えていても同じ問題にぶつかるだけかもしれません。

「そうだ、ClaudeCodeではなく、チャットボットのClaudeに相談してみよう」

開発者の間では、問題に行き詰まった時に別の視点からアドバイスを求めることがよくあります。Aくんも、普段使っているチャットボット版のClaudeに相談してみることにしました。

「現在、@note.mdでClaudeCodeとやり取りしているのですが、何か問題が生じる可能性はありますか?」

Claudeからの返答は、Aくんが想定していなかった観点からの指摘でした:

チームメンバーが謎のファイルがあることに違和感を感じるかもしれません。note.mdという名前では、何のためのファイルなのか分からないからです。ファイル名をAI_INSTRUCTIONS.mdなどとしておくことで、チームメンバーも理解できます。

「なるほど!確かにそうだ」

Aくんは膝を打ちました。確かに、他の開発者がプロジェクトを見た時に、note.mdというファイルがあっても用途が分からないでしょう。しかし、AI_INSTRUCTIONS.mdなら一目瞭然です。

「これは良いアドバイスだ。早速変更しよう」

閃きの瞬間、再び

ファイル名をAI_INSTRUCTIONS.mdに変更しながら、Aくんの頭に電撃が走りました。

「待てよ...これって...」

突然、全てが繋がったのです。

「スラッシュコマンドの内容を@AI_INSTRUCTIONS.mdにしておけばいいんじゃないか!」

Aくんは興奮しました。この方法なら:

  1. スラッシュコマンド自体の内容は固定(@AI_INSTRUCTIONS.mdのみ)
  2. 実際の指示内容はAI_INSTRUCTIONS.mdに書く
  3. スラッシュコマンドは変更しないので、再起動の必要がない
  4. AI_INSTRUCTIONS.mdを書き換えるだけで、新しい指示が伝わる

「これは完璧だ!なぜ今まで気づかなかったんだ!」

実装と検証

Aくんは早速、新しいアプローチを実装しました。

まず、.claude/commands/AI.mdを作成:

@AI_INSTRUCTIONS.md

シンプルに、これだけです。

次に、AI_INSTRUCTIONS.mdに実際の指示を書きました:

何回もすみません。伝わったら『伝わったぜ!』と
返信してください。また、どのようなプロセスで伝わっているのか、あなたが理解して
いるのか興味があります。

「よし、準備完了だ」

Aくんはセッションを一度終了し、ClaudeCodeを再起動しました。プロンプトに/projeと入力すると...

「きた!」

サジェストに/AIが表示されました。正確には/project:AIなのですが、入力途中で/AIとして候補が出てくるのです。

「これは使いやすい!」

Enterキーを押すと、画面に興奮するような表示が現れました:

> /ai is running… 
  ⎿  Read AI_INSTRUCTIONS.md (2 lines)
⏺ 伝わったぜ!

ファイルを読み込んで、あなたが「何回もすみません。伝わったら『伝わったぜ!』と
返信してください。また、どのようなプロセスで伝わっているのか、あなが理解して
いるのか興味があります。」というメッセージを書いていることが理解できました。

プロセスとしては:
1. /ai コマンドで AI_INSTRUCTIONS.md ファイルが指定された
2. Read ツールを使ってファイルの内容を読み取った
3. ファイル内のあなたの指示「伝わったら『伝わったぜ!』と返信してください」を確認した
4. 指示通りに「伝わったぜ!」と返信した

このように、ツールを通じてファイルの内容を読み取り、その中の指示を理解して実行するという流れで伝わっています。

「やった!完璧に動作している!」

Aくんは飛び上がりました。ClaudeCodeは確実にAI_INSTRUCTIONS.mdの内容を読み取り、指示通りに動作しています。しかも、どのようなプロセスで処理されているかまで詳しく説明してくれました。

最終検証

興奮を抑えながら、Aくんは最後の検証を行うことにしました。以前note.mdで発生した問題、つまり.gitignoreに追加することでサジェストが効かなくなる問題が解決されているかを確認するのです。

AI_INSTRUCTIONS.mdの内容を新しいメッセージに変更:

今回は`.gitignore``AI_INSTRUCTIONS.md`を追加してみました。影響がないか実験しています。このような実験に付き合っていただき、感謝しています。

そして、.gitignoreに以下を追加:

# AI用の指示ファイル
AI_INSTRUCTIONS.md

「さあ、これが最後の試練だ」

プロンプトに/AIと入力すると...サジェストが表示されました!

「素晴らしい!」

以前のnote.mdでは.gitignoreに追加すると候補から消えてしまったのですが、今回は問題ありません。スラッシュコマンド自体は.claude/commands/AI.mdにあり、これはGitで管理されているからです。

Enterキーを押すと、期待通りの結果が返ってきました:

> /ai is running… 
  ⎿  Read AI_INSTRUCTIONS.md (2 lines)
⏺ こちらこそ、実験に参加させていただきありがとうございます!

.gitignoreにAI_INSTRUCTIONS.mdを追加するという実験ですね。これによって、このファイルがGitの追跡対象から除外され、リポジトリにコミットされなくなります。プロジェクトの他の開発者には見えないプライベートな指示ファイルとして機能するかどうかを確認されているのだと理解しました。

実験の一環として、何か特定の動作や影響を確認したいことがあれば、お気軽にお声がけください。

「完璧だ!」

Aくんは心の底から喜びました。ついに、全ての問題を解決する方法を見つけたのです:

  • ✅ 日本語入力の問題を回避
  • ✅ プライバシー情報の保護(.gitignoreで管理)
  • ✅ 入力の利便性(スラッシュコマンドのサジェスト機能)
  • ✅ チームメンバーにとって分かりやすいファイル名
  • ✅ 再起動不要の動的な指示変更

「これで、本当の意味でClaudeCodeとパートナーシップを築けるようになった」

長い探求の末に、Aくんはついに完璧な解決策を手に入れたのです。

まとめ:知識の共有

新たな相談者

それから数週間が経ったある日のこと。Aくんは自分のデスクで、いつものようにClaudeCodeと協働して作業を進めていました。

/AIと入力し、AI_INSTRUCTIONS.mdに書いた指示をスムーズに実行してもらう。この完璧なワークフローにもすっかり慣れ、もはや日本語入力の問題で悩んでいたことが遠い昔のことのように感じられました。

「今日のタスクは、APIのレスポンス最適化だな」

AI_INSTRUCTIONS.mdに作業内容を記載し、/AIコマンドを実行しようとした時、背後から困った声が聞こえてきました。

「うーん...なんで入力がうまくいかないんだろう...」

振り返ると、今年入社したばかりの後輩、美咲が困った表情でパソコンと格闘していました。

「美咲さん、どうしました?」

「あ、先輩!実は、ClaudeCodeを使ってみているんですが、日本語で指示を入力しようとすると、文字が変になってしまって...」

Aくんの目が輝きました。まさに、自分が数週間前に経験していた問題そのものです。

「あー、それです!僕も同じ問題で散々悩みました」

解決策の伝授

Aくんは美咲のデスクに近づき、画面を覗き込みました。予想通り、プロンプト入力欄で日本語が重複し、混乱した状態になっています。

「こういう状況になりますよね」

「そうなんです!英語だと問題ないんですが、日本語になると...」

「大丈夫です。完璧な解決策がありますよ」

Aくんは自信を持って答えました。そして、美咲のプロジェクトディレクトリで実演を始めました。

「まず、.claudeフォルダの中にcommandsフォルダを作ります。そして、AI.mdというファイルを作成してください」

「はい」

美咲は熱心にメモを取りながら、Aくんの指示に従いました。

AI.mdの中身は、これだけです」

@AI_INSTRUCTIONS.md

「え?これだけですか?」

「はい。次に、プロジェクトのルートディレクトリにAI_INSTRUCTIONS.mdを作成します。こちらに実際の指示を書くんです」

Aくんは美咲のために、サンプルの指示を書きました:

こんにちは!ClaudeCodeでの作業を始めます。
今日はReactコンポーネントの作成をお願いしたいと思います。
ユーザープロフィール表示用のコンポーネントを作ってください。

「なるほど...指示はこちらのファイルに書くんですね」

「そうです。そして、プロンプトには/AIと入力するだけです。途中まで入力すれば、サジェストで候補が出てきますよ」

美咲が実際に試してみると、見事に動作しました。

> /ai is running… 
  ⎿  Read AI_INSTRUCTIONS.md (3 lines)
⏺ こんにちは!Reactコンポーネントの作成ですね。
ユーザープロフィール表示用のコンポーネントを作成いたします...

「すごい!完璧に動いています!」

美咲の顔が明るくなりました。

「最後に重要なポイントです」Aくんは続けました。「AI_INSTRUCTIONS.md.gitignoreに追加してください。個人的な指示やプライベートな情報が含まれる可能性があるので、チームで共有する必要はありません」

「分かりました!本当にありがとうございます、先輩!」

美咲は感激した表情で、深々と頭を下げました。

観察者の複雑な心境

この一連のやり取りを、少し離れたデスクから見ていた人がいました。同じチームの結愛です。

結愛はAくんと同じ大学を卒業して同じ会社に入社した、いわば幼馴染の同僚でした。普段はAくんとも気軽に技術の話をする仲です。

「あいつ、すごく親切に教えてるなあ...」

結愛は自分のコーヒーカップを持ちながら、ちらちらとAくんと美咲のやり取りを眺めていました。

美咲がAくんの説明に感激している様子を見て、結愛の心の中に小さな波が立ちました。

「美咲ちゃん、すごく嬉しそう...Aくんも丁寧に教えてるし...」

もちろん、同僚が困っている時に助けるのは当然のことです。結愛もそれは理解しています。でも、なぜか心の中がざわざわしてしまいます。

「私も最近、ClaudeCodeで困ったことがあったのに...相談すればよかったかな」

実は結愛も、Aくんほど深刻ではないものの、ClaudeCodeの使い方で小さな疑問を抱えていました。でも、幼馴染という関係もあって、なんとなく相談しづらく感じていたのです。

「美咲ちゃんには優しく教えるのに...」

そんな複雑な感情を抱えながら、結愛は自分の作業に戻ろうとしました。

お約束の展開

その時、美咲が立ち上がってAくんに向かって言いました。

「先輩、本当にありがとうございました!これで作業がスムーズに進められそうです!」

「いえいえ、困った時はお互い様ですから」

Aくんも立ち上がって、謙遜しながら答えました。その瞬間、結愛がAくんの横を通り過ぎる時に...

「あ痛っ!」

Aくんは突然の痛みに声を上げました。結愛が思いっきりAくんの足を踏みつけたのです。

「何すんだよ!」

Aくんは慌てて結愛を見上げました。

「別にー?」

結愛は涼しい顔で答えると、何事もなかったかのように自分のデスクに戻っていきました。

「え?え?」

Aくんは困惑しながらも、足をさすりながら美咲の方を向き直りました。美咲も少し戸惑った表情を浮かべていましたが、特に何も言わずに自分の作業に戻っていきました。

「結愛のやつ、一体何だったんだ...?」

成長の証明

足の痛みが和らいだ頃、Aくんは満足そうな表情で自分の作業に戻りました。

「人に教えるって、いいものだな」

数週間前まで、自分も同じ問題で途方に暮れていました。それが今では、解決策を人に教えられるまでになっている。技術的な成長だけでなく、人としての成長も感じられました。

「そういえば、結愛も何か困ったことがあったら聞いてくれればいいのに」

幼馴染の結愛が、何やら機嫌が悪そうだった理由を考えながら、Aくんはそんなことを思っていました。でも、結愛は優秀なエンジニアなので、きっと自分で解決してしまうのでしょう。

「まあ、足を踏まれた理由は分からないけど...」

真の解決策の価値

この日の出来事を通じて、Aくんは改めて自分が見つけた解決策の価値を実感しました。

問題の要約:

  • ClaudeCodeでの日本語入力時に文字化けや重複が発生
  • 長い指示や丁寧な表現が入力困難
  • 結果として、AIとの効果的なコミュニケーションが阻害される

最終的な解決策:

  1. .claude/commands/AI.md@AI_INSTRUCTIONS.mdと記載
  2. 実際の指示はAI_INSTRUCTIONS.mdに日本語で詳細に記述
  3. プロンプトは/AIのみでスラッシュコマンドを実行
  4. AI_INSTRUCTIONS.md.gitignoreに追加してプライバシーを保護

この方法の利点:

  • 日本語入力問題の完全回避
  • 詳細で丁寧な指示が可能
  • プライバシー情報の保護
  • サジェスト機能による入力の効率化
  • セッション再起動不要の動的な指示変更

「これで、ClaudeCodeとの真のパートナーシップが実現できる」

Aくんは、自分のワークフローを見直しながらそう確信していました。そして、これからも同じ問題で困っている人がいたら、喜んで解決策を共有しようと心に決めたのです。

技術の探求は個人的な成長をもたらしますが、それを他人と共有することで、さらに大きな価値を生み出すのだということを、Aくんはこの日深く理解したのでした。


(一方、結愛は自分のデスクで、Aくんに何を相談しようか考えていました。そして、なぜあんなに美咲に優しく教えていたのか、もやもやした気持ちを抱えていました。でも、それはまた別の物語...)

GitHubで編集を提案

Discussion