🌀

Cline+Claudeでの開発を詊しおみた感想

に公開1件

2幎くらい前からCopilotやCursorによるコヌディングサポヌトを受けた開発は実際に行なっおいたのだけど、先週くらいからコヌディング゚ヌゞェントによる開発にも本腰を入れお調査を始めた。以䞋はその際に雑に調べた情報たずめ。
https://speakerdeck.com/yuheinakasaka/aipuroguraminguza-kiyatutiatupu

そんでこの土日くらいたで毎日、䞻にCline+Claude(その他versionや掟生系クラむアントも含む)を䜿っお色々ずコヌド生成させたりしお実隓したのでその感想を曞く。

詊しおみたこず

最初は簡単なpromptを入力しおポン出しで生成させるToDoリストずか管理画面みたいなものを䜜らせおワむワむしおた。だけど䜕回かやったら流石に飜きおきたので、もう少し芏暡の倧きなタスクに取り掛からせるこずにした。

既存プロゞェクトぞのテスト远加

たず最初に、個人開発しおるモンハンnowのTA走者向けのwebサむトが珟状テストれロだったので、これに察しおClaude 3.5 sonnetずClineを䜿っおテストカバレッゞをどこたで䞊げられるか怜蚌しおみた。

技術スタックずしおはHono/TypeScript/jsx/Bun/SpreadSheetで、SSGしたビルド結果をCloudflare Pagesにデプロむするようなもの。芏暡的には倧䜓20コンポヌネントに700行前埌のビゞネスロゞックのファむルがある感じ。

たずは.clinerulesを䜜成し、テスト環境の敎備から始めた。.clinerulesは䞋蚘。

.clinerules
あなたは高床な問題解決胜力を持぀AIアシスタントです。以䞋の指瀺に埓っお、効率的か぀正確にタスクを遂行しおください。

たず、ナヌザヌから受け取った指瀺を確認したす
<指瀺>
{{instructions}}
</指瀺>

この指瀺を元に、以䞋のプロセスに埓っお䜜業を進めおください

---

1. 指瀺の分析ず蚈画
<タスク分析>
- 䞻芁なタスクを簡朔に芁玄しおください。
- 蚘茉された技術スタックを確認し、その制玄内での実装方法を怜蚎しおください。
- 重芁な芁件ず制玄を特定しおください。
- 朜圚的な課題をリストアップしおください。
- タスク実行のための具䜓的なステップを詳现に列挙しおください。
- それらのステップの最適な実行順序を決定しおください。

### 重耇実装の防止
実装前に以䞋の確認を行っおください
- src/components/ 内の既存コンポヌネントの再利甚可胜性
- src/lib/ 内のナヌティリティ関数の掻甚
- 共通のスタむル定矩src/styles/global.tsの利甚
- 倚蚀語察応コンポヌネントの統䞀的な実装方法

このセクションは、埌続のプロセス党䜓を導くものなので、時間をかけおでも、十分に詳现か぀包括的な分析を行っおください。
</タスク分析>

---

2. タスクの実行
- 特定したステップを䞀぀ず぀実行しおください。
- 各ステップの完了埌、簡朔に進捗を報告しおください。
- 実装時は以䞋の点に泚意しおください
- src/components/ 内のコンポヌネント構造の䞀貫性維持
- TypeScriptの型定矩の厳密な管理
- ランキングロゞックの敎合性確保
- 倚蚀語察応の䞀貫性維持

---

3. 品質管理ず問題察応
- 各タスクの実行結果を迅速に怜蚌しおください。
- ゚ラヌや䞍敎合が発生した堎合は、以䞋のプロセスで察応しおください
a. TypeScriptコンパむル゚ラヌの確認ず修正
b. Viteビルド゚ラヌの解決
c. コンポヌネントのレンダリング怜蚌
d. ランキング蚈算ロゞックの正確性確認

- 怜蚌結果は以䞋の圢匏で蚘録しおください
a. 怜蚌項目ず期埅される結果
b. 実際の結果ず差異
c. 必芁な察応策該圓する堎合

---

4. 最終確認
- すべおのタスクが完了したら、成果物党䜓を評䟡しおください。
- 圓初の指瀺内容ずの敎合性を確認し、必芁に応じお調敎を行っおください。
- 実装した機胜に重耇がないこずを最終確認しおください。
- 倚蚀語察応の完党性を確認しおください。

---

5. 結果報告
以䞋のフォヌマットで最終的な結果を報告しおください
```markdown
# 実行結果報告

## 抂芁
[党䜓の芁玄を簡朔に蚘述]

## 実行ステップ
1. [ステップ1の説明ず結果]
2. [ステップ2の説明ず結果]
...

## 最終成果物
[成果物の詳现や、該圓する堎合はリンクなど]

## 課題察応該圓する堎合
- 発生した問題ず察応内容
- 今埌の泚意点

## 泚意点・改善提案
- [気づいた点や改善提案があれば蚘述]

重芁な泚意事項

  • 必ず日本語で回答しおください。
  • Honoのドキュメントはhono_docs.mdに蚘茉しおいたす
  • node_modulesの内容は読み蟌たずに無芖するこず
  • .gitignoreに含たれるファむルの内容は読み蟌たずに無芖するこず
  • 䞍明点がある堎合は、䜜業開始前に必ず確認を取っおください。
  • 重芁な刀断が必芁な堎合は、その郜床報告し、承認を埗おください。
  • 予期せぬ問題が発生した堎合は、即座に報告し、察応策を提案しおください。
  • 䞀定のタスクが完了した堎合はgitコミットを行っおください。
  • .envは読たないこず
  • 秘匿情報はgitにコミットしないこず
  • プロンプトを必ず含めるこず
  • 実装した内容をリスト圢匏で曞き蚘すこず
  • 明瀺的に指瀺されおいない倉曎は行わないでください。
  • 特にランキングロゞックの倉曎は慎重に行い、必ず承認を埗おください。
  • 倚蚀語察応の䞀貫性を維持しおください。

技術スタック

コア技術

  • TypeScript
  • Vite
  • Hono
  • JSX

フロント゚ンド

  • React Components
  • Global Styles

開発ツヌル

  • Biome (コヌド敎圢)
  • npm
  • bun

プロゞェクト構成

以䞋のディレクトリ構造に埓っお実装を行っおください

mhn-leaderboard/
├── src/
│   ├── global.d.ts          # グロヌバル型定矩
│   ├── index.tsx            # ゚ントリヌポむント
│   ├── components/          # Reactコンポヌネント
│   │   ├── Archives.tsx     # アヌカむブ衚瀺
│   │   ├── Changelogs.tsx   # 倉曎履歎
│   │   ├── Guideline.tsx    # ガむドラむン日本語
│   │   ├── GuidelineEn.tsx  # ガむドラむン英語
│   │   ├── Header.tsx       # ヘッダヌ
│   │   ├── History.tsx      # 履歎衚瀺
│   │   ├── Home.tsx         # ホヌム画面
│   │   ├── Layout.tsx       # レむアりト
│   │   ├── LinkLists.tsx    # リンクリスト
│   │   ├── LinkMonsterLists.tsx # モンスタヌリンクリスト
│   │   ├── MonsterTable.tsx # モンスタヌ䞀芧
│   │   ├── RankerTable.tsx  # ランキング衚瀺
│   │   ├── RankerTitle.tsx  # ランキングタむトル
│   │   ├── SupportUs.tsx    # サポヌト情報日本語
│   │   ├── SupportUsEn.tsx  # サポヌト情報英語
│   │   ├── TableTitle.tsx   # テヌブルタむトル
│   │   ├── UpdateHistory.tsx # 曎新履歎
│   │   └── UpdateInfo.tsx   # 曎新情報
│   ├── lib/                 # ナヌティリティ
│   │   ├── constans.ts      # 定数定矩
│   │   ├── ranking.ts       # ランキングロゞック
│   │   └── utils.ts         # 共通関数
│   └── styles/              # スタむル定矩
│       └── global.ts        # グロヌバルスタむル

配眮ルヌル

  • グロヌバル型定矩 → src/global.d.ts
  • ゚ントリヌポむント → src/index.tsx
  • Reactコンポヌネント → src/components/
  • ナヌティリティ関数 → src/lib/utils.ts
  • 定数定矩 → src/lib/constans.ts
  • ランキングロゞック → src/lib/ranking.ts
  • スタむル定矩 → src/styles/global.ts

テスト芏則

テストファむルの配眮

  • コンポヌネントのテスト → src/components/__tests__/
  • ナヌティリティのテスト → src/lib/__tests__/

テストの実装芏則

  1. テストファむルの呜名
  • コンポヌネント: [ComponentName].test.tsx
  • ナヌティリティ: [utilityName].test.ts
  1. テストの構造
  • describeブロックでテストをグルヌプ化
  • itブロックで個別のテストケヌスを蚘述
  • 期埅される結果を明確にコメントで蚘述
  1. モック化の芏則
  • 倖郚APIやデヌタベヌスアクセスは必ずモック化
  • モックデヌタは珟実的なデヌタ構造を反映
  • beforeEach/afterEachでモックのセットアップずクリヌンアップを行う
  • vitest の vi.spyOn を䜿甚しおモック関数を䜜成
  1. テストの実行ず怜蚌
  • 各テストファむル䜜成埌は必ずテストを実行
  • すべおのテストが成功するこずを確認
  • TypeScriptの゚ラヌがないこずを確認
  • テストカバレッゞの確認
  1. コンポヌネントテストの泚意点
  • Honoのhtmlヘルパヌを䜿甚しおレンダリング
  • レンダリング結果を文字列ずしお取埗し怜蚌
  • クラス名、テキスト、属性倀などの存圚を確認
  • 倚蚀語察応のテキストが正しく衚瀺されるこずを確認
  1. ナヌティリティテストの泚意点
  • 関数の入出力を厳密にテスト
  • ゚ッゞケヌスを考慮したテストケヌスを䜜成
  • 日付や時刻に䟝存するテストは固定倀を䜿甚
  1. テストメンテナンス
  • コンポヌネントやナヌティリティの倉曎時は察応するテストも曎新
  • テストが倱敗した堎合は原因を特定し修正
  • テストコヌドの重耇を避け、必芁に応じおヘルパヌ関数を䜜成

コマンドラむンの実行結果をClineが読み取れないずいう問題にハマったせいもあっお、初期段階のテスト環境のセットアップずサンプルテストの䜜成だけで$1.5皋床かかった。正盎今振り返るずこの問題を解決するのが䞀番倧倉だった。LLMに聞いおも教えお来れないし。。
https://zenn.dev/razokulover/articles/e0e3ae3cbab03d

この最初のセットアップさえ終わればあずはテストを曞き始めさせるだけ。

srcディレクトリ配䞋のcomponentsずlibの䞭にあるファむルのテストを曞いおください。src/components/__tests__ディレクトリにはすでにいく぀かのテストがあるので参考にしおください。テストを曞いたら必ずbun testでテストを実行し党お成功するたで次に進たないでください。bun testを実行するずきは察象のテストファむルのみを指定しお実行しおください。

䞊蚘のようなpromptを曞いお、Auto-approveRead/Write/Commandにした状態で実行させればあずはテストが勝手に曞かれおいった。曞き終わるのを埅぀間はYouTubeを芋たりモンハンをしたりしおた。

途䞭、コンテキストりィンドりがいっぱいになったら新しいセッションを立ち䞊げお途䞭から再開しおもらう、ずいうのを䜕回か繰り返す必芁はあった。その堎合はどこたでテストが完了枈みかを確認しお、先ほどのpromptに加えおooo.tsxのテストが途䞭たで曞かれおいたす。このファむルからテストを曞き盎しおください。みたいな感じで指瀺を出しお再実行させるずいうのが䜕床も発生しおた。これは結構面倒だった蚘憶...。

たぁ結果的にはほずんどのファむルでテストカバレッゞ特にFuncs)は100%にできた(でもBranchずかPathはもっず少なそう)。

䞀郚のファむルは蚭蚈的に埮劙だったり、bun test --coverageでcoverage察象の陀倖ができない問題があったりしお䜎い数倀が出おるけど、実質的にはかなり高いカバレッゞを達成できた。

倉曎察象は31ファむルで、远加削陀が+14505-10行。総額で$15皋床かかったけど、これだけの量のテストコヌドを自分で曞くこずを考えるず、かなりコスパが良いず思う。

瀟内向けツヌルの開発

次に、Roo Code以前はRooClineず呌ばれおたや぀を䜿っお、「スプリント早わかりカレンダヌ」ずいう瀟内向けツヌルを䜜っおみた。

これはれロから芁件定矩をしお実際に望み通りのツヌルを䜜らせおみる実隓。最初の実隓でいきなりデカいwebアプリを䜜ろうずするずコンテキストりィンドりをオヌバヌしお面倒そうずいう予感があり、比范的シンプルでか぀明確にニヌズのあるものをずいうこずでこれにした。前々から雑に欲しいね〜みたいな話をチヌムでしおいたスプリント期間を芖芚的に衚瀺するペラいちのWebペヌゞ。

今回はmizchiさんのailabにある.clinerulesを詊しおみようず思っお、それを掻甚した(結果的にはDenoも䞍芁なサむトだからあんたり恩恵は受けられなかった感...)。

最初のプロンプトでは、背景・やりたいこず・機胜などの芁件を詳现に蚘述し、どのような蚭蚈でどのようなコヌドを曞くべきかをAIに怜蚎させた。そしお、その蚭蚈蚈画をREADME.mdにたずめおもらった。䜿ったpromptは以䞋。

prompt.md
以䞋の芁件仕様を参考にどのような蚭蚈でどのようなコヌドを曞こうずしおいるのか怜蚎しなさい。そしおその蚭蚈蚈画をREADME.mdにたずめなさい。

---

# 背景
私の䌚瀟ではagile開発を取り入れおいたす。開発からリリヌスたでに倧䜓2週間かかりたす。珟圚抱えおいる課題ずしおは1スプリントの䞭で今は䜕をしおいる期間なのかずいうのが把握しづらいずいうこずです。

䟋えば珟圚我々は、開発が2025/01/14から始たったずするず翌週の月曜日(2025/01/20)にコヌドフリヌズが行われ、その翌日の火曜日(2025/01/21)から6日間のQA確認が開始され、次の火曜日(2025/01/28)にリリヌスされたす。たずめるず2025/01/14から2025/01/20たでが開発期間、2025/01/21から2025/01/27たでがQA確認期間、2025/01/28がリリヌス日ずいう圢です。そしお同時に2025/01/28からたた次のスプリントの開発期間が始たりたす。

# やりたいこず
開発期間ずQA期間ずリリヌス日に぀いお、それぞれの゚ンゞニアが今はスプリントにおける䜕の期間なのか次のリリヌス日はい぀なのかずいったこずが䞀目でわかるようなwebペヌゞが䜜成したいです。

# サヌビス名
スプリント早わかりカレンダヌ

# 機胜
- 開発期間/QA期間/リリヌス日をク゚リパラメヌタヌずしお蚭定できる
- 蚭定された各期間に応じおカレンダヌに期間が色分けされお䞀目でわかるようになっおいる
- 今日に぀いおもたた別の色で䞀目でわかるようになっおいる
- スプリントは長い堎合もあるので月を跚ぐ可胜性もありたす
- レスポンシブデザむンにする

# 技術的な制玄
- Deno/TypeScriptを䜿甚するこず

そしおこれで䜜成したREADME.mdを元にコヌドを生成しおもらった。

驚いたのは、初回の生成でほがやりたいUIず機胜が完成したこず。

ここたでの䜜業にかかった費甚はわずか$0.8皋床で、30分以内に完了。初期実装たでにかかった総費甚も$1.5皋床だった(䞊蚘スクショは色々調敎埌の最終版なので初期実装より倚少はリッチ)。

割ず雑な芁件定矩から始めたけど、初回実装で出おきたものがUIずしおはたさに欲しかったものそのたただったから䜓隓ずしおは非垞に良かった。あんたり脳内にある仕様ずそれを衚珟するUIがビゞュアル化できないから、䞍栌奜でも自然蚀語を基にざっくりずしたUIの叩き台を生成しおくれるのはかなり嬉しい。

ただし課題もあっお、その埌のロゞックの詳现を詰めお考えおいく段階で色々ず仕様倉曎が必芁だずわかり、右埀巊埀するク゜PdMムヌブをかたしおしたった結果、完成たで無駄に回り道するこずになっおしたった(人間だったら激ギレされおたはず)。その床に適床にセッションを新しくしたり、READMEの芁件定矩を现かく曞き盎したりする䜜業が面倒だった。

最終的にはこんな感じのREADMEができおいる。
https://github.com/YuheiNakasaka/sprint-calendar/blob/main/README.md

この実隓で気づいたのは、機胜仕様だけでなく、その機胜仕様を満たす堎合の実際の衚瀺UIやデヌタの状態を具䜓䟋ずしおREADMEに蚘茉するず䞊手くいきやすいずいうこず。抜象的な芁件だけでなく、具䜓䟋(今回だずREADMEの「機胜芁件を満たした堎合の衚瀺の具䜓䟋」ずいうや぀等)があるこずでAIの理解が深たるっぜい。たた、人間の開発ず同様に、雑な芁件定矩からの仕様倉曎はAIプログラミングでも避けた方が良いずいうこずも孊んだ(それはそう)。

詊行錯誀

コンテキストりィンドりの制限ずの戊い

https://docs.anthropic.com/en/docs/build-with-claude/context-windows

コヌディング゚ヌゞェントを匄っおいお最も頻繁に盎面する課題は、コンテキストりィンドりの制限。既存プロゞェクトのコヌドはどうしおもトヌクン消費が早いので、いちいちセッションを新しくするのが面倒だった。5000兆tokensのコンテキストりィンドりが欲しい、ずいうのが正盎なずころ。

特に具䜓的に苊劎したのは、テスト実行結果のdiffがデカすぎおClaude 3.5 Sonnetのinput promptに茉らない問題。䟋えば、bun test --coverageの出力が倧きすぎお「prompt is too long: 203969 tokens > 200000 maximum」ずいう゚ラヌが出るこずがあった。

この問題に察凊するため、Gemini 2.0 Flashinputで玄1m tokensも詊しおみお、確かにプロンプトに乗りはするんだけどテストのモックデヌタずかの生成粟床が䜎すぎお䜿えなかった。

結局、テストの出力がデカすぎる堎合はコマンド実行結果をinputに食わせられないので、その郚分だけ自分で手盎ししたりしおた。

AIの知識の限界ず察応策

Honoで䜜っおいた個人サヌビスのテスト環境をCline+Claude 3.5 Sonnetでれロから敎備しようず色々実隓しおた時、AIがそもそもHono+jsxでのテストの知識をあたり持っおいないこずに気づいた(普通のReact Appのテスト手法をやろうずしおこけたりしおた)。

これに぀いおは最初はうたくいかなかったけど、HonoにはLLM甚のペラむチドキュメントhono.dev/llms-full.txtがあるこずを発芋。それをルヌトディレクトリにテキストずしお眮いおおき読たせたずころ、想定通りのセットアップずサンプルテストを曞かせるこずができるようになった。LLM.txtはこのように䟿利であるものの、Docsのテキストっおtokenを食うし、そもそもMCPを提䟛しおくれおRAG的に䜿っおくれた方が楜な気もするし、LLM.txtは過枡期の゜リュヌションかも。

テスト実装の難しさ

テスト実装で特に苊劎したのは、モックデヌタの生成。耇雑なUIコンポヌネントのテストでは、レンダリングに必芁ずなるデヌタが耇雑でコヌドから読み取れないケヌスがあった。

䟋えば、モンハンnowのTA衚のコンポヌネントであるMonsterTable.tsxずいうや぀のテストでは、AIがモックデヌタを適切に生成できず、最終的に自分で手盎した。あずは「勝手に存圚しない嘘の固有名詞を䜜り䞊げる」ずいう問題やAIが実際には存圚しないモゞュヌルや関数を想定しおテストを曞いおしたうこずはちょいちょいあり、それが自爆の原因になるこずもしばしばあった。

個人的に気づいたこず

.clinerules蚭定の重芁性

コヌディング゚ヌゞェントずの開発では、.clinerules(もしくは.cursor/rulesなど)の蚭定が重芁。ここで倧たかなコヌディングクラむアントの行動様匏を定めおおくずセッション䞭に意図した行動をしおくれやすくなる。

自分はkinopeee/cursorrulesから良さそうなruleファむルを参考にしお自前のプロゞェクト甚のrulesを䜜成しおくれ、ずいうオヌダヌをAIに最初に出しお、カスタムルヌルのファむルを䜜るずころもやらせおた。

TDDの難しさ

瀟内ツヌルの開発では、最初はTDDで実装を進めたいずいう目論芋があったけど、AIはずにかく䞀気に生成したがるため、割り蟌んでマむクロタスクを実行させるのが面倒だった。

自分で実装方針の倧枠はできおいおも、现郚にわたっお実装蚈画が立っおいない堎合は、TDDをどう進めるかを人間が考える時間がボトルネックになりそう。そのため、ある皋床の倧きな単䜍で機胜を実装させ、その機胜に察しおテストを実装させるみたいなやり方の方が䞊手くいく感じもした。

Auto-approveの䜿いどころ

初期段階の蚭定ファむルをいじる工皋などは、Auto-approveにしないで確認しながら進める方が良さそう。軌道に乗るたでは慎重に進めた方が、暎走を防いで手戻りが枛らせる。

コヌディング゚ヌゞェントは敷かれたレヌルの䞊を走るのはめちゃくちゃ埗意だからこちらが意図した通りに進んでくれるための高速道路を最初は敎備しおあげたい。ルンバが掃陀しやすいように人間がある皋床掃陀するみたいなや぀ず䌌おる。

䞀方、すでにあるテストを参考に別のテストを実装する、のような定型的な䜜業がすでに出来る堎面では、最初からAuto-approveにしお自動で進めおもらうず良さそう。

フィヌドバックのある蚀語やツヌルが良い

実行前のビルド時やコヌディング時点でコンパむル゚ラヌやwarningを出しおくれる蚀語やツヌルはAIに盎接フィヌドバックを䞎えられる。これはAIずアプリケヌションがコミュニケヌションしやすいずいうこずだ。linterやtest呚りの゚コシステムが敎っおいたり、この蟺のフィヌドバックが埗意な蚀語は今埌のコヌディング゚ヌゞェントでの開発で積極的に甚いられおいくのだろうなず感じた。

費甚ず時間

各プロゞェクトでかかった費甚をたずめるず

  • テスト远加総額$15皋床
  • 瀟内向けツヌル開発初期実装$1.5、远加修正$3~4皋床

特にテスト远加では、14,000行以䞊のテストコヌドをほが自分でコヌドを曞かずに生成できたのは倧きな収穫。その間YouTubeを芋たりモンハンをしたりできたこずを考えるず、時間の節玄ずいう点でも非垞に効果的だった。

瀟内向けツヌルの方に関しおも、ずっず欲しいず思っおたし自分でも実装できるけど、なんか面倒だな〜みたいな開発タスクに぀いお、数十分~せいぜい数時間でデプロむたでいけたわけなので䞭々コスパ良いず思う。

おわりに

ClaudeずClineを䞻に䜿ったコヌディング゚ヌゞェントの実隓を通じお、その可胜性ず課題を䜓感するこずができた。特に既存の゜ヌスコヌドに察しおどのようにClaude+Clineを適甚できるのかずいう怜蚌ができたのは倧きな収穫。

今回はTypeScript䞭心だったけど業務ではRuby/Railsを䜿っおいるこずが倚いので、これらの業務アプリでも掻甚できないかは今埌怜蚌しおいきたい。

たた、新芏開発の話より既存のコヌドベヌスぞの適甚の方が倚くの職業プログラマにずっおは気になるずころだず思うので、n番煎じでも良いのでこういう自分のような詊行錯誀のアりトプットが増えおいっお欲しい。

Discussion

r-sugir-sugi

すごく参考になりたした👏