name: ddd-scaffold description: Generates DDD file structure for a new feature following project architecture conventions. Adapts templates to the project's runtime, error style, and naming.
DDD Scaffold
Generates the minimal file structure for a new feature following the project's architecture conventions.
Step 1: Load project config
Read project.yaml (in the project's config directory) to determine:
runtimeand file extensionsarchitecture.*for directory layoutconventions.naming.*for file/class namingconventions.error_handling.*for error patternstesting.*for test file patterns
Step 2: Find reference implementation
Before generating any code, scan existing implementations:
ls {ports_dir}
ls {adapters_dir}
Read at least one existing port + adapter pair as the concrete reference. Never invent structure from scratch - derive from real files in the repo.
Step 3: Generate files
Based on architecture pattern and config, create:
Port interface ({ports_dir}/{name}.{ext})
- Define interface with methods returning the project's error style
- If
error_handling.style: result-> methods returnResult<T, E> - If
error_handling.style: throw-> methods throw typed errors - Include
healthCheck()method (for port-adapter pattern)
Error file ({ports_dir}/{name}_errors.{ext})
- If
error_handling.hierarchy: true-> abstract base + concrete errors - If
error_handling.base_classdefined -> extend from it - Include contextual fields (operation, reason)
- If
require_cause_chain: true-> include cause parameter
Adapter ({adapters_dir}/{service}_{name}.{ext})
Following conventions.naming.adapters_pattern:
- Implements port interface
- Constructor takes config object (no env reads)
destroy()method for cleanuphealthCheck()for connectivity check- Uses project's logger/observability pattern
Test mock ({mock_dir}/{name}.{ext})
Following testing.mock_pattern:
- Implements the port interface
- In-memory storage
- Test control methods (setHealthy, setShouldFail, getStorage, clear)
Test file ({test_dir}/{name}.test.{ext})
- Uses project's test framework
- Imports mock
- Placeholder tests for success and failure paths
Step 4: Domain placement decision
Before creating domain files:
- Is this concept specific to one app? -> Place in
{domain_dir}(default) - Consumed by >1 app today? -> Consider
{shared_domain_dir}with strict rules:- No persistence fields (if
domain_purity.no_persistence_fields: true) - Minimal fields: business identity + attributes only
- No persistence fields (if
Step 5: Output
List created files and TODO markers. Suggest next step (usually adapter-implementer or test-author).
Rules
- ALWAYS scan existing code first for patterns.
- ALWAYS follow project naming conventions from config.
- NEVER export adapters or mocks from barrel files.
- Wire adapters only in
{composition_root}.