このファイルは、このリポジトリでClaude Code (claude.ai/code) を使用する際のガイダンスを提供します。
- 日本語で応対すること
Apache Pekko(Akkaからのフォーク)を使用したScala 3のCQRS/イベントソーシング実装例です。コマンド側とクエリ側を適切に分離したクリーンアーキテクチャを実証しています。
このプロジェクトはSBTをビルドツールとして使用しています。バージョン情報はproject/build.propertiesおよびproject/Dependencies.scalaを参照してください。
# 全モジュールのコンパイル
sbt compile
# テストの実行
sbt test
# カバレッジ付きテストの実行
sbt testCoverage
# コードフォーマット
sbt fmt
# フォーマットとリントのチェック
sbt lint
# クリーンとコンパイル
sbt clean compile
# 単一テストの実行
sbt "testOnly <完全修飾クラス名>"
# 特定モジュールのテスト実行
sbt "commandDomain/test"
sbt "queryInterfaceAdapter/test"
# データベースマイグレーション(クエリ側)
sbt migrateQuery # マイグレーション実行
sbt infoQuery # マイグレーション情報表示
sbt validateQuery # マイグレーション検証
sbt cleanMigrateQuery # クリーン後マイグレーション
# Docker操作
sbt dockerBuildAll # 全サービスのDockerイメージビルド
# DAO生成(クエリ側)
sbt "queryInterfaceAdapter/generateAllWithDb"このシステムはCQRS(コマンドクエリ責任分離)とイベントソーシングパターンを採用したレイヤードアーキテクチャに従っています:
modules/
├── infrastructure/ # 共有インフラコード(シリアライゼーション、ユーティリティ)
├── command/ # コマンド側(書き込みモデル)
│ ├── domain/ # ドメインエンティティ、値オブジェクト、集約
│ ├── use-case/ # アプリケーションサービス、コマンドハンドラ
│ ├── interface-adapter/ # Pekkoアクター、永続化、HTTP/gRPCエンドポイント
│ ├── interface-adapter-contract/ # コマンド用Protobuf定義
│ └── interface-adapter-event-serializer/ # イベントシリアライゼーション
└── query/ # クエリ側(読み取りモデル)
├── interface-adapter/ # GraphQL API、Slick DAO、プロジェクション
└── flyway-migration/ # データベースマイグレーション
apps/
├── command-api/ # コマンド側HTTP/gRPCサーバー
├── query-api/ # クエリ側GraphQLサーバー
└── read-model-updater/ # イベントプロセッサ(イベントから読み取りモデルを更新)
- イベントソーシング: Pekko Persistenceを使用して全ての状態変更をイベントとして記録
- CQRS: 書き込み(コマンド)と読み取り(クエリ)のモデルを分離
- アクターモデル: コマンド処理にPekko型付きアクターを使用
- イベント駆動: イベント処理により読み取りモデルを非同期に更新
- Protobuf: イベント/スナップショットのシリアライゼーションに使用
- GraphQL: Sangria GraphQLでクエリAPIを公開
- 言語: Scala 3
- ビルドツール: SBT
- アクターフレームワーク: Apache Pekko (型付きアクター、永続化、クラスター)
- シリアライゼーション: Protocol Buffers (ScalaPB経由)
- クエリAPI: GraphQL (Sangria)
- データベースアクセス: Slick
- データベース: PostgreSQL
- HTTP: Pekko HTTP
- 非同期/エフェクト: ZIO
- テスティング: ScalaTest
- Protocol Buffer定義は
src/main/protobuf/ディレクトリに配置 .protoファイル変更後はsbt compileでScalaコードを再生成- 生成コードは
target/scala-*/pekko-grpc/main/に出力される
- イベントはProtocol Buffersでシリアライズ
- カスタムシリアライザは
SerializerWithStringManifestを継承 - シリアライザIDは一意である必要がある(application.confで設定)
- クエリ側はPostgreSQLとFlywayマイグレーションを使用
- DAOクラスはsbt-dao-generatorでデータベーススキーマから自動生成
- スキーマ変更後は
sbt "queryInterfaceAdapter/generateAllWithDb"でDAOを再生成
- ユニットテストはScalaTestを使用
- Pekkoアクターは
ActorTestKitでテスト - JVM状態の問題を避けるため、テストでは
fork := trueを使用
- Conventional Commits形式を使用
- コミットメッセージは日本語で記述
- コミットに「Claude Code」への参照を含めない
- まずドメイン層またはユースケース層を変更
- 新機能を公開するためインターフェースアダプターを更新
- イベント変更時はprotobuf定義とシリアライザを更新
- クエリ側変更時はマイグレーション更新後にDAOを再生成
sbt compileでビルドが通ることを確認sbt testでテストが通ることを確認- コミット前に
sbt lintでコードスタイルをチェック