← AI開発 資料アーカイブ
サイト・スライド生成コード

サイトセクション: CLAUDE.md 世界基準版v2.0への更新手順

元ファイル: システム要件定義の分析と汎用化方法/ClaudeMdV2Section.tsx

要約

ランディングサイトのReactセクションコンポーネント。既存のCLAUDE.md(v1.0)を世界基準版(v2.0)へ更新する差分テーブルと5ステップの追記手順を表示する。スペックドリフト防止・セッション管理・スペック検証の3新規セクション追加が中心で、各コード片にコピーボタンを備える。

要点

ReactTSXCLAUDE.mdスペックドリフトランディングページ

/**
 * ClaudeMdV2Section — 世界基準版 CLAUDE.md テンプレートセクション
 * Palette: Deep Navy (#0D1B2A) + Teal (#00C2A8) + Amber (#F5A623)
 * Typography: Space Grotesk (headings) + DM Sans (body)
 */

import { useState } from "react";

const DIFF_TABLE = [
  { section: "1. プロジェクト概要", v1: "あり", v2: "強化", change: "対応ドキュメント一覧を追加", isNew: false },
  { section: "2. 技術スタック", v1: "あり", v2: "強化", change: "バージョン明記・実行環境を追加", isNew: false },
  { section: "3. 重要なコマンド", v1: "あり", v2: "強化", change: "dry-run コマンドを追加", isNew: false },
  { section: "4. 完了基準", v1: "あり", v2: "強化", change: "PRR・ドキュメント更新を追加", isNew: false },
  { section: "5. 作業ルール", v1: "あり", v2: "強化", change: "スペックドリフト防止ルールを追加", isNew: false },
  { section: "6. 禁止事項", v1: "あり", v2: "あり", change: "CONSTRAINTS.md 参照(変更なし)", isNew: false },
  { section: "7. フェーズ管理", v1: "あり", v2: "強化", change: "完了条件を追加", isNew: false },
  { section: "8. セッション管理", v1: "なし", v2: "★新規", change: "セッション開始手順・コンテキスト枯渇対策", isNew: true },
  { section: "9. スペック検証", v1: "なし", v2: "★新規", change: "定期確認プロンプト(SD-01相当)", isNew: true },
  { section: "10. 変更履歴", v1: "なし", v2: "★新規", change: "バージョン管理", isNew: true },
];

const STEPS = [
  {
    step: 1,
    title: "作業ルールにスペックドリフト防止を追加",
    desc: "既存の「作業ルール」セクションの末尾に追記する",
    code: `### スペックドリフト防止(Spec Drift Prevention)
- 設計(SDD)から逸脱する実装をする場合は必ず報告すること
- 「この実装は SDD の設計と異なります:[理由]」と明示すること
- CLAUDE.md の指示と矛盾する要求を受けた場合は、
  矛盾を報告してから実行すること`,
  },
  {
    step: 2,
    title: "セッション管理セクションを追加",
    desc: "CLAUDE.md の末尾に追加する",
    code: `## セッション管理(Session Management)

### セッション開始時の確認手順(毎回必ず実行)
1. progress.md を読んで前回の状態を把握する
2. git log --oneline -5 で最近の変更を確認する
3. テストが通るか確認する
4. 現状を私に報告する

### コンテキスト枯渇対策(50往復以上になったら)
1. 現在の作業を git commit する
2. progress.md を最新状態に更新する
3. 「コンテキスト枯渇の兆候があります」と報告する`,
  },
  {
    step: 3,
    title: "スペック検証セクションを追加",
    desc: "CLAUDE.md の末尾に追加する",
    code: `## スペック検証(Spec Verification)

### 定期確認プロンプト(週1回または機能完成時)
スペックドリフトチェックを実施してください。
1. 全ての機能要件が実装されているか確認する
2. SDD の設計通りに実装されているか確認する
3. CLAUDE.md の禁止事項が守られているか確認する
逸脱が見つかった場合は「SD-ALERT: [内容]」で報告してください。`,
  },
  {
    step: 4,
    title: "CONSTRAINTS.md にテスト改ざん禁止を追加",
    desc: "CONSTRAINTS.md の「絶対禁止」セクションに追記する",
    code: `## スペックドリフト防止ルール
- SDD の設計から逸脱する場合は必ず報告する
- テストを削除・無効化・コメントアウトしてはならない
- テストの期待値を「通過させるため」に変更してはならない
  (テスト改ざん禁止)`,
  },
  {
    step: 5,
    title: "progress.md にスペックドリフト記録欄を追加",
    desc: "progress.md の末尾に追記する",
    code: `## スペックドリフト記録
(設計から逸脱した変更の記録)
| 日付 | 逸脱内容 | 理由 | 対処 |
|-----|--------|------|------|
(記録なし)

## 最終スペック検証日
[YYYY-MM-DD](スペックドリフトチェック実施日)`,
  },
];

function CopyButton({ text }: { text: string }) {
  const [copied, setCopied] = useState(false);
  const handleCopy = () => {
    navigator.clipboard.writeText(text);
    setCopied(true);
    setTimeout(() => setCopied(false), 2000);
  };
  return (
    <button
      onClick={handleCopy}
      className="text-xs px-3 py-1 rounded transition-all duration-200"
      style={{
        background: copied ? "rgba(0,194,168,0.2)" : "rgba(255,255,255,0.08)",
        color: copied ? "#00C2A8" : "#8BA3BC",
        border: "1px solid rgba(255,255,255,0.1)",
      }}
    >
      {copied ? "✓ コピー済み" : "コピー"}
    </button>
  );
}

export default function ClaudeMdV2Section() {
  const [activeStep, setActiveStep] = useState<number | null>(null);

  return (
    <section
      id="claude-md-v2"
      style={{ background: "#0A1520", borderTop: "1px solid #1E3A5F" }}
      className="py-24"
    >
      <div className="max-w-6xl mx-auto px-6">
        {/* Header */}
        <div className="mb-16">
          <p
            className="text-xs font-semibold tracking-[0.2em] uppercase mb-4"
            style={{ color: "#00C2A8" }}
          >
            CLAUDE.md WORLD STANDARD v2.0
          </p>
          <h2
            className="text-4xl md:text-5xl font-black mb-6"
            style={{ fontFamily: "'Space Grotesk', sans-serif", color: "#F0F4F8" }}
          >
            CLAUDE.md を
            <br />
            <span style={{ color: "#00C2A8" }}>世界基準版に更新する</span>
          </h2>
          <p className="text-lg max-w-2xl" style={{ color: "#8BA3BC", fontFamily: "'DM Sans', sans-serif" }}>
            既存の CLAUDE.md(v1.0)に3つのセクションを追加するだけで、
            Anthropic公式SDD準拠のドリフト対策が有効化される。所要時間:5分。
          </p>
        </div>

        {/* v1.0 vs v2.0 差分テーブル */}
        <div
          className="rounded-2xl p-8 mb-12"
          style={{ background: "rgba(255,255,255,0.02)", border: "1px solid rgba(255,255,255,0.06)" }}
        >
          <h3
            className="text-xl font-black mb-6"
            style={{ fontFamily: "'Space Grotesk', sans-serif", color: "#F0F4F8" }}
          >
            v1.0 → v2.0 変更差分
          </h3>
          <div className="overflow-x-auto">
            <table className="w-full text-sm">
              <thead>
                <tr style={{ borderBottom: "1px solid rgba(255,255,255,0.08)" }}>
                  <th className="text-left py-3 pr-4" style={{ color: "#8BA3BC", fontFamily: "'Space Grotesk', sans-serif" }}>セクション</th>
                  <th className="text-center py-3 px-4 w-20" style={{ color: "#8BA3BC" }}>v1.0</th>
                  <th className="text-center py-3 px-4 w-20" style={{ color: "#8BA3BC" }}>v2.0</th>
                  <th className="text-left py-3 pl-4" style={{ color: "#8BA3BC" }}>変更内容</th>
                </tr>
              </thead>
              <tbody>
                {DIFF_TABLE.map((row, i) => (
                  <tr
                    key={i}
                    style={{
                      borderBottom: "1px solid rgba(255,255,255,0.04)",
                      background: row.isNew ? "rgba(0,194,168,0.04)" : "transparent",
                    }}
                  >
                    <td
                      className="py-3 pr-4 font-medium"
                      style={{ color: row.isNew ? "#00C2A8" : "#F0F4F8", fontFamily: "'Space Grotesk', sans-serif" }}
                    >
                      {row.section}
                    </td>
                    <td className="text-center py-3 px-4">
                      <span
                        className="text-xs px-2 py-0.5 rounded"
                        style={{
                          background: row.v1 === "なし" ? "rgba(239,68,68,0.1)" : "rgba(255,255,255,0.06)",
                          color: row.v1 === "なし" ? "#EF4444" : "#8BA3BC",
                        }}
                      >
                        {row.v1}
                      </span>
                    </td>
                    <td className="text-center py-3 px-4">
                      <span
                        className="text-xs px-2 py-0.5 rounded font-semibold"
                        style={{
                          background: row.isNew ? "rgba(0,194,168,0.15)" : "rgba(245,166,35,0.1)",
                          color: row.isNew ? "#00C2A8" : "#F5A623",
                        }}
                      >
                        {row.v2}
                      </span>
                    </td>
                    <td className="py-3 pl-4 text-sm" style={{ color: "#8BA3BC", fontFamily: "'DM Sans', sans-serif" }}>
                      {row.change}
                    </td>
                  </tr>
                ))}
              </tbody>
            </table>
          </div>
        </div>

        {/* 5ステップ更新手順 */}
        <div className="mb-12">
          <h3
            className="text-2xl font-black mb-8"
            style={{ fontFamily: "'Space Grotesk', sans-serif", color: "#F0F4F8" }}
          >
            5ステップ更新手順(5分で完了)
          </h3>
          <div className="space-y-4">
            {STEPS.map((s) => (
              <div
                key={s.step}
                className="rounded-xl overflow-hidden"
                style={{
                  border: activeStep === s.step ? "1px solid rgba(0,194,168,0.4)" : "1px solid rgba(255,255,255,0.06)",
                  background: activeStep === s.step ? "rgba(0,194,168,0.04)" : "rgba(255,255,255,0.02)",
                }}
              >
                <button
                  className="w-full text-left p-5 flex items-center gap-4"
                  onClick={() => setActiveStep(activeStep === s.step ? null : s.step)}
                >
                  <div
                    className="flex-shrink-0 w-9 h-9 rounded-full flex items-center justify-center text-sm font-black"
                    style={{
                      background: activeStep === s.step ? "rgba(0,194,168,0.2)" : "rgba(255,255,255,0.06)",
                      color: activeStep === s.step ? "#00C2A8" : "#8BA3BC",
                      fontFamily: "'Space Grotesk', sans-serif",
                    }}
                  >
                    {s.step}
                  </div>
                  <div className="flex-1">
                    <h4
                      className="font-bold text-base"
                      style={{ color: "#F0F4F8", fontFamily: "'Space Grotesk', sans-serif" }}
                    >
                      {s.title}
                    </h4>
                    <p className="text-sm mt-0.5" style={{ color: "#8BA3BC" }}>{s.desc}</p>
                  </div>
                  <span className="text-xs" style={{ color: "rgba(0,194,168,0.6)" }}>
                    {activeStep === s.step ? "▲" : "▼"}
                  </span>
                </button>
                {activeStep === s.step && (
                  <div
                    className="px-5 pb-5"
                    style={{ borderTop: "1px solid rgba(255,255,255,0.06)" }}
                  >
                    <div
                      className="rounded-lg p-4 mt-4 relative"
                      style={{ background: "rgba(0,0,0,0.3)", border: "1px solid rgba(255,255,255,0.06)" }}
                    >
                      <div className="absolute top-3 right-3">
                        <CopyButton text={s.code} />
                      </div>
                      <pre
                        className="text-xs overflow-x-auto pr-24"
                        style={{ color: "#A8C4D8", fontFamily: "'DM Mono', 'Courier New', monospace", lineHeight: "1.6", whiteSpace: "pre-wrap" }}
                      >
                        {s.code}
                      </pre>
                    </div>
                  </div>
                )}
              </div>
            ))}
          </div>
        </div>

        {/* ドリフト対策の効果 */}
        <div
          className="rounded-2xl p-8"
          style={{ background: "rgba(0,194,168,0.05)", border: "1px solid rgba(0,194,168,0.15)" }}
        >
          <h3
            className="text-xl font-black mb-6"
            style={{ fontFamily: "'Space Grotesk', sans-serif", color: "#F0F4F8" }}
          >
            ドリフト対策を有効化すると何が変わるか
          </h3>
          <div className="grid md:grid-cols-3 gap-6">
            {[
              {
                icon: "🛡️",
                title: "スペックドリフトを早期発見",
                desc: "Claude Code が CLAUDE.md の指示を無視した場合、SD-ALERT として即座に報告される。Anthropic の公式調査で確認された「指示無視バグ」を人間が検知できる状態になる。",
              },
              {
                icon: "🔄",
                title: "セッション切り替えがスムーズ",
                desc: "50往復を超えたコンテキスト枯渇時も、progress.md + git log の確認手順により、新セッションで「どこまで進んでいたか」を正確に把握できる。",
              },
              {
                icon: "🧪",
                title: "テスト改ざんを防止",
                desc: "「テストを通過させるためにテストを書き換える」という最も危険な失敗パターンを CONSTRAINTS.md の明示的な禁止事項として防止する。",
              },
            ].map((item, i) => (
              <div key={i}>
                <div className="text-3xl mb-3">{item.icon}</div>
                <h4
                  className="font-bold text-base mb-2"
                  style={{ color: "#F0F4F8", fontFamily: "'Space Grotesk', sans-serif" }}
                >
                  {item.title}
                </h4>
                <p className="text-sm" style={{ color: "#8BA3BC", fontFamily: "'DM Sans', sans-serif" }}>
                  {item.desc}
                </p>
              </div>
            ))}
          </div>
        </div>
      </div>
    </section>
  );
}

↑ トップへ戻る