Decorators Feature Implementation Plan
Overview
This document outlines the implementation plan for the decorators feature in Morphir Go. Decorators allow users to attach additional metadata to Morphir IR elements (types, values, modules) that cannot be captured in the source language. The metadata is stored in sidecar files and its shape is defined using Morphir IR itself.
Current Status
✅ Completed:
- Configuration parsing for decorations in
morphir.jsonandmorphir.toml DecorationConfigtype with all required fields- Integration with
ProjectSectionandworkspace.Project - Basic test coverage for configuration loading
Architecture Overview
The decorators system consists of several components:
-
Configuration Layer (✅ Complete)
- Parsing decoration configs from
morphir.json/morphir.toml - Storing decoration metadata (displayName, ir, entryPoint, storageLocation)
- Parsing decoration configs from
-
Decoration IR Loading (⏳ TODO)
- Load decoration schema IR files
- Validate entry point references
- Extract type definitions for decoration shapes
-
Decoration Value Storage (⏳ TODO)
- Load/save decoration value files (JSON)
- Map decoration values to IR nodes using FQNames
- Validate values against decoration schemas
-
IR Integration (⏳ TODO)
- Attach decorations to IR nodes (types, values, modules)
- Support decoration queries/access
- Maintain decoration-to-node mappings
-
CLI Commands (⏳ TODO)
morphir decoration-setup- Auto-configure decorationsmorphir decoration-validate- Validate decoration values
-
API Endpoints (⏳ TODO)
/server/attributes- Expose decoration configs for develop UI- Decoration CRUD operations
-
Test Fixtures (⏳ TODO)
- Extract test fixtures from morphir-elm
- Create example decoration schemas
- Create example decoration value files
Implementation Phases
Phase 1: Core Decoration Infrastructure
Goal: Build the foundation for loading and validating decorations.
Beads Issues:
morphir-om0- Phase 1: Core Decoration Infrastructure (feature)morphir-3cr- Load and validate decoration IR filesmorphir-zdb- Implement decoration value file loader/savermorphir-dmi- Validate decoration values against schemas
Tasks:
-
Create decoration IR loader (
morphir-3cr)- Load Morphir IR files for decoration schemas
- Parse entry point FQNames (PackageName:ModuleName:TypeName)
- Validate entry point exists in decoration IR
- Extract type definitions for decoration shapes
-
Implement entry point validation (
morphir-3cr)- Validate FQName format
- Check package name matches decoration IR
- Verify module exists in decoration IR
- Verify type exists in module
-
Create decoration value file loader/saver (
morphir-zdb)- Load JSON files keyed by FQName
- Save decoration values to JSON files
- Maintain FQName-to-value mappings
- Support empty decoration files
-
Implement FQName-based node mapping (
morphir-zdb)- Map decoration values to IR nodes using FQNames
- Support types:
PackageName:ModuleName:TypeName - Support values:
PackageName:ModuleName:ValueName - Support modules:
PackageName:ModuleName
-
Validate decoration values against schemas (
morphir-dmi)- Load decoration IR for schema
- Find entry point type definition
- Validate values conform to type
- Return clear validation errors with FQName context
Dependencies: None
Estimated Effort: Medium
Reference Implementation:
- morphir-elm: CustomAttribute configuration processing
- morphir-elm: Decoration IR loading and validation
Phase 2: IR Integration
Goal: Integrate decorations with Morphir IR types.
Beads Issues:
morphir-msl- Phase 2: IR Integration (feature)morphir-86i- Attach decorations to IR nodesmorphir-bxw- Implement decoration queries and accessors
Tasks:
-
Design decoration attachment mechanism (
morphir-86i)- Decide on decoration storage (separate map vs. embedded)
- Ensure immutability of IR nodes
- Support decoration-to-node mappings
- Handle decoration updates
-
Extend IR types to support decoration metadata (
morphir-86i)- Add decoration accessor methods
- Maintain decoration-to-node mappings
- Support decoration queries by FQName
-
Implement decoration queries/accessors (
morphir-bxw)- Get all decorations for a node
- Get specific decoration by ID
- Check if node has decorations
- Support filtering by decoration type
-
Add decoration validation during IR processing (
morphir-86i)- Validate decorations when loading IR
- Report validation errors
- Support optional validation (warnings vs. errors)
Dependencies: Phase 1
Estimated Effort: Medium-High
Reference Implementation:
- morphir-elm: CustomAttribute attachment to IR nodes
- morphir-elm: Decoration query patterns
Phase 3: CLI Commands
Goal: Provide command-line tools for decoration management.
Beads Issues:
morphir-p6n- Phase 3: CLI Commands (feature)morphir-snf- Implement morphir decoration-setup commandmorphir-hvp- Implement morphir decoration-validate command
Tasks:
-
Implement
decoration-setupcommand (morphir-snf)- Read decoration IR file
- Detect entry point from decoration IR
- Add decoration config to
morphir.json/morphir.toml - Support
-iflag for decoration IR path - Support
--storage-locationflag
-
Implement
decoration-validatecommand (morphir-hvp)- Load all decoration configs from project
- Load decoration value files
- Validate all decoration values against schemas
- Report validation errors with FQName context
- Support
--jsonflag for machine-readable output - Exit with non-zero code on validation failures
-
Add decoration-related flags to existing commands
- Add
--with-decorationsflag tomorphir make - Add decoration validation to
morphir validate - Support decoration filtering in queries
- Add
Dependencies: Phase 1, Phase 2
Estimated Effort: Low-Medium
Reference Implementation:
- morphir-elm:
morphir decoration-setupcommand - morphir-elm: Decoration validation patterns
Phase 4: API Endpoints
Goal: Enable develop UI integration.
Beads Issues:
morphir-p02- Phase 4: API Endpoints (feature)morphir-kes- Create /server/attributes API endpointmorphir-9w5- Implement decoration CRUD operations API
Tasks:
-
Create
/server/attributesendpoint (morphir-kes)- Expose processed decoration configuration
- Return decoration configs with displayName, entryPoint, data, IR
- Match morphir-elm API contract for compatibility
- Support JSON response format
-
Implement decoration CRUD operations (
morphir-9w5)- GET decorations for a node (by FQName)
- POST/PUT to update decoration values
- DELETE to remove decorations
- Support FQName-based node identification
- Validate values against schemas on write operations
-
Add decoration value validation endpoints
- POST
/server/attributes/validate- Validate single decoration value - POST
/server/attributes/validate-all- Validate all decorations - Return validation errors with context
- POST
-
Support real-time decoration updates
- Watch decoration value files for changes
- Notify clients of decoration updates
- Support WebSocket or polling for updates
Dependencies: Phase 1, Phase 2
Estimated Effort: Medium
Reference Implementation:
- morphir-elm:
/server/attributesendpoint implementation - morphir-elm: Decoration CRUD operations
Phase 5: Test Fixtures and Examples
Goal: Provide comprehensive test coverage and examples.
Beads Issues:
morphir-zzc- Phase 5: Test Fixtures and Examples (feature)morphir-ckf- Extract test fixtures from morphir-elm for decorationsmorphir-nfo- Create example decoration schemas and value files
Tasks:
-
Extract test fixtures from morphir-elm (
morphir-ckf)- Find decoration schema examples in morphir-elm
- Extract decoration value file examples
- Extract integration test patterns
- Adapt fixtures for Go testing
- Place in
tests/bdd/testdata/decorations/directory
-
Create example decoration schemas (
morphir-nfo)- Simple decoration schema (e.g., boolean flag)
- Complex decoration schema (e.g., structured metadata)
- Place in
examples/decorations/directory
-
Create example decoration value files (
morphir-nfo)- Example value files with various FQName mappings
- Include edge cases (empty files, invalid FQNames, etc.)
- Place in
examples/decorations/directory
-
Create integration tests
- Test decoration loading end-to-end
- Test decoration validation
- Test decoration CRUD operations
- Test CLI commands
-
Update documentation with examples
- Add decoration examples to user guide
- Add developer examples to developer guide
- Include example decoration schemas in docs
Dependencies: All previous phases
Estimated Effort: Low-Medium
Reference Sources:
- morphir-elm:
tests-integration/cli/test-ir-filesdirectory - morphir-elm: Example decoration schemas
- morphir-elm: Integration tests
Key Design Decisions
Decoration Storage Format
Decoration values are stored as JSON files with FQName keys:
{
"My.Package:Foo:bar": <decoration-value>,
"My.Package:Baz:bat": <decoration-value>
}
Entry Point Format
Entry points use FQName format: PackageName:ModuleName:TypeName
Example: My.Amazing.Decoration:Foo:Shape
Decoration Schema Validation
Decoration values must conform to the type defined at the entry point in the decoration IR. This requires:
- Loading the decoration IR
- Finding the entry point type
- Validating values against that type
IR Node Identification
IR nodes are identified using FQNames:
- Types:
PackageName:ModuleName:TypeName - Values:
PackageName:ModuleName:ValueName - Modules:
PackageName:ModuleName(for module-level decorations)
Immutability
All decoration operations must maintain immutability:
- IR nodes are not mutated
- Decorations are stored separately
- Accessors return defensive copies
- Updates create new instances
Reference Implementation
The morphir-elm implementation provides the reference:
- Configuration:
morphir.jsonwithdecorationsfield - Storage: JSON files keyed by FQName
- API:
/server/attributesendpoint - UI: Morphir Web with "Decorations" tab
Key Files in morphir-elm
-
CustomAttribute Types:
src/Morphir/CustomAttribute/CustomAttribute.elm- Core typessrc/Morphir/CustomAttribute/CustomAttributeConfig.elm- Configuration types
-
Decoration Processing:
- JavaScript: Decoration configuration processing
- Elm: CustomAttributeConfigs decoding
-
API Endpoints:
/server/attributesroute implementation
-
CLI Commands:
decoration-setupcommand implementation
Test Fixtures from morphir-elm
The morphir-elm codebase contains:
- Example decoration schemas (IR files)
- Example decoration value files (JSON)
- Integration tests
These should be extracted and adapted for Go testing. Key locations:
tests-integration/cli/test-ir-files/- IR test fixtures- Example decoration schemas in morphir-elm source
- Integration test examples
Success Criteria
- ✅ Configuration parsing works (complete)
- ⏳ Can load decoration IR files
- ⏳ Can load/save decoration value files
- ⏳ Can validate decoration values against schemas
- ⏳ Can attach decorations to IR nodes
- ⏳ CLI commands work
- ⏳ API endpoints work
- ⏳ Comprehensive test coverage
Next Steps
- ✅ Review this plan (complete)
- ✅ Create beads issues for each phase (complete)
- ⏳ Start with Phase 1 implementation
- ⏳ Extract test fixtures from morphir-elm
Beads Issues Summary
Phase 1: Core Decoration Infrastructure
morphir-om0- Phase 1 feature (depends on: morphir-3cr, morphir-zdb, morphir-dmi)morphir-3cr- Load and validate decoration IR filesmorphir-zdb- Implement decoration value file loader/savermorphir-dmi- Validate decoration values against schemas (depends on: morphir-3cr, morphir-zdb)
Phase 2: IR Integration
morphir-msl- Phase 2 feature (depends on: morphir-om0, morphir-86i, morphir-bxw)morphir-86i- Attach decorations to IR nodesmorphir-bxw- Implement decoration queries and accessors (depends on: morphir-86i)
Phase 3: CLI Commands
morphir-p6n- Phase 3 feature (depends on: morphir-om0, morphir-msl, morphir-snf, morphir-hvp)morphir-snf- Implement morphir decoration-setup command (depends on: morphir-3cr)morphir-hvp- Implement morphir decoration-validate command (depends on: morphir-dmi)
Phase 4: API Endpoints
morphir-p02- Phase 4 feature (depends on: morphir-om0, morphir-msl, morphir-kes, morphir-9w5)morphir-kes- Create /server/attributes API endpoint (depends on: morphir-3cr, morphir-zdb)morphir-9w5- Implement decoration CRUD operations API (depends on: morphir-bxw, morphir-dmi)
Phase 5: Test Fixtures and Examples
morphir-zzc- Phase 5 feature (depends on: morphir-om0, morphir-msl, morphir-p6n, morphir-p02, morphir-ckf, morphir-nfo)morphir-ckf- Extract test fixtures from morphir-elm for decorationsmorphir-nfo- Create example decoration schemas and value files