All notable changes to this project will be documented in this file. See Conventional Commits for commit guidelines.
1.3.1 (2026-06-02)
- core: Add group-based role authorization
RolesGuardnow checks direct roles from JWTcustom:rolesfirst, then roles derived from the user's groups in the newcustom:groupsclaim (tenant-scoped)- Add
@GroupRoleResolver()decorator andIGroupRoleResolverinterface — implement exactly one resolver per app to map group IDs to roles (loaded from DynamoDB/RDS/config); the mapping is not stored in the JWT UserContextgainstenantRoles(direct roles array) andtenantGroupIds(group IDs for the active tenant);tenantRole(singular) is kept for backward compatibility- Opt-in: existing
@Roles()checks keep working with no code changes
- core: Tolerate a malformed
custom:groupsclaim (fail-closed to no group roles) instead of throwing, so a bad token degrades to direct-role-only checks rather than crashing the request
1.3.0 (2026-05-21)
- core: Add AppSync Events API support (opt-in, no breaking changes)
- Introduce
@NotificationTransport('transport-name')decorator and refactorNotificationModulefor transport flexibility - Activate transports via the
NOTIFICATION_TRANSPORTSenvironment variable (e.g.appsync-graphql,appsync-event) - Add
AppSyncServiceinitialization, environment variable validation, and a sample AppSync event client
- Introduce
- cli: Enhance AppSync Events API integration
1.2.6 (2026-05-06)
- core: Optimize Repository read-your-writes (RYW) session handling with version checks and session deletion logic (transparent; no code changes required)
1.2.5 (2026-04-10)
- import: Enhance ZIP import functionality and validation
- import: Remove
ZipImportQueueEventHandlerand streamline import processing
1.2.4 (2026-04-09)
- master:
TaskModule.register()must be called exactly once in the hostAppModule- Duplicate registrations across feature modules cause
"transformTask is not a function"at runtime - Migration: Remove
TaskModule.register()from feature modules and register it only inAppModule
- Duplicate registrations across feature modules cause
- core: Implement SQS client and service for message handling; make
QueueModuleglobal with SQS support
- core: Handle malformed JWT tokens gracefully in
extractInvokeContext - import: Refine single import routing, error handling, and parent job counters in the import queue/Step Functions handlers
1.2.3 (2026-04-08)
- import: Refine SingleImportProcessor routing and error handling in ImportQueueEventHandler
- import: Use
event.importEventinstead ofevent.payloadfor single import processing - import: Improve error handling in CsvBatchProcessor and ImportQueueEventHandler
1.2.2 (2026-04-08)
- import: Fix Head-of-Line Blocking (Poison Pill) in
CsvBatchProcessorby implementing Smart Retry pattern (PR #394)- Previously, a persistent validation error on the first row caused the entire batch to crash immediately
- Now, each row is processed independently; errors are collected and a single aggregated error is thrown after the full batch is processed
- Valid rows are saved successfully; failed rows trigger SQS retry; already-succeeded rows are skipped on retry via EQUAL comparison (idempotency maintained)
- import: Fix
ImportQueueEventHandlerpassing raw SQS payload instead of parsedimportEventtoSingleImportProcessor(PR #394)singleImportProcessor.process()now receivesevent.importEvent(parsed, rich object) instead ofevent.payload(raw SQS payload)
1.2.1 (2026-04-06)
- core: Add
SqsServiceandSqsClientFactoryfor SQS message operations (PR #383)sendMessage()— send a single message to an SQS queuesendMessageBatch()— send up to 10 messages in a single API callreceiveMessages()— receive messages with configurableMaxNumberOfMessages(default: 10) andWaitTimeSeconds(default: 0)deleteMessage()— acknowledge and delete a single processed messagedeleteMessageBatch()— delete up to 10 messages in a single API callSqsServiceis registered inQueueModule(global) and injectable across the application- Supports
MessageSystemAttributeNamesfor receiving system attributes (deprecatedAttributeNamesnot exposed)
- core: Refactor
SnsClientFactoryto use a singletonSNSClientinstance (PR #383)- Previously cached a separate client per topic ARN; now a single instance is shared across all publish calls
getClient()signature changed fromgetClient(topicArn: string)togetClient()
1.2.0 (2026-04-02)
- core:
CommandService.publishSync()andpublishPartialUpdateSync()now returnPromise<CommandModel | null>(previouslyPromise<CommandModel>)- Returns
nullwhen the command is not dirty (no-op), matchingpublishAsync()/publishPartialUpdateAsync() - Migration: Callers must null-check the result before accessing fields such as
pkorversion
- Returns
- sequence: Remove deprecated
SequencesService.genNewSequence()method- Use
generateSequenceItem()orgenerateSequenceItemWithProvideSetting()instead
- Use
- core: Implement read-your-writes (RYW) session management for async command publishing
- The same user's subsequent reads return pending command data before the DynamoDB Stream sync completes
- Add DynamoDB session table configuration; enable via the
RYW_SESSION_TTL_MINUTESenvironment variable - Introduce
CommandSyncModeenum andSessionServiceto encapsulate the RYW session policy
- import: Enhance CSV import processing with a new state-machine definition, publish-mode configuration, and improved result/error handling
1.1.6 (2026-03-30)
1.1.5 (2026-03-28)
- import: Implement v2 batch processing architecture for high-throughput CSV imports (PR #366)
- Replace per-row
import_tmpwrites with direct in-Lambda command publishing, eliminating Hot Partition bottlenecks - Distributed Map now configured with
MaxItemsPerBatch: 100andMaxConcurrency: 50for significantly higher throughput - New
finalize_parent_jobstate aggregates batch summaries and writes final job status in a single DynamoDBUpdateItemcall - Remove per-row atomic counter updates from
CommandFinishedHandler, eliminating DynamoDB throttling at scale - Add
ImportPublishModeenum (SYNC/ASYNC) toImportEntityProfilefor per-entity publish mode configuration - Add empty
processingResultsguard: job is markedFAILEDif no batch results are received
- Replace per-row
- import: CSV import no longer provides real-time row-level progress tracking
processedRows,succeededRows,failedRowscounters are now aggregated once when Step Functions execution completes- Individual CSV rows are no longer written to the
import_tmpDynamoDB table - The
import-csvstate machine requires a newfinalize_parent_jobstate andresultPath: '$.processingResults'— CDK andserverless.ymlmust be updated together with this package
- Add SYNC/ASYNC routing tests for
ImportQueueEventHandler(6 test cases covering EQUAL/NOT_EXIST/CHANGED × SYNC/ASYNC + fallback) - Add empty
processingResultsguard test forCsvImportSfnEventHandler - Add batch aggregation tests (1,000 + 500 rows, COMPLETED and FAILED scenarios)
1.1.4 (2026-03-27)
- core: Restore audit trail and history parity for
publishSync(PR #363)publishSyncnow writes an immutable event to the Command table withstatus: 'publish_sync:STARTED'andsyncMode: 'SYNC'- History table is now populated by
publishSync, matching the async Step Functions pipeline - Command lifecycle follows
publish_sync:STARTED→finish:FINISHED(orpublish_sync:FAILEDon error) - Ported
isNotCommandDirtyearly-return optimization frompublishAsync— returnsnullwhen no changes detected - DynamoDB Stream filter updated to exclude
syncMode=SYNCrecords, preventing Step Functions double-execution DefaultEventFactoryalso filterssyncMode=SYNCrecords for local development environments
- Add comprehensive tests for
publishSyncaudit trail and history parity
1.1.3 (2026-03-24)
- import: Fix CSV import Distributed Map state result exceeding 256KB limit (PR #348)
- Set
resultPath: DISCARDon Distributed Map to prevent child execution results from being aggregated into state data - Remove
MapResultdependency fromCsvImportSfnEventHandler, usecountCsvRows()from S3 instead - Add error handling for cases where the S3 stream is not readable
- Set
- Switch to npm OIDC trusted publishing, removing dependency on
NPM_TOKENsecret (PR #357)- Upgrade lerna from v8 to v9 for built-in OIDC support
- Add
id-token: writepermission to publish job - Add lockfile sync step for Node 22+ compatibility
- Add comprehensive tests for
CsvImportSfnEventHandlerfinalize_parent_job logic- Test FAILED status when failedRows > 0
- Test COMPLETED status when all rows succeed
- Test no status update when processing is incomplete
- Test error handling when S3 stream is not readable
1.1.2 (2026-02-25)
- master: Add built-in upsert methods for master settings and data
upsertTenantSetting(),upsertSetting(),upsertBulk()for MasterSettingServiceupsert(),upsertSetting(),upsertBulk()for MasterDataService- Automatically creates new records, updates changed records, and skips unchanged records
- Supports recreating soft-deleted records
- master: Add unified bulk upsert API (
/api/master-bulk/)- Single endpoint that handles both settings and data items
- Items routed by presence of
settingCodefield - Preserves original input order in response
- Tenant code validation enforced
- master: Add
@ArrayMaxSize(100)validation to all bulk DTOs - master: Add tenant code validation to individual bulk endpoints (
/api/master-setting/bulk,/api/master-data/bulk)
- core: Fix
checkVersionerror message using hardcoded value instead of actualcommandVersion(PR #331) - master: Fix
seq === 0being treated as falsy increateSettingby changing to null check (seq == null) - master: Fix DTO mutation in
createSettingby cloning attributes before modifying seq
- Add comprehensive unit tests for MasterBulkController (8 test cases)
- Add unit tests for MasterDataService upsert and upsertBulk methods
- Add unit tests for MasterSettingService upsertTenantSetting and upsertBulk methods
- Add integration tests for master data and setting upsert scenarios
1.1.1 (2026-02-07)
- cli: Add missing
import_tmp.jsonDynamoDB table template (PR #323)- The
import_tmptable definition was missing from CLI templates, causingnpm run offline:slsto fail - The
serverless.ymlreferencesLOCAL_DDB_IMPORT_TMP_STREAMenvironment variable, which requires the table to be created during migration - See Common Issues for workaround if using older versions
- The
1.1.0 (2026-02-03)
- tenant: Change
TENANT_COMMONenum value from'COMMON'to'common'(lowercase)- This change affects partition key format:
TENANT#COMMON→TENANT#common - Migration required: Existing data with
TENANT#COMMONpartition keys needs to be migrated - See Migration Guide for detailed instructions
- This change affects partition key format:
- core: Remove deprecated
CommandService.publish()method- Use
publishAsync()instead
- Use
- core: Remove deprecated
CommandService.publishPartialUpdate()method- Use
publishPartialUpdateAsync()instead
- Use
- core:
CommandService.publishSync()andpublishPartialUpdateSync()now returnPromise<CommandModel | null>(previouslyPromise<CommandModel>)- Returns
nullwhen the command is not dirty (no-op), matchingpublishAsync()/publishPartialUpdateAsync() - Migration: Callers must handle
nullbefore using the result (e.g.if (result) { ... }or early return)
- Returns
- sequence: Remove deprecated
SequencesService.genNewSequence()method- Use
generateSequenceItem()orgenerateSequenceItemWithProvideSetting()instead
- Use
- core: Add tenant code normalization for case-insensitive matching
- Tenant codes are now automatically normalized to lowercase
getUserContext()returns normalized tenant code- All DynamoDB operations use normalized tenant codes for consistency
- core: Add
normalizeTenantCode()utility function for explicit normalization - core: Add
isCommonTenant()utility function for common tenant detection
- master: Fix
TENANT_COMMONconstant usage in MasterSettingService and MasterDataService- Previously hardcoded
'COMMON'strings are now usingSettingTypeEnum.TENANT_COMMON - Ensures consistent partition key generation across the framework
- Previously hardcoded
- tenant: Add comprehensive tests for TenantService methods
getTenant(): Retrieval testsupdateTenant(): Update and attribute merge testsdeleteTenant(): Soft delete testsaddTenantGroup(): Group management testscustomizeSettingGroups(): Setting customization testscreateTenantGroup(): Tenant group creation tests
- tenant: Add SettingTypeEnum validation tests
- Verify
TENANT_COMMON = 'common'(lowercase) - Ensure enum completeness and consistency
- Verify
- core: Add tenant code normalization tests (70+ test cases)
- core: Add tenant normalization command tests (30+ test cases)
- Add migration guide for v1.1.0 tenant code changes
1.0.26 (2026-01-26)
- cli: Add configurable local service ports via environment variables (PR #300)
- Support for
LOCAL_HTTP_PORT,LOCAL_DYNAMODB_PORT,LOCAL_RDS_PORT, and other port variables - Allows users to resolve port conflicts with other services
- Configuration is automatically applied to Docker Compose, Serverless Offline, and trigger scripts
- Support for
- Update
diffpackage from 4.0.2 to 4.0.4 for security fix (PR #297, PR #299) - Update
lodashpackage from 4.17.21 to 4.17.23 for prototype pollution fix (PR #298)
1.0.25 (2026-01-19)
- core: Enhanced inline template email with advanced variable substitution
- Support for nested property access in template variables (e.g., user.profile.name in double-brace placeholders)
- Support for Unicode/Japanese keys in template variables
- Whitespace trimming inside placeholders so spaces around the variable name are ignored
- Improved local development fallback for template compilation
1.0.24 (2026-01-17)
- mcp-server: Add Claude Code Skills for guided development assistance
/mbc-generate: Generate boilerplate code (modules, services, controllers, DTOs, handlers)/mbc-review: Review code for best practices and anti-patterns (20 patterns)/mbc-migrate: Guide version migrations and breaking changes/mbc-debug: Debug and troubleshoot common issues- Skills are distributed via npm package and can be installed to
~/.claude/skills/or.claude/skills/
- cli: Add
mbc install-skillscommand for easy skills installation- Install skills to personal directory (
~/.claude/skills/) or project directory (.claude/skills/) - Options:
--project,--force,--list
- Install skills to personal directory (
- core: Fix typo in parameter name
skExpessiontoskExpression- Affected packages: core, directory, master, task, ui-setting
- This was a breaking change for TypeScript users who referenced the old parameter name
1.0.23 (2026-01-16)
- core: Add inline template email support with
sendInlineTemplateEmail()method- New
sendInlineTemplateEmail(msg: TemplatedEmailNotification)method in EmailService - Support for inline HTML/text templates with dynamic data substitution
- Local development fallback with manual template compilation when SES is unavailable
- New interfaces:
InlineTemplateContent,TemplatedEmailNotification
- New
1.0.22 (2026-01-16)
- mcp-server: Add code analysis tools for AI-assisted development
mbc_check_anti_patterns: Detect common anti-patterns in code with severity levelsmbc_health_check: Project health check (dependencies, structure, configuration)mbc_explain_code: Analyze and explain code in MBC CQRS context
- mcp-server: Improve code analysis tools robustness
- Renumber anti-patterns sequentially (AP001-AP010)
- Limit regex match range to prevent false positives
- Add error handling for file reading and JSON parsing
- Add 18 unit tests for analyze tools
- Fix security vulnerabilities in dependencies: qs, express, body-parser
- Bump qs from 6.13.0 to 6.14.1
- Bump @nestjs/platform-express from 10.4.20 to 10.4.22
- Bump express from 4.21.2 to 4.22.1
- Bump body-parser from 1.20.3 to 1.20.4
1.0.21 (2026-01-15)
- import: Add ZIP finalization hooks support to ImportModule
- New
IZipFinalizationHookinterface for custom post-import processing - Register hooks via
zipFinalizationHooksoption inImportModule.register() - Hooks receive
ZipFinalizationContextwith results, status, and execution input
- New
1.0.20 (2026-01-11)
- import: Fix Step Functions CSV handler always setting COMPLETED status regardless of child job failures
- Fixed
CsvImportSfnEventHandler.finalizeParentJob()to correctly set status to FAILED when any child job fails - Fixed
CsvImportSfnEventHandlerincsv_loaderstate to correctly set status to FAILED when early finalization occurs with failures - Previously, the ternary operator was incorrectly returning COMPLETED for both true and false cases:
failedRows > 0 ? COMPLETED : COMPLETED - Now correctly returns FAILED when failedRows > 0:
failedRows > 0 ? FAILED : COMPLETED - This bug caused Step Functions to report SUCCESS even when child import jobs failed with errors like
ConditionalCheckFailedException - Added comprehensive unit tests for CsvImportSfnEventHandler (5 tests)
- Fixed
1.0.19 (2026-01-11)
- import: Fix master job status not updating to FAILED when child import jobs fail
- Previously, when a child import job failed with errors like
ConditionalCheckFailedException, the master job status remainedPROCESSINGindefinitely - Fixed
incrementParentJobCountersto correctly set master job status toFAILEDwhen any child job fails (was always setting toCOMPLETED) - Fixed
ImportQueueEventHandler.handleImportto callincrementParentJobCounterson error, ensuring parent counters are updated - Removed
throw errorin error handler to prevent Lambda crashes and allow proper status propagation - This fix completes the Step Functions error handling started in v1.0.18, ensuring
SendTaskFailureis properly triggered - See ImportQueueEventHandler Error Handling for details
- Previously, when a child import job failed with errors like
1.0.18 (2026-01-10)
- import: add SendTaskFailure support to ImportStatusHandler for proper Step Functions error handling (#275)
- Previously, when an import job failed, the Step Function would wait indefinitely because only SendTaskSuccess was implemented
- Now the handler properly sends SendTaskFailure when a job fails, allowing Step Functions to handle errors correctly
- Added
sendTaskFailure()method to sendSendTaskFailureCommand - Handler now processes both
COMPLETEDandFAILEDstatuses for CSV import jobs - Added comprehensive unit tests for the ImportStatusHandler (16 tests)
1.0.17 (2026-01-08)
- master: Fix
masterTypeCodecomparison inMasterDataService.search()- Changed from partial match (contains) to exact match forsettingCodesearch parameter - cli: Stabilize AbstractRunner tests by removing setTimeout to fix flaky CI failures
- Fix security vulnerabilities in dependencies: jws (HMAC signature verification issue), nodemailer (DoS vulnerability)
- Bump validator from 13.15.20 to 13.15.26
- Bump @modelcontextprotocol/sdk from 1.25.1 to 1.25.2
- Update README files for all packages with comprehensive API references and usage examples
- Fix
createTenantGroupparameter name in tenant package README - Update Japanese guide links to official documentation
1.0.16 (2025-12-31)
- cli: Add cleanup for test-generated files and update .gitignore
- master, directory, task, cli: Improve error messages for better clarity
- Include __s3Key in attributes for import creation
- Zip mode provide table name
- Add optional s3Key to CreateImportDto
1.0.15 (2025-12-31)
- ui-setting: Improve error messages for better clarity
- mcp-server: Use MBC_PROJECT_PATH for ERROR_CATALOG.md lookup
1.0.14 (2025-12-29)
- mcp-server: Add MCP server package for AI tool integration
- Add comprehensive error message catalog
- Add JSDoc comments to core interfaces
- Add operational documentation (FAQ, troubleshooting, security)
- Add AI-friendly documentation files
1.0.13 (2025-12-26)
- Enhance CreateZipImportDto and ZipImportQueueEventHandler
1.0.12 (2025-12-23)
- Merge tenant attributes in TenantService
1.0.11 (2025-12-22)
- Handle unknown source IP in SequencesService
1.0.10 (2025-11-28)
- Fix createTenantGroup method in TenantService
1.0.9 (2025-11-26)
- Remove callback parameter from Lambda handler for Node.js 24 compatibility
1.0.8 (2025-11-17)
- Bump jws dependency for security fix
1.0.7 (2025-11-07)
- Bump validator dependency in examples
- Bump js-yaml dependency for security fix
1.0.6 (2025-11-05)
- master: Add tenantCode support to MasterDataCreateDto and update service logic
1.0.5 (2025-11-04)
- master: Enhance master settings with tenantCode support in DTOs and service logic
1.0.4 (2025-10-29)
- core: Add configurable request body size limit to bootstrap and environment validation
- master: Add bulk creation endpoints for master data and settings
- Bump validator from 13.11.0/13.12.0 to 13.15.20
- Bump multer from 1.4.4-lts.1 to 2.0.2 and @nestjs/platform-express from 10.4.4 to 10.4.20
- Bump axios from 1.7.7 to 1.13.1 in CLI templates
1.0.3 (2025-10-23)
- master: Add bulk creation endpoints for master data and settings, enabling batch operations for improved efficiency
1.0.2 (2025-10-16)
- survey: Add survey template API for managing survey templates
- Bump @nestjs/common from 10.3.0 to 10.4.16 in /examples/master
- Bump multer from 1.4.4-lts.1 to 2.0.2 and @nestjs/platform-express from 10.4.15 to 10.4.20 in /examples/seq
- Bump @nestjs/cli from 10.4.5 to 11.0.10 and inquirer from 8.2.6 to 8.2.7
1.0.1 (2025-09-19)
- import: Add zip mode support for import module, enabling compressed file imports
1.0.0 (2025-09-18)
- First stable production release
- Based on beta version 0.1.74
- import: Add
SendTaskFailuresupport toImportStatusHandlerfor proper Step Functions error handling- Previously, when an import job failed, the Step Function would wait indefinitely because only
SendTaskSuccesswas implemented - Now the handler properly sends
SendTaskFailurewhen a job fails, allowing Step Functions to handle errors correctly - Added
sendTaskFailure()method to sendSendTaskFailureCommand - Handler now processes both
COMPLETEDandFAILEDstatuses for CSV import jobs
- Previously, when an import job failed, the Step Function would wait indefinitely because only
0.1.74-beta.0 (2025-08-25)
- import module (152115d)
- update infra for import module (d2f609d)
- update infra local for import module (9c52603)
0.1.73-beta.0 (2025-07-31)
- master: install package (288d779)
0.1.72-beta.0 (2025-07-24)
- add case-insensitive search for master data and settings (ee6b965)
0.1.71-beta.0 (2025-07-18)
- Core package test failures blocking CI (1e02300)
- github workflow (2cd9d44)
- handle step function name limit (762ab9a)
- StepFunctionService execution name length validation (86291ea)
- Fix 80-character limit bug in StepFunctionService tests (cf188ae)
- CLI package comprehensive test enhancement (edd8426)
- Enhance unit tests for Core package services (a4d318e)
- implement comprehensive unit tests for controllers (9bef4b0)
- Enhance unit tests for Master package services (90ca8a9)
- Enhance tests for Sequence service (8eefb34)
- Enhance unit tests for Task service (3a71b92)
- Implement unit tests for missing services (2f762ff)
- Implement unit tests for high-priority packages (1dc8494)
0.1.70-beta.0 (2025-07-14)
- master: master-setting unit test (c1d75af)
- update package version (fe43ed7)
- update package version (4d1aa9a)
- master: add copy to tenant (bd7036d)
0.1.69-beta.0 (2025-07-07)
- master: update unit test (c841a39)
- master: add prisma option (aab57e1)
0.1.68-beta.0 (2025-07-01)
- add template master api (501468b)
0.1.67-beta.0 (2025-06-10)
- enhance EmailService to support attachments (1795adb)
0.1.66-beta.0 (2025-05-21)
Note: Version bump only for package mbc-cqrs-serverless
0.1.65-beta.0 (2025-05-19)
- add second appsync (5336b33)
0.1.64-beta.0 (2025-05-15)
Note: Version bump only for package mbc-cqrs-serverless
0.1.63-beta.0 (2025-05-12)
Note: Version bump only for package mbc-cqrs-serverless
0.1.62-beta.0 (2025-04-29)
Note: Version bump only for package mbc-cqrs-serverless
0.1.61-beta.0 (2025-04-29)
Note: Version bump only for package mbc-cqrs-serverless
0.1.60-beta.0 (2025-04-26)
Note: Version bump only for package mbc-cqrs-serverless
0.1.59-beta.0 (2025-04-25)
Note: Version bump only for package mbc-cqrs-serverless
0.1.58-beta.0 (2025-04-24)
- get format sequence from master data item (19ea7c6)
0.1.57-beta.0 (2025-03-17)
Note: Version bump only for package mbc-cqrs-serverless
0.1.56-beta.0 (2025-03-17)
Note: Version bump only for package mbc-cqrs-serverless
0.1.55-beta.0 (2025-02-14)
- update template to use node 20 runtime (edeaf00)
0.1.54-beta.0 (2025-02-13)
Note: Version bump only for package mbc-cqrs-serverless
0.1.53-beta.0 (2025-02-12)
0.1.52-beta.0 (2025-01-20)
Note: Version bump only for package mbc-cqrs-serverless
0.1.51-beta.0 (2025-01-17)
- correct description text (2a0c8bf)
- add logger (c8fdcc6)
- add schematic description (0c7ffbd)
- add schematic for generating controllers (3dc7df2)
- add schematic for generating dto, service, entity (89df08d)
- add schematic for generating module (97cdc31)
0.1.50-beta.0 (2025-01-14)
- Fix entity field handling in serialization helper (89f2499)
- Add serialization helper functions — implement internal/external structure conversion helpers, add test cases, and add documentation (56e7c1d)