AIの業務活用

Claude Codeですぐ直さず、まず計画から:planモードで機能を拡張する

すでに動作している家計簿の月別集計ツールに`--by-category`オプションを追加する例を通じて、Claude Codeのplanモードで先に変更計画を確認する方法を学びます。実装前に変更範囲と出力形式を固定し、承認後に完成コードを実行して、既存の月別合計とカテゴリ別合計を両方確認します。

目次を表示

対象読者Claude Codeで既存のPythonファイルを修正する前に、変更範囲と想定結果を先に確認する習慣を身につけたい初心者

準備するもの
  • 前の記事のvibe-expenses練習フォルダとexpenses.csvが用意されていること
  • 月別合計を出力するsummarize.pyの役割を理解していること
  • Claude Codeのplanモードが読み取り・分析と計画の確認に適していることを理解していること

01小さく見える修正でも、まず変更範囲を書く

現在のsummarize.pyはexpenses.csvを読み込み、月別のamount合計を出力します。今回は既存機能を削除せず、`--by-category`オプションを指定したときだけ、各月のcategory別合計も表示するよう拡張します。機能を一つ追加するだけでも、すぐにファイルを修正させると、出力形式、既存動作を維持するかどうか、並び順といった詳細をAIが任意に決める可能性があります。そのため最初に「何をそのまま残し、何だけを変えるか」を固定します。

項目現在の動作今回の変更後
通常実行月別合計を出力同じまま維持
オプション実行なし`--by-category`のときカテゴリ別合計を追加
ライブラリPython標準ライブラリ変更なし
入力ファイルexpenses.csvを読み込む元ファイルは変更しない
検証値2026-09 = 26600, 2026-10 = 9800既存値を維持 + 9月 food 20500, transport 2900, supplies 3200

ここで重要なのは、新機能そのものより回帰を防ぐ基準です。オプションを追加しても`python summarize.py expenses.csv`の既存出力が変わってはいけません。新しいオプションの結果だけでなく、既存の実行結果も一緒に確認する必要があります。

02planモードで開始し、まだ修正できない状態にする

Claude Codeは`claude --permission-mode plan`でplanモードから開始できます。このモードは読み取り中心でコードと作業範囲を分析し、計画を確認するときに使います。初心者は既存コードがある状態でいきなり編集権限を広げるより、まず計画を出してもらう方が理解しやすくなります。

プロンプト
cd vibe-expenses
claude --permission-mode plan

セッションが始まったら、まず現在のsummarize.pyとexpenses.csvを読み、どこを変える予定か説明させます。この段階の依頼文には「まだ修正しないで」と明記します。計画が合わなければ、ファイルに触れないまま要件から直せます。

プロンプト
summarize.pyを読んで、現在の動作を先に説明してください。
次に、`--by-category`オプションを追加する変更計画だけを作成してください。まだファイルは修正しないでください。
通常実行`python summarize.py expenses.csv`の出力はそのまま維持してください。
オプション実行`python summarize.py expenses.csv --by-category`では、各月のcategory別合計を追加してください。
Python標準ライブラリだけを使い、expenses.csvは修正しないでください。
2026-09のカテゴリ別期待値はfood 20500, transport 2900, supplies 3200です。

03計画では実装方法より、抜けている条件を先に探す

計画を受け取ったら、コードが洗練されて見えるかより、要件がすべて反映されているかを先に確認します。特に既存出力の維持、オプションがない場合の動作、categoryの並び順、不正なオプションの処理、外部パッケージ追加の有無を確認します。計画が曖昧なら、実装前にもう一度質問します。

編集例
[編集例 · 実際の応答ではありません]
1. 現在のCSV読み込みと月別合計計算の構造は維持します。
2. 月別のcategory合計も累積するデータ構造を追加します。
3. 二番目の引数が`--by-category`か確認し、オプションを使うか決めます。
4. 通常実行では既存の月別合計だけを出力します。
5. オプション実行では月別合計の次の行にcategory名と合計を並べ替えて出力します。
6. 実装後、通常実行とオプション実行をそれぞれ行い、期待値と比較します。
  • 既存の通常実行の出力がそのまま維持されているか
  • オプションがあるときだけカテゴリ別結果が追加されるか
  • 新たな外部パッケージのインストールを要求していないか
  • expenses.csvを修正したり新しい形式に変えたりしていないか
  • 期待値と照合する実行コマンドが計画に含まれているか

上の計画例は説明用の編集例であり、実際のClaude Codeの応答ではありません。実際のセッションではモデルが別の実装順序を提案することがあるため、計画文そのものを正解として覚えるのではなく、自分の要件に合っているかを確認します。

04計画を確認してから実装し、完成コードを確認する

計画が要件に合っていることを確認してから実装を進めます。Claude Codeで実際にファイルを修正したりコマンドを実行したりする際は、環境や権限設定に応じて承認を求められることがあります。以下のコードは、この記事で結果検証に使った完成例です。Claude Codeの実際の応答をコピーしたものではなく、この記事の要件に合わせて作成し、GPTチャットのPython実行環境で別途実行したコードです。

プロンプト
import csv
import sys
from collections import defaultdict

def read_totals(path):
    monthly = defaultdict(int)
    by_category = defaultdict(lambda: defaultdict(int))

    with open(path, newline="", encoding="utf-8") as f:
        reader = csv.DictReader(f)
        for row in reader:
            month = row["date"][:7]
            amount = int(row["amount"])
            monthly[month] += amount
            by_category[month][row["category"]] += amount

    return monthly, by_category

def main():
    if len(sys.argv) not in (2, 3):
        print("Usage: python summarize.py expenses.csv [--by-category]")
        raise SystemExit(2)

    if len(sys.argv) == 3 and sys.argv[2] != "--by-category":
        print("Usage: python summarize.py expenses.csv [--by-category]")
        raise SystemExit(2)

    monthly, by_category = read_totals(sys.argv[1])
    show_category = len(sys.argv) == 3

    for month in sorted(monthly):
        print(f"{month} = {monthly[month]}")
        if show_category:
            for category in sorted(by_category[month]):
                print(f"  {category} = {by_category[month][category]}")

if __name__ == "__main__":
    main()

このコードはcsvモジュールとcollections.defaultdictだけを使います。通常実行では月別合計だけを出力し、正確に`--by-category`が二番目の引数として渡されたときに、月別合計の下へcategory別合計を並べ替えて表示します。別のオプションや引数数が渡された場合は使い方を表示して終了します。

05新機能だけでなく既存の実行も再確認する

機能を追加した後は、二種類の実行をどちらも確認します。まずオプションなしで実行して既存結果が維持されているか確認し、次に`--by-category`を付けて新機能を確認します。この記事のPythonコードはGPTチャットのPythonツールで実際に実行し、以下の期待出力と正確に一致しました。

プロンプト
python summarize.py expenses.csv
python summarize.py expenses.csv --by-category
プロンプト
通常実行の期待出力:
2026-09 = 26600
2026-10 = 9800

--by-categoryの期待出力:
2026-09 = 26600
  food = 20500
  supplies = 3200
  transport = 2900
2026-10 = 9800
  food = 9800

9月のcategoryの出力順はアルファベット順なので、food, supplies, transportの順です。合計値自体はシリーズ最初の記事で定めた基準値food 20500, transport 2900, supplies 3200とすべて一致します。10月はfoodだけなので9800と表示されます。

06実装を承認する前に見る短いチェックリスト

planモードの目的はAIの計画を長く受け取ることではなく、修正前に人が判断するポイントを作ることです。次のようないくつかの質問を通過すれば実装を承認し、一つでも曖昧なら先に計画を修正します。

質問今回の例の答え判断
どのファイルを変えるかsummarize.py範囲が狭い
既存の動作は維持されるかオプションなしの月別出力を維持必ず再確認
新しい動作はいつ有効になるか`--by-category`指定時条件が明確
元データは変わるかexpenses.csvは読み取りのみ変更禁止を維持
どう検証するか二つの実行コマンドと期待値を照合人が直接確認可能

次の記事では、このような変更の前後をgitで記録します。Claude Codeにチェックポイントがあっても、gitは別のバージョン管理手段です。人が変更ファイルとdiffを読む流れを身につけておくと、AIが何を変えたのかをより明確に追跡できます。

自分で確認する項目

GPTチャットのPythonツールの実行環境で、仮想expenses.csvと本文のsummarize.pyをファイルとして保存して実際に実行 · Claude Codeは実行していない

  • 通常実行で2026-09 = 26600, 2026-10 = 9800が正確に出力されるか確認
  • `--by-category`実行で2026-09 food = 20500, supplies = 3200, transport = 2900が正確に出力されるか確認
  • `--by-category`実行で2026-10 food = 9800が出力されるか確認
  • 二つの実行がどちらも終了コード0で完了するか確認
  • Python標準ライブラリだけを使い、expenses.csvを修正しないコードか確認
  • Claude Codeの計画応答例が'[編集例 · 実際の応答ではありません]'と表示されているか確認
検証範囲の限界

PythonコードはGPTチャットのPythonツールで実行して出力値を検証しましたが、Claude Codeで生成・実行した記録はありません。実際のClaude Codeの計画内容、承認画面、権限動作は利用環境やアカウント設定によって異なる場合があります。