変更履歴
MBC CQRS Serverlessのすべての注目すべき変更がここに記録されています。このプロジェクトはセマンティックバージョニングとConventional Commitsに従っています。
バージョン体系
x.y.z- 本番リリースx.y.z-beta.n- テスト用ベータリリースx.y.z-alpha.n- 早期アクセス用アルファリリース
安定版リリース (1.x)
1.3.1 (2026-06-02)
新機能
- core: グループベースのロール認可を追加 —
RolesGuardはまずcustom:rolesの直接ロールを確認し、次に新しいcustom:groupsクレームに含まれるユーザーのグループから導出されたロールを確認します (詳細を見る) (PR #440)- 新しい
@GroupRoleResolver()デコレータとIGroupRoleResolverインターフェース — アプリごとに 1 つだけリゾルバを実装し、グループ ID をロールにマッピングします(DynamoDB/RDS/設定から読み込み)。マッピングは JWT には保存されません UserContextにtenantRoles(直接ロールの配列)とtenantGroupIds(アクティブテナントのグループ ID)が追加されました。tenantRole(単数)は後方互換性のため維持されます- オプトイン: 既存の
@Roles()チェックはコード変更なしで動作し続けます - リゾルバの失敗は(暗黙の 403 ではなく)5xx として伝播するため、バックエンド障害を本来のアクセス拒否と区別できます
- 新しい
- mcp-server: v1.3.1 向けにスキルとアナライザを更新
- AP027 アンチパターン検出を追加:
@GroupRoleResolver()クラスに@Injectable()を併用してはいけません mbc-migrateスキル: v1.3.1 のマイグレーションガイドを追加mbc-generateスキル: グループロールリゾルバのコード生成テンプレートを追加mbc-reviewスキル: AP022(グループロールリゾルバ)をチェックリストに追加
- AP027 アンチパターン検出を追加:
バグ修正
- core: 不正な
custom:groupsクレームを例外ではなく許容(グループロールなしにフェイルクローズ)するようにし、不正なトークンでもリクエストをクラッシュさせず直接ロールのみのチェックに縮退します
1.3.0 (2026-05-21)
新機能
- core:
AppSyncEventsServiceを追加 — AWS AppSync Events API によるリアルタイム通知のオプトイン HTTP pub/sub トランスポート (詳細を見る) (PR #433)NOTIFICATION_TRANSPORTS環境変数(カンマ区切り)でトランスポートを選択。デフォルトはappsync-graphql— 既存の GraphQL サブスクリプションの動作は変わりません- チャンネル構造:
/{namespace}/{tenantCode}/{action}/{sanitizedId}— クライアントは AppSync ワイルドカード(/*)で任意の粒度でサブスクライブ可能 - 認証: Lambda/ECS パブリッシュには IAM SigV4、クライアントサブスクライブには API キー
- デュアルパブリッシュモード: 移行中は
NOTIFICATION_TRANSPORTS=appsync-graphql,appsync-eventで両方のトランスポートに同時パブリッシュ - 新規環境変数:
NOTIFICATION_TRANSPORTS,APPSYNC_EVENTS_ENDPOINT,APPSYNC_EVENTS_NAMESPACE(詳細を見る) @NotificationTransportデコレータ: プラグイン式トランスポート登録 — フレームワークコードを変更せずにカスタムトランスポートを追加可能
- cli: CDK インフラテンプレート:
Config型にappsyncEventsとnotificationTransportsを追加 —EventApi+ChannelNamespaceをプロビジョニングし、Lambda/ECS にNOTIFICATION_TRANSPORTS、APPSYNC_EVENTS_ENDPOINT、APPSYNC_EVENTS_NAMESPACEを注入、grantPublish()でappsync:EventPublishIAM 権限を自動付与 - mcp-server: v1.3.0 向けスキルとアナライザーを更新 (PR #436)
- AP026 アンチパターン検出器を追加:
INotificationTransport実装クラスで@NotificationTransportの代わりに@Injectableを使用するケース mbc-migrateスキル: v1.3.0 移行ガイドおよびバージョン互換性テーブルを更新mbc-generateスキル: カスタム通知トランスポートのコード生成テンプレートを追加mbc-reviewスキル: チェックリストに AP026 を追加
- AP026 アンチパターン検出器を追加:
1.2.6 (2026-05-06)
新機能
- core: Repository の Read-Your-Writes(RYW)改善 — データテーブルがセッションバージョンに追いついた/追い越した時点で陳腐化したRYWセッションを即時パージし、「stale override」読み取りを解消 (詳細を見る) (PR #410)
getItem:existing.version >= session.versionの場合、バックグラウンドでセッションをパージし永続化済みデータを直接返却(不要な Command テーブル読み取りをスキップ)listItemsByPk: マージループ中に同期済みセッションをその場でクリーンアップlistItems(RDSパス): セッションごとのチェックをPromise.allで並列化し、直列N+1のレイテンシを解消- 新しいオプション
mergeOptions.getVersionにより、RDS行が既に追いついていることを証明できる場合は追加のDynamoDB GetItemをスキップ可能 SessionService.delete()とDynamoDbService.deleteItem()を追加(fire-and-forgetでの利用に安全)- 後方互換:
getVersionはオプション。RYW_SESSION_TTL_MINUTES未設定のプロジェクトは影響なし
- mcp-server: AP021 アンチパターン検出器を追加 —
CommandService 内で publishAsync 直後にイベントをemit(Severity: High) (詳細を見る) (PR #408)commandService.publishAsync/publishSyncから200文字以内のeventEmitter.emit()呼び出しを検出- 推奨:
publishAsync後はDynamoDB Streams経由で非同期にデータテーブルが書き込まれるため、イベント発行はIDataSyncHandler.up()/down()内で行うこと
- mcp-server: 検出器AP番号(
analyze.ts)とskill-doc AP番号(skills/mbc-review/SKILL.md)のクロスリファレンス表を追加 — 両者は独立した番号体系で、コードが一致するのは AP016〜AP019 と AP021 のみ (PR #411)- 検出器の出力に対応するskill-doc AP番号を併記するように変更(例:
AP005: Hardcoded Tenant (skill-doc: AP002)) mbc-migrateスキル: v1.2.5・v1.2.6セクションとマイグレーションマトリクスのエントリを追加mbc-debugスキル: v1.2.6での(意図的な)RYWセッション早期パージに関するトラブルシューティング項目を追加
- 検出器の出力に対応するskill-doc AP番号を併記するように変更(例:
バグ修正
- mcp-server:
server.tsがパッケージバージョンをハードコードしており、lerna versionのたびにサイレントにずれていた問題を修正。実行時にpackage.jsonから読み込むように変更 (PR #411)
1.2.5 (2026-04-10)
新機能
- import: ZIPインポート処理をリファクタリング — ZIPジョブ処理を
ImportServiceに直接統合し、独立したZipImportQueueEventHandlerを削除 (詳細を見る) (PR #404)ZipImportQueueEventHandlerを削除。ZIPインポートジョブはImportService内で直接処理されるように変更ImportEventHandlerがZIP_MASTER_JOBイベントに対してSQSパブリッシュをスキップするように変更CreateZipImportDtoのZIPインポートバリデーションを強化- ZIP処理のエラーハンドリングとロギングを改善
- mcp-server:
mbc_check_anti_patternsツールにAP016〜AP020のアンチパターン検出器を追加(合計20パターン) (PR #403)- AP016: リスロー前のエラーロギング欠落(High)
- AP017: 部分更新時の属性マージ誤り(High)
- AP018: Swaggerドキュメント /
@ApiTags欠落(Low) - AP019: リストクエリのページネーション欠落(High)
- AP020: トレーシング用
getCommandSource欠落(Low)
- mcp-server:
mbc-migrateとmbc-debugスキルをv1.1.x・v1.2.x破壊的変更ガイドで更新 (PR #403)
依存関係
- mcp-server:
@modelcontextprotocol/sdkを1.26.0から1.29.0に更新 (PR #403)
1.2.2 (2026-04-08)
バグ修正
- import:
CsvBatchProcessorにSmart Retryパターンを実装してHead-of-Line Blocking(Poison Pill)を修正 (詳細を見る) (PR #394)- 以前は、先頭行に永続的なバリデーションエラーがあるとバッチ全体が即座にクラッシュしていた
- 各行を独立して処理し、エラーを蓄積してバッチ終了後に集約エラーをスローするよう修正
- 有効な行は正常に保存、失敗行はSQSリトライをトリガー、成功済み行はEQUAL比較でスキップ(冪等性維持)
- import:
ImportQueueEventHandlerがSingleImportProcessorに生のSQSペイロードを渡していた問題を修正 (PR #394)singleImportProcessor.process()にevent.payload(生のSQSペイロード)ではなくevent.importEvent(パース済みオブジェクト)を渡すよう修正
1.2.1 (2026-04-06)
新機能
- core: SQSメッセージ操作のための
SqsServiceとSqsClientFactoryを追加 (詳細を見る) (PR #383)sendMessage()— SQSキューへ単一メッセージを送信sendMessageBatch()— 1回のAPIコールで最大10件のメッセージを送信receiveMessages()—MaxNumberOfMessages(デフォルト: 10)とWaitTimeSeconds(デフォルト: 0)を設定可能なメッセージ受信deleteMessage()— 処理済み単一メッセージの確認・削除deleteMessageBatch()— 1回のAPIコールで最大10件のメッセージを削除SqsServiceはQueueModule(グローバル)に登録され、アプリケーション全体でインジェクション可能- システム属性受信のための
MessageSystemAttributeNamesをサポート(廃止済みのAttributeNamesは非公開)
- core:
SnsClientFactoryをシングルトンSNSClientインスタンス方式にリファクタリング (PR #383)- 以前はトピックARNごとに個別クライアントをキャッシュしていたが、全publishコールでシングルインスタンスを共有するように変更
getClient()のシグネチャがgetClient(topicArn: string)からgetClient()に変更
1.2.0 (2026-04-02)
破壊的変更
- core:
publishSync()とpublishPartialUpdateSync()がコマンドに変更がない場合(no-op)にnullを返すように変更 (詳細を見る) (PR #375)- 戻り値の型が
Promise<CommandModel>からPromise<CommandModel | null>に変更 publishAsync()およびpublishPartialUpdateAsync()の既存の挙動に統一- 移行方法: 戻り値のプロパティにアクセスする前にnullチェックを追加
- 戻り値の型が
- sequence:
SequenceService.genNewSequence()が削除 (詳細を見る) (PR #375)- 代わりに
generateSequenceItem()またはgenerateSequenceItemWithProvideSetting()を使用
- 代わりに
新機能
- core:
SessionServiceとRepositoryによるRead-Your-Writes(RYW)一貫性を追加 (詳細を見る) (PR #375)publishAsync後、DynamoDB Streamの同期が完了する前でも同一ユーザーの後続読み取りがペンディングコマンドデータを返すように- オプトイン:
RYW_SESSION_TTL_MINUTES環境変数を設定して有効化(例:5) CommandModule/@mbc-cqrs-serverless/coreからRepositoryクラスをエクスポート —getItem・listItemsByPk・listItemsでRYWマージを提供- セッションテーブル
{NODE_ENV}-{APP_NAME}-sessionを作成する必要あり(dynamodbs/session.json参照) RYW_SESSION_TTL_MINUTES未設定時は無効 — 既存プロジェクトへの影響なし
- mcp-server: v1.2.0破壊的変更向けのAP013・AP014アンチパターン検出を追加 (PR #377)
- AP013: nullチェックなしで
publishSync/publishPartialUpdateSyncの戻り値を使用するパターンを検出 - AP014: 廃止された
genNewSequence()の使用を検出 migration_guideプロンプトにv1.2.0セクションを追加
- AP013: nullチェックなしで
バグ修正
- import: ZIPオーケストレーターのインポートステータス処理を修正 (PR #370)
ImportStatusHandlerがジョブ失敗時にimportJobStatusを含むタスク成功を送信するように修正ZipImportSfnEventHandlerがCSVタスクの失敗数を集計し最終ジョブステータスを調整
1.1.5 (2026-03-28)
新機能
- import: 大規模CSVインポート向けv2バッチ処理アーキテクチャを実装 (詳細を見る) (PR #366)
- 行ごとの
import_tmp書き込みをLambda内直接コマンドパブリッシュに置き換え、Hot Partitionボトルネックを解消 - Distributed Mapを
MaxItemsPerBatch: 100・MaxConcurrency: 50に設定し、スループットを大幅向上 - 新しい
finalize_parent_jobステートがバッチサマリーを集約し、DynamoDBUpdateItemを1回だけ呼び出して最終ステータスを書き込む CommandFinishedHandlerから行ごとのアトミックカウンター更新を削除し、大規模時のDynamoDBスロットリングを解消ImportEntityProfileにImportPublishModeenum(SYNC/ASYNC)を追加し、エンティティごとのパブリッシュモード設定を可能に- 空の
processingResultsガードを追加: バッチ結果が受信されない場合はジョブをFAILEDとしてマーク
- 行ごとの
破壊的変更
- import: CSVインポートでリアルタイムの行レベル進捗追 跡が廃止 (詳細を見る)
processedRows・succeededRows・failedRowsカウンターはStep Functions実行完了時に一括集計されるように変更- 個別のCSV行は
import_tmpDynamoDBテーブルに書き込まれなくなった import-csvステートマシンに新しいfinalize_parent_jobステートとresultPath: '$.processingResults'が必要 — CDKとserverless.ymlをこのパッケージと同時に更新すること
テスト
ImportQueueEventHandlerのSYNC/ASYNCルーティングテストを追加(EQUAL/NOT_EXIST/CHANGED × SYNC/ASYNC + フォールバックの6テストケース)CsvImportSfnEventHandlerの空processingResultsガードテストを追加- バッチ集計テストを追加(1,000 + 500行、COMPLETEDおよびFAILEDシナリオ)
1.1.4 (2026-03-27)
新機能
- core:
publishSyncの監査証跡とHistoryテーブルの一致を復元 (詳細を見る) (PR #363)publishSyncがstatus: 'publish_sync:STARTED'とsyncMode: 'SYNC'でCommandテーブルに不変イベントを書き込むようにpublishSyncがHistoryテーブルに書き込むようになり、非同期Step Functionsパイプラインと一致- コマンドライフサイクルが
publish_sync:STARTED→finish:FINISHED(エラー時はpublish_sync:FAILED)に publishAsyncからisNotCommandDirty早期リターン最適化を移植 — 変更なしの場合はnullを返す- DynamoDB Streamフィルターを更新し
syncMode=SYNCレコードを除外、Step Functionsの二重実行を防止 DefaultEventFactoryもローカル開発環境向けにsyncMode=SYNCレコードをフィルタリング
テスト
publishSyncの監査証跡とHistory一致の包括的なテストを追加
1.1.3 (2026-03-24)
バグ修正
- import: CSVインポートのDistributed Mapステ ート結果が256KB制限を超える問題を修正 (詳細を見る) (PR #348)
- Distributed Mapに
resultPath: DISCARDを設定し、子実行結果がステートデータに集約されることを防止 CsvImportSfnEventHandlerからMapResult依存を削除し、代わりにS3からcountCsvRows()を使用- S3ストリームが読み取れない場合のエラーハンドリングを追加
- Distributed Mapに
CI/CD
- npm OIDC trusted publishingに切り替え、
NPM_TOKENシークレットへの依存を排除 (PR #357)- 組み込みOIDCサポートのためlernaをv8からv9にアップグレード
- publishジョブに
id-token: writeパーミッションを追加 - Node 22+互換性のためlockfile同期ステップを追加
テスト
CsvImportSfnEventHandlerのfinalize_parent_jobロジックの包括的なテストを追加- failedRows > 0の場合のFAILEDステータスをテスト
- 全行成功時のCOMPLETEDステータスをテスト
- 処理が未完了の場合にステータスが更新されないことをテスト
- S3ストリームが読み取れない場合のエラーハンドリングをテスト
1.1.2 (2026-02-25)
新機能
- master: マスター設定とデータのビルトインupsertメソッドを追加 (詳細を見る)
- MasterSettingService用の
upsertTenantSetting()、upsertSetting()、upsertBulk() - MasterDataService用の
upsert()、upsertSetting()、upsertBulk() - 新規レコードの作成、変更レコードの更新、未変更レコードのスキップを自動的に行う
- ソフト削除されたレコードの再作成をサポート
- MasterSettingService用の
- master: 統合バルクupsert API(
/api/master-bulk/)を追加 (詳細を見る)- 設定とデータの両方を処理する単一エンドポイント
settingCodeフィールドの有無でアイテムをルーティング- レスポンスで元の入力順序を保持
- テナントコードバリデーションを適用
- master: すべてのバルクDTOに
@ArrayMaxSize(100)バリデーションを追加 - master: 個別のバルクエンドポイント(
/api/master-setting/bulk、/api/master-data/bulk)にテナントコードバリデーションを追加
バグ修正
- core:
checkVersionのエラーメッセージが実際のcommandVersionではなくハードコードされた値を使用していた問題を修正 (PR #331) - master:
createSettingでseq === 0がfalsyとして扱われる問題をnullチェック(seq == null)に変更して修正 - master:
createSettingでseq変更前にattributesをクローンしてDTOミューテーションを修正
テスト
- MasterBulkControllerの包括的なユニットテストを追加(8テストケース)
- MasterDataServiceのupsertおよびupsertBulkメソッドのユニットテストを追加
- MasterSettingServiceのupsertTenantSettingおよびupsertBulkメソッドのユニットテストを追加
- マスターデータと設定のupsertシナリオの統合テストを追加
1.1.1 (2026-02-07)
バグ修正
- cli: 不足していた
import_tmp.jsonDynamoDBテーブルテンプレートを追加 (詳細を見る) (PR #323)- CLIテンプレートに
import_tmpテーブル定義が含まれておらず、npm run offline:slsが失敗していました serverless.ymlが参照するLOCAL_DDB_IMPORT_TMP_STREAM環境変数は、マイグレーション時にテーブルが作成される必要があります- 以前のバージョンを使用している場合の回避策はよくある問題を参照
- CLIテンプレートに
1.1.0 (2026-02-03)
破壊的変更
- tenant:
TENANT_COMMONのenum値を'COMMON'から'common'(小文字)に変更- この変更はパーティションキーのフォーマットに影響します:
TENANT#COMMON→TENANT#common - マイグレーション必須:
TENANT#COMMONパーティションキーを持つ既存データの移行が必要です - 詳細な手順はマイグレーションガイドを参照してくだ さい
- この変更はパーティションキーのフォーマットに影響します:
- core: 非推奨の
CommandService.publish()メソッドを削除 (詳細を見る)- 代わりに
CommandService.publishAsync()を使用してください
- 代わりに
- core: 非推奨の
CommandService.publishPartialUpdate()メソッドを削除- 代わりに
CommandService.publishPartialUpdateAsync()を使用してください
- 代わりに
- sequence: 非推奨の
SequencesService.genNewSequence()メソッドを削除- 代わりに
SequencesService.generateSequenceItem()を使用してください
- 代わりに
新機能
- core: 大文字小文字を区別しないマッチングのためのテナントコード正規化を追加 (詳細を見る)
- テナントコードは自動的に小文字に正規化されるようになりました
getUserContext()は正規化されたテナントコードを返します- すべてのDynamoDB操作は一貫性のため正規化されたテナントコードを使用します
- core: 明示的な正規化のための
normalizeTenantCode()ユーティリティ関数を追加 - core: 共通テナント検出のための
isCommonTenant()ユーティリティ関数を追加 - core: AWS SESメールのカテゴリ分けとフィルタリング用EmailTagsサポートを追加 (詳細を見る)
EmailNotificationインターフェースに新しいemailTagsオプション- タグはSESに渡されメールのカテゴリ分けとトラッキングに使用
- core: RolesGuardに拡張可能なテナント検証を追加 (詳細を見る)
isHeaderOverride(): ヘッダーベースのテナントオーバーライドを検出canOverrideTenant(): クロステナントアクセスの権限をチェックgetCommonTenantCodes(): 設定可能な共通テナントリストgetCrossTenantRoles(): 設定可能なクロステナントロール(デフォルト: 'system_admin')
- cli: スキル更新用のnpmレジストリバージョンチェックを追加
- ローカルのpackage.jsonではなくnpmレジストリから最新バージョンを取得
- ネットワークリクエストを削減するための24時間キャッシュ
- オフライン時はキャッシュバージョンにフォールバック
セキュリティ
- core: テナントコードヘッダーオーバーライドをシステム管理者のみに制限
- 以前は
custom:tenantCognito属性のないユーザーがヘッダー経由で任意のテナントを指定可能でした - 現在はグローバル
system_adminロールを持つユーザーのみがx-tenant-codeヘッダーでテナントコードをオーバーライド可能 - 一般ユーザーはCognitoで
custom:tenantを設定する必要があります
- 以前は
バグ修正
- master: MasterSettingServiceとMasterDataServiceでの
TENANT_COMMON定数の使用を修正- 以前ハードコードされていた
'COMMON'文字列はSettingTypeEnum.TENANT_COMMONを使用するようになりました - フレームワーク全体で一貫したパーティションキー生成を保証
- 以前ハードコードされていた
テスト
- tenant: TenantServiceメソッドの包括的なテストを追加
getTenant(): 取得テストupdateTenant(): 更新と属性マージテストdeleteTenant(): ソフト削除テストaddTenantGroup(): グループ管理テストcustomizeSettingGroups(): 設定カスタマイズテストcreateTenantGroup(): テナントグループ作成テスト
- tenant: SettingTypeEnum検証テストを追加
TENANT_COMMON = 'common'(小文字)を検証- enumの完全性と一貫性を保証
- core: テナントコード正規化テストを追加(70件以上のテストケース)
- core: テナント正規化コマンドテストを追加(30件以上のテストケース)
- core: 包括的な依存関係統合テストを追加(3400以上 のテスト)
- AWS SDK統合テスト(DynamoDB、S3、SNS、SQS、Step Functions、SES)
- NestJS動作テスト(デコレーター、設定、DI、Swagger)
- サードパーティライブラリテスト(class-transformer、class-validator、RxJS)
ドキュメント
- v1.1.0テナントコード変更のマイグレーションガイドを追加
1.0.26 (2026-01-26)
新機能
- cli: 環境変数によるローカルサービスポートの設定機能を追加 (詳細を見る) (PR #300)
LOCAL_HTTP_PORT、LOCAL_DYNAMODB_PORT、LOCAL_RDS_PORTなどのポート変数をサポート- 他のサービスとのポート競合を解決可能に
- 設定はDocker Compose、Serverless Offline、トリガースクリプトに自動的に適用