consolidated-architecture.json•20.8 kB
{
  "schema": "memory_document_v2",
  "metadata": {
    "id": "consolidated-architecture",
    "title": "統合アーキテクチャドキュメント",
    "documentType": "architecture",
    "path": "02-architecture/consolidated-architecture.json",
    "tags": [
      "architecture",
      "decision",
      "json",
      "design",
      "v2"
    ],
    "lastModified": "2025-03-21T07:21:59.899Z",
    "createdAt": "2025-03-21T10:30:00.000Z",
    "version": 2
  },
  "content": {
    "sections": [
      {
        "title": "概要",
        "content": "このドキュメントはMemory Bank 2.0のアーキテクチャ設計、決定事項、JSONベースのデータ構造に関する包括的な情報を提供します。バージョン2.0では、Markdownサポートを完全に廃止し、JSONをデータ保存形式として一本化します。このドキュメントは複数のアーキテクチャ関連ドキュメントを統合したものです。"
      },
      {
        "title": "システムアーキテクチャ概要",
        "content": "Memory Bank 2.0は、クリーンアーキテクチャのプリンシパルに従い、ドメイン層、アプリケーション層、インフラストラクチャ層、インターフェース層の明確な分離を実現しています。JSONをデータ形式として採用することで、スキーマ検証やプログラムによる操作の容易さを確保しています。"
      },
      {
        "title": "アーキテクチャパターン",
        "sections": [
          {
            "title": "クリーンアーキテクチャ",
            "content": "Memory Bank 2.0は、クリーンアーキテクチャのプリンシパルに従い、以下のレイヤーを持ちます:",
            "layers": [
              {
                "name": "ドメイン層",
                "description": "ビジネスロジックと基本的なデータ構造を含む中心的なレイヤー。JsonDocument, DocumentId, DocumentPathなどのエンティティと値オブジェクトが含まれます。"
              },
              {
                "name": "アプリケーション層",
                "description": "ユースケースを実現するためのサービスを提供するレイヤー。ドメイン層に依存しますが、インフラストラクチャ層には依存しません。"
              },
              {
                "name": "インフラストラクチャ層",
                "description": "データアクセスやファイルシステム操作などの技術的詳細を実装するレイヤー。リポジトリの実装やサービスが含まれます。"
              },
              {
                "name": "インターフェース層",
                "description": "ユーザーとの対話を担当するレイヤー。CLIやAPI、プレゼンテーションロジックが含まれます。"
              }
            ]
          },
          {
            "title": "依存性逆転の原則",
            "content": "内側のレイヤー(ドメイン、アプリケーション)は、外側のレイヤー(インフラストラクチャ、インターフェース)に依存しません。外側のレイヤーが内側のレイヤーに依存する形になります。これにより、内側のレイヤーの変更が外側に影響を与えないようになります。"
          },
          {
            "title": "リポジトリパターン",
            "content": "ドメインエンティティのストレージと検索を抽象化するためにリポジトリパターンを採用します。インターフェースを定義することで、実装の詳細から独立したコードを書くことができます。"
          },
          {
            "title": "値オブジェクトパターン",
            "content": "ID、パス、タグなどの値を表現するために値オブジェクトを使用します。これにより、型安全性とドメインロジックのカプセル化を実現します。"
          }
        ]
      },
      {
        "title": "主要コンポーネント",
        "content": "システムは以下の主要コンポーネントから構成されています:",
        "components": [
          {
            "name": "ドメインエンティティ",
            "description": "JsonDocument, DocumentId, DocumentPath などのコアエンティティ"
          },
          {
            "name": "リポジトリインターフェース",
            "description": "IMemoryDocumentRepository などのデータアクセス抽象化"
          },
          {
            "name": "ユースケース",
            "description": "各種CRUD操作のためのApplicationサービス"
          },
          {
            "name": "インフラストラクチャサービス",
            "description": "FileSystemService, IndexService などの外部システム連携"
          },
          {
            "name": "インターフェースアダプター",
            "description": "CLI, REST API などのユーザーインターフェース"
          }
        ]
      },
      {
        "title": "アーキテクチャ決定事項",
        "sections": [
          {
            "title": "JSON専用データ形式への移行",
            "content": "現在のMemory Bankはドキュメント保存形式としてMarkdownとJSONの両方をサポートしています。これにより以下の問題が発生しています:",
            "issues": [
              "双方向変換ロジックの複雑さ(Markdown⇔JSON)",
              "変換時の情報欠落リスク",
              "テストコードの肥大化",
              "マイナーアップデートの度に両方のフォーマットテストが必要",
              "スキーマの厳密な検証が難しい",
              "データベースへの将来的な移行が複雑になる"
            ],
            "decision": "Memory Bank 2.0では、JSONを唯一のデータ保存形式とし、Markdownサポートを完全に廃止する。",
            "benefits": [
              "データモデルをスキーマファーストで定義",
              "型安全性の向上",
              "検証プロセスの簡素化",
              "コードベースの軽量化",
              "将来の拡張性向上",
              "コードベースがシンプルになり、理解と保守が容易になる",
              "構造化データとしてクエリやフィルタリングが容易",
              "スキーマによる厳密な型チェックが可能",
              "テストが単純化され、カバレッジが向上",
              "将来的なデータベース(SurrealDB等)への移行パスが明確"
            ],
            "tradeoffs": [
              "Markdownの人間可読性が失われる",
              "既存のMarkdownファイルを移行する必要がある",
              "エディタ、ビューワー等のツールが必要になる",
              "バージョン1.xと互換性がなくなる"
            ],
            "mitigations": [
              "JSON→Markdown変換機能を別のレイヤー(表示レイヤー)として実装可能",
              "マイグレーションスクリプトによる既存ファイルの自動変換",
              "CLIツールの拡張でJSONの読み書きを支援",
              "明確な移行ガイドの提供"
            ]
          },
          {
            "title": "スキーマ駆動設計",
            "content": "データモデルはスキーマで厳密に定義し、すべてのデータ操作はこのスキーマに基づいて行います。",
            "decision": "Zodを使用したスキーマ検証を導入し、型安全性を確保する。",
            "benefits": [
              "実行時の型検証",
              "ドキュメント間の構造的一貫性",
              "TypeScriptの型推論による開発者体験向上",
              "バグの早期発見"
            ]
          },
          {
            "title": "リポジトリパターン",
            "content": "ドメインエンティティのストレージと検索を抽象化するためにリポジトリパターンを採用します。",
            "decision": "ストレージに依存しない操作を可能にするリポジトリインターフェースを定義する。",
            "benefits": [
              "ストレージ実装の交換可能性",
              "テスト容易性",
              "関心の分離",
              "将来的なデータベース移行の容易化"
            ]
          },
          {
            "title": "インデックス機構改善",
            "content": "現在の複数インデックスの問題を解決するために、インデックス機構を再設計します。",
            "decision": "長期的には `tags/index.json` を標準とし、`_global_index.json` は段階的に廃止する。",
            "benefits": [
              "管理の一元化",
              "メタデータの向上",
              "検索機能強化"
            ],
            "implementation": "ブラウザによるインデックス参照を保持するために当面は両方のインデックスを維持しつつ、内部的には新しいインデックス機構に移行します。"
          }
        ]
      },
      {
        "title": "データモデル",
        "sections": [
          {
            "title": "基本スキーマ構造",
            "content": "Memory Bank 2.0のすべてのドキュメントは、以下の基本構造に従います:",
            "code": "interface BaseJsonDocument {\n  schema: string;         // 例: \"memory_document_v2\"\n  metadata: {\n    id: string;           // ドキュメント一意識別子 (UUID v4)\n    title: string;        // ドキュメントタイトル\n    documentType: string; // ドキュメントタイプ識別子\n    path: string;         // 相対パス\n    tags: string[];       // タグ配列\n    createdAt: string;    // 作成日時 (ISO 8601)\n    lastModified: string; // 最終更新日時 (ISO 8601)\n    version: number;      // ドキュメントバージョン (1から開始)\n  };\n  content: Record<string, unknown>; // ドキュメントタイプ固有のコンテンツ\n}",
            "language": "typescript"
          },
          {
            "title": "ドキュメントID",
            "content": "各ドキュメントは一意のIDを持ち、ファイル名や相対パスが変更されても追跡可能にします。これにより将来的なデータベース移行も容易になります。UUIDv4形式を採用し、文書のIDとして使用します。"
          },
          {
            "title": "コアドキュメントタイプ",
            "sections": [
              {
                "title": "ブランチコンテキスト",
                "content": "ブランチの目的や背景、ユーザーストーリーなどを記録するドキュメントタイプです。",
                "code": "interface BranchContextContent {\n  branchName: string;     // ブランチ名\n  purpose: string;        // 目的説明\n  createdAt: string;      // ブランチ作成日時 (ISO 8601)\n  userStories: {\n    id: string;           // ストーリーID (UUID v4)\n    description: string;  // ストーリー説明\n    completed: boolean;   // 完了フラグ\n    priority: number;     // 優先度 (1-5)\n  }[];\n  additionalNotes?: string; // 追加メモ (オプション)\n}",
                "language": "typescript"
              },
              {
                "title": "アクティブコンテキスト",
                "content": "現在の作業状況や直近の変更点、検討事項などを記録するドキュメントタイプです。",
                "code": "interface ActiveContextContent {\n  currentWork: string;    // 現在の作業内容\n  recentChanges: {\n    date: string;         // 変更日時 (ISO 8601)\n    description: string;  // 変更内容\n  }[];\n  activeDecisions: {\n    id: string;           // 決定ID (UUID v4)\n    description: string;  // 決定内容\n    reason?: string;      // 決定理由 (オプション)\n  }[];\n  considerations: {\n    id: string;           // 検討項目ID (UUID v4)\n    description: string;  // 検討内容\n    status: 'open' | 'resolved' | 'deferred'; // 状態\n  }[];\n  nextSteps: {\n    id: string;           // ステップID (UUID v4)\n    description: string;  // 次のステップ\n    priority: 'low' | 'medium' | 'high'; // 優先度\n  }[];\n}",
                "language": "typescript"
              },
              {
                "title": "進捗状況",
                "content": "機能の実装状況や未実装機能、既知の問題などを記録するドキュメントタイプです。",
                "code": "interface ProgressContent {\n  workingFeatures: {\n    id: string;           // 機能ID (UUID v4)\n    description: string;  // 機能説明\n    implementedAt: string; // 実装日時 (ISO 8601)\n  }[];\n  pendingImplementation: {\n    id: string;           // 実装予定ID (UUID v4)\n    description: string;  // 実装予定内容\n    priority: 'low' | 'medium' | 'high'; // 優先度\n    estimatedCompletion?: string; // 完了予定日 (オプション)\n  }[];\n  status: 'planning' | 'in-development' | 'testing' | 'completed'; // 全体状態\n  completionPercentage: number; // 完了率 (0-100)\n  knownIssues: {\n    id: string;           // 問題ID (UUID v4)\n    description: string;  // 問題説明\n    severity: 'low' | 'medium' | 'high' | 'critical'; // 重要度\n    workaround?: string;  // 回避策 (オプション)\n  }[];\n}",
                "language": "typescript"
              },
              {
                "title": "システムパターン",
                "content": "技術的な決定事項や実装パターンを記録するドキュメントタイプです。",
                "code": "interface SystemPatternsContent {\n  technicalDecisions: {\n    id: string;           // 決定ID (UUID v4)\n    title: string;        // タイトル\n    context: string;      // コンテキスト\n    decision: string;     // 決定内容\n    consequences: {\n      positive: string[]; // ポジティブな影響\n      negative: string[]; // ネガティブな影響\n    };\n    status: 'proposed' | 'accepted' | 'deprecated'; // 状態\n    date: string;         // 決定日時 (ISO 8601)\n    alternatives?: {      // 検討した代替案 (オプション)\n      description: string;\n      reason: string;     // 採用しなかった理由\n    }[];\n  }[];\n  implementationPatterns?: { // 実装パターン (オプション)\n    id: string;           // パターンID (UUID v4)\n    name: string;         // パターン名\n    description: string;  // 説明\n    useCases: string[];   // ユースケース\n    codeExample?: string; // コード例 (オプション)\n  }[];\n}",
                "language": "typescript"
              }
            ]
          }
        ]
      },
      {
        "title": "ファイルシステム構造",
        "sections": [
          {
            "title": "基本ディレクトリ構造",
            "content": "Memory Bank 2.0のファイルシステム構造は以下のようになります:",
            "structure": "```\ndocs/\n  ├── branch-memory-bank/\n  │   ├── feature-xxx/\n  │   │   ├── index.json           # ブランチインデックス\n  │   │   ├── branchContext.json   # ブランチコンテキスト\n  │   │   ├── activeContext.json   # アクティブコンテキスト\n  │   │   ├── progress.json        # 進捗状況\n  │   │   ├── systemPatterns.json  # システムパターン\n  │   │   └── ..                  # その他ドキュメント\n  │   └── ..\n  ├── global-memory-bank/\n  │   ├── index.json               # グローバルインデックス\n  │   ├── 01-project/              # プロジェクト基盤\n  │   ├── 02-architecture/         # 設計・アーキテクチャ\n  │   ├── 03-implementation/       # 実装・技術\n  │   ├── 04-guides/               # ドキュメント・ガイド\n  │   ├── 05-testing/              # テスト・品質\n  │   ├── 06-releases/             # バージョン・リリース\n  │   ├── 07-infrastructure/       # インフラ・運用\n  │   ├── 08-i18n/                 # 国際化・多言語\n  │   ├── 09-refactoring/          # リファクタリング・技術的負債\n  │   └── meta/                    # メタ情報・インデックス\n  └── .index/                      # インデックスディレクトリ\n      ├── tags.json                # タグインデックス\n      ├── documents.json           # ドキュメントメタデータ\n      └── relations.json           # ドキュメント関係\n```"
          },
          {
            "title": "インデックスファイル",
            "content": "各メモリバンクはインデックスファイルを持ち、含まれるすべてのドキュメントのメタデータの概要を提供します:",
            "code": "interface MemoryBankIndex {\n  name: string;           // メモリバンク名\n  path: string;           // 相対パス\n  lastUpdated: string;    // 最終更新日時 (ISO 8601)\n  documents: {\n    id: string;           // ドキュメントID\n    title: string;        // タイトル\n    path: string;         // 相対パス\n    documentType: string; // ドキュメントタイプ\n    tags: string[];       // タグ配列\n    lastModified: string; // 最終更新日時\n  }[];\n}",
            "language": "typescript"
          }
        ]
      },
      {
        "title": "マイグレーション戦略",
        "content": "既存のMarkdownファイルからJSONへの移行に関する情報です。",
        "steps": [
          "既存のMarkdownファイルをスキャンし、ドキュメントタイプを特定",
          "ドキュメントタイプに応じた適切なコンバーターを選択",
          "Markdownをパースし、JSONに変換",
          "JSONスキーマに対してバリデーション",
          "新しいJSONファイルを保存",
          "インデックスを更新"
        ],
        "safeguards": [
          "バックアップの作成",
          "変換前後の内容比較",
          "段階的なロールアウト",
          "ロールバック計画"
        ]
      },
      {
        "title": "今後の展望",
        "content": "Memory Bank 2.0の将来的な展開方向として以下を検討しています:",
        "futureDirections": [
          {
            "name": "SurrealDB連携",
            "description": "JSONベースデータベースであるSurrealDBへの移行パスを確立し、より高度なクエリや検索機能を実現します。"
          },
          {
            "name": "リアルタイム協調編集",
            "description": "複数ユーザーによる同時編集をサポートし、メモリバンクの共同作業を強化します。"
          },
          {
            "name": "APIインターフェース",
            "description": "RESTまたはGraphQL APIを提供し、外部ツールとの連携を容易にします。"
          },
          {
            "name": "WebUI",
            "description": "ブラウザベースのインターフェースを構築し、メモリバンクの可視化と操作性を向上させます。"
          },
          {
            "name": "プラグイン拡張",
            "description": "カスタム機能を追加できるプラグインアーキテクチャを導入し、拡張性を高めます。"
          }
        ]
      },
      {
        "title": "参照先",
        "references": [
          {
            "id": "architecture-decisions-details",
            "path": "02-architecture/architecture-decisions-details.json",
            "title": "アーキテクチャ決定事項詳細"
          },
          {
            "id": "json-based-architecture-details",
            "path": "02-architecture/json-based-architecture-details.json",
            "title": "JSONベースアーキテクチャ詳細設計"
          }
        ]
      }
    ]
  }
}