Skip to content

Implement meta-log skill for issue #144#145

Open
maciejmalecki wants to merge 21 commits intomasterfrom
feature/135-pipeline-dsl-parallel-execution
Open

Implement meta-log skill for issue #144#145
maciejmalecki wants to merge 21 commits intomasterfrom
feature/135-pipeline-dsl-parallel-execution

Conversation

@maciejmalecki
Copy link
Copy Markdown
Member

Summary

Implement meta-log skill to automatically log changes to Claude Code internal assets (CLAUDE.md, .claude/) as structured Markdown audit entries in meta/ folder.

Changes

  • Create .claude/skills/meta-log/SKILL.md with 8-step procedure for logging
  • Add "Claude Code Asset Governance" section to CLAUDE.md
  • Create meta/README.md index for tracking audit entries
  • Create first log entry: meta/MET-0001_implement-meta-log-skill.md

How It Works

  • Auto-triggering: Standing instruction in CLAUDE.md triggers the skill before modifying Claude Code internal assets
  • Who initiated: Auto-detected (human, AI, or human + AI)
  • Date handling: Current date by default, with git log detection for backports
  • Preview/confirm: Drafts entry and waits for user approval before writing
  • Index updates: Automatically maintains meta/README.md table

Acceptance Criteria

  • ✅ Skill defined and visible in skill picker
  • ✅ Auto-triggers on create/modify/delete of Claude Code assets
  • ✅ Each entry follows specified structure
  • ✅ File names use MET-nnnn_slug.md convention
  • ✅ Index created and updated
  • ✅ Backporting support via git log
  • ✅ Templates folder excluded
  • ✅ Preview/confirm workflow implemented

Closes #144

🤖 Generated with Claude Code

maciejmalecki and others added 21 commits November 11, 2025 22:39
* New commands

* plan without clarifications

* Update Feature 126 action plan with resolved questions and design decisions

Answered all 5 unresolved questions:
- Validation: File existence checks moved to adapters (simpler step validation)
- Error format: Standardized to "Step '<name>': {message}" format
- Port injection: Refactor to constructor injection for type safety
- equals/hashCode: Remove (use data class auto-generated versions)
- Documentation: Follow Kdoc style guide strictly

Updated Decision 6 (Port Injection) from "keep current" to "constructor injection"
with detailed implementation approach for Gradle task infrastructure.

Updated Phase 2 steps to reflect these decisions:
- Step 2.1: Validation simplified to 15-25 lines per step (file checks removed)
- Step 2.3: Error messages use standardized format
- Step 2.4: Documentation must follow strict Kdoc style guide

Plan is now ready for Phase 1-3 implementation.

🤖 Generated with Claude Code

Co-Authored-By: Claude <noreply@anthropic.com>

* Feature #126: Complete Phase 1 - Foundation refactoring of flows subdomain

Implement Phase 1 of comprehensive flows quality audit by extracting common
patterns and eliminating boilerplate across all step classes:

**Changes**:
- Extended FlowStep base class with 5 protected helper methods:
  - getProjectRootDir(context): Extracts and validates project root directory
  - resolveInputFiles(inputPaths, projectRootDir): Resolves input files with validation
  - resolveInputFile(inputPath, projectRootDir): Resolves single input file
  - resolveOutputFile(outputPath, projectRootDir): Resolves output file paths
  - validatePort<T>(port, portName): Validates port injection
  - Added StepValidationException and StepExecutionException for Phase 2

- Converted all 6 step classes to Kotlin data classes:
  - AssembleStep, CharpadStep, CommandStep, GoattrackerStep, ImageStep, SpritepadStep
  - Removed explicit equals/hashCode implementations (~180 lines eliminated)
  - Added custom toString() for backward compatibility
  - Kept custom equals/hashCode for CommandStep (fluent API)

- Extracted file resolution logic to base class:
  - AssembleStep, GoattrackerStep, ImageStep, SpritepadStep now use base class helpers
  - CharpadStep, CommandStep kept inline resolution for specific error messages
  - Eliminated ~40 lines of duplication per step

**Test Results**: All 112 unit tests passing, no regressions

**Metrics**:
- Boilerplate eliminated: ~180-200 lines
- File resolution code centralized: ~140 lines extracted
- New protected methods: 5
- Data classes: 6 (equals/hashCode auto-generated)
- Code quality: Significantly improved maintainability

**Design Decisions**:
- Kept CharpadStep inline resolution for "CTM file does not exist" specific message
- Kept CommandStep inline resolution for parameter validation ordering
- Made FlowStep properties (name, inputs, outputs) `open` for data class override
- Used IllegalArgumentException in resolveInputFiles() for Phase 1 compatibility

Ready for Phase 2: Core Quality Improvements - Standardize Validation & Error Handling

🤖 Generated with Claude Code

Co-Authored-By: Claude <noreply@anthropic.com>

* Apply spotless formatting to flows step classes

* Refactor flows: standardize validation and error handling

- Simplify step validation to minimal level (15-25 lines per step)
  - Removed excessive file path checks, format validation, range checks
  - Kept only critical domain rule validation
  - Deferred non-critical checks to adapters

- Replace all exception types with custom StepValidationException/StepExecutionException
  - Standardized error message format: "Step '<name>': {message}"
  - Replaced IllegalStateException/IllegalArgumentException across all steps
  - Added proper exception chaining for root causes

- Add Kdoc documentation to all step classes
  - Concise 3-5 line Kdoc per class
  - Document purpose, validation rules, port requirements
  - Follow Kotlin style guide conventions

- Update tests to expect new exception types
  - 4 test cases updated for new StepExecutionException/StepValidationException
  - All 112 flows tests passing (100%)

Results:
- ~200-300 lines of boilerplate validation removed
- Consistent error handling across all steps
- Professional documentation matching codebase standards

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

* Update action plan: Phase 2 completed

* Mark Phase 2 steps as completed in action plan

* Refactor flows: Polish documentation and align with codebase style

Phase 3: Completion of flows subdomain refactoring with documentation cleanup and pattern documentation.

Changes:
- Cleaned up verbose documentation in CharpadOutputs.kt (reduced 300+ lines to 3-5 line concise Kdoc)
- Simplified FlowDsl.kt documentation (removed 180 lines of extensive examples, kept essential 3-line class doc)
- Added "Flows Subdomain Patterns" section to CLAUDE.md documenting:
  * Data class pattern for step classes
  * Port injection pattern
  * File resolution and validation approaches
  * Error handling with custom exceptions
  * Documentation style guidelines
  * Example step implementation
- Documentation reduced by ~65% overall (from verbose to professional Kdoc style)
- All 112 flows tests passing
- Plugin JAR builds successfully
- 100% backward compatible

This completes all 3 phases of the flows subdomain refactoring:
✓ Phase 1: Foundation - Extract common patterns (boilerplate elimination)
✓ Phase 2: Core Quality - Standardize validation and error handling
✓ Phase 3: Polish - Documentation cleanup and patterns documentation

Total refactoring reduction: 60-70% code reduction across flows subdomain.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

* Mark Phase 1, 2, and 3 steps as completed in action plan

* fixed doc

---------

Co-authored-by: Claude <noreply@anthropic.com>
* Plan: Implement Exomizer cruncher domain (issue 57)

Initial development plan for new crunchers/exomizer subdomain with two use cases:
- Raw compression mode
- Memory-optimized compression mode

Includes 5 implementation phases covering domain logic, Gradle adapter, flows integration,
testing, and documentation. Follows hexagonal architecture patterns established in the
project.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

* Update plan with Exomizer command options and detailed implementation steps

Added comprehensive information gathered from examining exomizer tool:
- Raw mode options (17+ flags available)
- Memory mode options with load address support
- Multiple input file support in mem mode

Refined execution plan with concrete implementation details:
- Specific data class structures (RawOptions, MemOptions)
- Gradle task properties and annotations
- Command-line argument building strategy
- Port interface signatures
- Validation rules for memory mode

Reformulated implementation questions based on actual tool capabilities.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

* Update documentation

* Implement Exomizer cruncher domain (issue 57)

Complete implementation of the Exomizer cruncher domain with full support for raw and memory compression modes. Includes domain logic, Gradle task adapters, flows integration, and comprehensive test coverage.

Features:
- Raw and memory compression modes with 14+ configurable options
- Load address validation (auto, none, hex, decimal formats)
- Hexagonal architecture with port-based abstraction
- Type-safe Gradle DSL for flow steps (exomizerStep { ... })
- Gradle task adapters (CrunchRaw, CrunchMem)
- Flow step integration (ExomizerStep, ExomizerPort)
- Unit tests with Kotest framework
- Proper error handling and validation

Architecture:
- crunchers/exomizer: Domain and adapter modules
- flows: Step class, port interface, DSL builder, and adapter
- infra/gradle: Plugin dependencies registered

All phases completed:
1. Core infrastructure (module structure, build config)
2. Domain layer (data structures, use cases, port interface)
3. Adapter layer (Gradle tasks, binary execution)
4. Flows integration (step, DSL builder, adapter)
5. Testing and documentation (unit tests, full build pass)

🤖 Generated with Claude Code

Co-Authored-By: Claude <noreply@anthropic.com>

* Fix CircleCI publish job to only run on semver tags

The publish job was running on feature branches due to an ineffective branch ignore filter. Changed to explicitly ignore all branches and rely only on the semver tag filter to ensure publishing only happens on GitHub releases.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

* Include feature branches in CircleCI builds

Added regex pattern to match branches with slashes (e.g., feature/57-exomizer) so that builds run for feature branches while keeping publish restricted to semver tags only.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

* Fix Gradle ClassGenerationException in BaseFlowStepTask

Changed BaseFlowStepTask.executeStepLogic() from abstract method to
non-abstract method with default implementation. Gradle cannot generate
decorated classes for abstract methods, but abstract classes with
abstract properties are supported. This maintains the inheritance
hierarchy while allowing Gradle to properly instantiate task classes.

🤖 Generated with Claude Code

Co-Authored-By: Claude <noreply@anthropic.com>

* Update documentation

* Add /fix command for error diagnosis and action plan updates

Introduces new Claude command that analyzes implementation errors and updates action plans with fix steps. Supports categorization of build-time, runtime, factual, and other errors with detailed root cause analysis and structured fix planning.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

* Update exomizer documentation with execution log and fix strategy

Added execution log documenting the missing ExomizerTask adapter issue discovered when running the flow. Includes root cause analysis and detailed fix steps for:
1. Creating the ExomizerTask Gradle adapter
2. Updating FlowTasksGenerator to recognize ExomizerStep

🤖 Generated with Claude Code

Co-Authored-By: Claude <noreply@anthropic.com>

* Fix Issue 57: Implement missing ExomizerTask adapter and flows integration

Complete the Exomizer implementation by:
- Creating ExomizerTask Gradle task adapter following CharpadTask pattern
- Updating FlowTasksGenerator to properly recognize and handle ExomizerStep
- Creating flows/adapters/out/exomizer module to bridge domain and crunchers layers
- Implementing ExomizerAdapter with crunchRaw and crunchMem port methods
- Registering new modules in settings.gradle.kts and infra dependencies

This resolves the runtime error where ExomizerStep would fall back to base
implementation due to missing task adapter and generator handler.

All tests pass and code formatting passes spotless checks.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

* Update action plan: Mark Phases 1-4 as completed

- Marked Phase 1 (Module structure) as COMPLETED
- Marked Phase 2 (Domain layer) as COMPLETED
- Marked Phase 3 (Adapter layer) as COMPLETED
- Marked Phase 4 (Flows integration) as COMPLETED with note about critical fix
- Phase 5 (Testing & docs) marked as PENDING and ready for implementation
- Added revision history section documenting the updates
- Documented successful execution with build passing all tests

All core implementation phases are now complete with ExomizerTask
adapter and flows integration fully functional.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

* Complete Phase 5: Add comprehensive testing and documentation for Exomizer

Implemented all Phase 5 deliverables:

1. Unit Tests for Use Cases
   - Verified CrunchRawUseCaseTest and CrunchMemUseCaseTest
   - Full coverage of validation scenarios and error handling

2. Integration Tests for Gradle Tasks
   - CrunchRawTaskTest: Mock port integration and option validation
   - CrunchMemTaskTest: Memory mode options and load address formats
   - GradleExomizerAdapterTest: Option data structure validation

3. Flows Integration Tests
   - ExomizerStepTest: 25+ tests covering all execution paths
   - Validation of step configuration and port injection
   - Support for raw and memory compression modes

4. User Documentation
   - Created 57-exomizer-DOCUMENTATION.md with comprehensive guide
   - Basic usage examples for both raw and memory modes
   - Configuration reference for all Exomizer options
   - Troubleshooting guide and integration examples

Test Results:
- Full build: BUILD SUCCESSFUL (247 tasks)
- All tests passing across all modules
- Code formatting validated (spotless)
- No compilation errors

All 5 phases (1-5) now marked as COMPLETED.
Implementation ready for production use.

🤖 Generated with Claude Code

Co-Authored-By: Claude <noreply@anthropic.com>

* Update action plan: Expand Exomizer to support all command-line options

Specification update for Issue 57: Both raw and memory compression modes
now support all available Exomizer options. Previously deferred advanced
options (-e, -E, -m, -M, -p, -T, -P, -N, -d) are now included in scope,
providing complete feature parity with the exomizer command-line tool.

Changes:
- Updated Exomizer Command Structure section to reflect complete support
- Modified configuration decisions to include all advanced options
- Expanded Phase 2 domain structure definitions for all options
- Updated Phase 3 Gradle tasks to expose all configuration properties
- Clarified Phase 3 port adapter to handle all command-line flags
- Added new Specification Update section documenting the change
- Updated Revision History with implementation action items

Impact: Implementation code must be updated to support all options in
both raw and memory modes across all layers (domain, adapters, flows).

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

* Issue 57: Add decrunch option support to Exomizer compression

Implement the missing decrunch (-d) flag for both raw and memory compression modes
to complete the specification update requiring all Exomizer command-line options.

Changes:
- ExomizerOptions: Add decrunch boolean property to RawOptions and MemOptions
- CrunchRaw task: Expose decrunch property and include in options creation
- CrunchMem task: Expose decrunch property and include in options creation
- GradleExomizerAdapter: Add decrunch flag (-d) to buildRawArgs and buildMemArgs

All 17 Exomizer options now supported in both raw and memory modes. Build successful
with 247 tasks and all tests passing.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

---------

Co-authored-by: Claude <noreply@anthropic.com>
* Update dasm support action plan with discovered parameters

Answered all 6 unresolved questions by running dasm command inspection:
- Documented all 17 dasm CLI parameters and flags
- Confirmed 3 output format support (-f1, -f2, -f3)
- Decided on separate DasmConfig class for type safety
- Confirmed VICE symbol file support via -s flag
- Decided PATH validation at execution time
- Updated Phase 2 DasmConfig field definitions with concrete types

Plan now ready for Phase 1 implementation of dasm compiler support.

🤖 Generated with Claude Code

Co-Authored-By: Claude <noreply@anthropic.com>

* Add dasm compiler support to Flows DSL (#129)

Implement comprehensive dasm assembler support alongside existing Kick Assembler:

Domain Implementation (compilers/dasm):
- DasmAssemblerSettings: Marker settings class for dasm compiler
- DasmAssemblePort: Port interface with full parameter support
- DasmAssembleUseCase: Single-method use case delegating to port
- DasmCommandLineBuilder: Fluent builder for CLI argument construction
- DasmAssembleAdapter: Gradle adapter executing dasm via system command

Flows Domain Integration:
- DasmConfig: Type-safe configuration for dasm-specific parameters
- DasmStep: Flow step implementation mirroring AssembleStep pattern
- DasmConfigMapper: Maps configuration to commands with file discovery
- DasmAssemblyPort: Port interface for flows domain integration

Gradle Adapter Integration:
- DasmStepBuilder: Type-safe DSL builder for dasmStep {} blocks
- DasmPortAdapter: Bridges flows domain to dasm compiler domain
- DasmCommandAdapter: Converts domain commands to dasm format
- DasmAssembleTask: Gradle task with @InputFiles/@OutputFiles support
- FlowTasksGenerator: Extended to register DasmStep task creation
- FlowDsl: Added dasmStep {} DSL builder method
- RetroAssemblerPlugin: Creates and injects DasmAssembleUseCase

Supported dasm parameters:
- Include paths (-I), defines (-D), output format (-f#: 1-3)
- List file (-l), symbol file (-s)
- Verboseness (-v#: 0-4), error format (-E#)
- Strict syntax (-S), remove on error (-R)
- Symbol table sorting (-T#)

Features:
- Command-line execution via system PATH (no JAR management)
- Incremental build support via @InputFiles/@OutputFiles
- Glob pattern file discovery
- Configuration validation with parameter ranges
- Full hexagonal architecture compliance
- Backward compatible with existing Kick Assembler

Build verified: 247 actionable tasks, all passing

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

* Fix dasm command-line argument format in DasmCommandLineBuilder

Corrected two critical issues with dasm CLI argument formatting:

1. Source file positioning: Moved source file to first argument position
   as required by dasm (Usage: dasm sourcefile [options])
2. Parameter formatting: Changed from space-separated parameters (e.g.,
   -I path, -o path) to concatenated format without spaces (e.g., -Ipath,
   -opath) for -I, -o, -l, -s, and -D flags

Changes:
- DasmCommandLineBuilder: Constructor now accepts source path as required
  parameter, added directly to args list. Updated all parameter methods to
  use concatenated format. Removed separate source() method.
- DasmAssembleAdapter: Updated to pass source file to constructor instead
  of calling builder.source()
- Updated action plan with execution log documenting the fix

Build passes successfully with all 257 actionable tasks completing.

🤖 Generated with Claude Code

Co-Authored-By: Claude <noreply@anthropic.com>

* Update prompts

---------

Co-authored-by: Claude <noreply@anthropic.com>
* Add development plan for issue #132: from-to-shortcuts DSL feature

Creates comprehensive feature plan including:
- Feature overview and requirements
- Architecture alignment with hexagonal pattern
- Three-phase implementation strategy
- Complete test coverage strategy
- Risk assessment and mitigation

Covers shortcuts useFrom() and useTo() for CommandStepBuilder DSL to eliminate path duplication.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

* Update action plan for issue #132: Add index support and exception handling

Answered unresolved questions about useFrom/useTo shortcut implementation:
- Added index parameter support with default value for backward compatibility
- Changed empty path handling from silent fallback to fail-fast exceptions

Updates include:
- New Decision 2: Index Support for Multiple Paths
- Implementation now uses useFrom(index: Int = 0) and useTo(index: Int = 0)
- Throws IllegalStateException when paths not set, IndexOutOfBoundsException for bad indices
- Comprehensive test coverage for exception scenarios
- Expanded documentation requirements for KDoc with parameter, return, and exception docs

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

* Add useFrom() and useTo() shortcuts to CommandStepBuilder in flows DSL

Implement convenient DSL shortcuts that allow referencing input/output paths
in command parameters, eliminating the need to duplicate path names. The
shortcuts support index parameter for multiple inputs/outputs and include
comprehensive error handling with clear exception messages.

Features:
- Added useFrom(index: Int = 0) and useTo(index: Int = 0) methods
- Backward compatible with default index parameter
- Exception handling: IllegalStateException for missing paths, IndexOutOfBoundsException for invalid indices
- Comprehensive KDoc with usage examples
- 19 test scenarios covering all functionality
- Updated CLAUDE.md with DSL patterns documentation

Resolves #132

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

* format

---------

Co-authored-by: Claude <noreply@anthropic.com>
* docs: Add development plan for issue #134 - Flows Task Integration

This plan outlines the implementation strategy for creating a top-level 'flows'
Gradle task that automatically executes all defined flows and integrates with
the 'asm' task to ensure flows run before assembly compilation.

Plan includes:
- Architecture analysis and integration points
- 3-phase implementation strategy
- Comprehensive testing approach
- Risk mitigation and rollout plan

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

* docs: Answer unresolved questions in Flows Task Integration plan

- Confirmed flows task should always be created for consistency
- Confirmed to use Gradle's default output instead of custom logging
- Confirmed no CI/CD pipeline concerns identified
- Added revision history to track plan updates

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

* Implement flows task aggregation for automatic flow execution

Implement feature #134 - Flows Task Integration:
- Add TASK_FLOWS constant to shared task definitions
- Create top-level 'flows' aggregation task in FlowTasksGenerator that automatically depends on all flow-level tasks
- Make 'asm' task depend on 'flows' task to ensure flows execute before assembly
- Flows now run automatically when executing 'asm' or 'build' tasks
- Users can also run './gradlew flows' independently to execute all flows
- All existing tests pass - no breaking changes to existing functionality

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

* docs: Update action plan with completion status for issue #134

* style: Format FlowTasksGenerator code

---------

Co-authored-by: Claude <noreply@anthropic.com>
* Plan: Add quality metrics integration (issue #137)

Add comprehensive plan for integrating code quality tools:
- Detekt for static code analysis
- JaCoCo for test coverage reporting
- Kover for Kotlin-specific coverage
- CircleCI integration to publish metric artifacts

Phase 1: JaCoCo + Detekt foundation (non-blocking)
Phase 2: Kover + CircleCI artifact collection
Phase 3: Coverage enforcement + optional Codecov integration

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

* Update action plan: Answer all unresolved questions and finalize design decisions for quality metrics feature

- Finalized coverage threshold: 70% for domain modules, 50% for infrastructure
- Confirmed Detekt warnings-only mode (Phase 1), gradual strictness increase (Phase 3)
- Selected CircleCI-only integration (no Codecov/external services)
- Confirmed module-specific coverage thresholds
- Deferred external service integration for future phases
- Updated status from Planning to Ready for Implementation
- Added revision history tracking plan updates

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

* Feature #137: Add Quality Metrics Integration (JaCoCo + Detekt)

Implement comprehensive code quality metrics across the project using JaCoCo for test coverage reporting and Detekt for static code analysis.

Changes:
- Add JaCoCo (0.8.11) for aggregated test coverage reporting across all 53 modules
- Add Detekt (1.22.0) for Kotlin static code analysis with baseline rules
- Create detekt.yml configuration file with sensible defaults (warning mode, not breaking build)
- Configure JaCoCo to generate HTML and XML reports with automatic module aggregation
- Update CircleCI to collect coverage and analysis artifacts automatically
- Add verifyCodeCoverage task for coverage verification (70% minimum threshold)
- Document quality metrics setup in CLAUDE.md with usage guidelines and best practices

JaCoCo Setup:
- Convention plugin applies jacoco plugin to all modules
- Per-module jacocoTestReport tasks generated automatically during test runs
- Root-level jacocoReport task aggregates coverage from all modules
- Reports available at: build/reports/jacoco/aggregated/index.html

Detekt Setup:
- Configured at project root in detekt.yml
- Warning mode (violations don't fail build) for gradual adoption
- Enforces Kotlin conventions, detects bugs, limits complexity
- Can be customized by excluding/enabling specific rules

CircleCI Integration:
- JaCoCo and Detekt reports stored as artifacts
- Accessible via CircleCI UI under Artifacts tab
- Available for trend tracking and visibility across builds

Testing:
- All 53 modules tested successfully
- JaCoCo reports generated and aggregated without errors
- No build failures from quality tools
- Build time: ~1 minute for full test suite

🤖 Generated with Claude Code

Co-Authored-By: Claude <noreply@anthropic.com>

---------

Co-authored-by: Claude <noreply@anthropic.com>
Updated .claude/commands/release.md to ask users for the commit hash that denotes the last release (exclusive) instead of relying on version tags. This addresses the constraint that version tags are not placed on master branch and not directly visible on develop branch.

Changes:
- Added user prompt for commit hash in step 2
- Clarified that this commit hash marks an exclusive boundary
- Updated commit range specification from `<last-tag>..develop` to `<commit-hash>..develop`
- Added helpful context for users to find the correct commit

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
* Add architecture quality check action plan (Issue #193)

Perform comprehensive architecture quality check on 8 commits on develop branch.
Identified 2 MEDIUM severity violations:
- ExomizerStep and DasmStep declared as data classes with mutable port fields
- Violates Kotlin immutability contract and creates equality bugs
- Port injection via setters instead of constructor injection

Action plan includes:
- Convert ExomizerStep and DasmStep to regular classes
- Update CLAUDE.md to clarify step class patterns
- Add integration tests for end-to-end flow validation
- Estimated effort: 2-2.5 hours

Includes detailed implementation steps, validation criteria, and commit strategy.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

* Correct architecture quality check assessment for Issue #193

Fundamental correction to action plan based on comprehensive codebase analysis. Initial assessment incorrectly identified the data class + mutable port field pattern as an architectural violation. Investigation confirmed this is the established and correct pattern used consistently across ALL 8 step classes in the flows domain.

Key findings:
- All step classes (AssembleStep, CharpadStep, CommandStep, GoattrackerStep, ImageStep, SpritepadStep, ExomizerStep, DasmStep) use identical data class + mutable port field pattern
- Pattern is architecturally sound: immutable configuration (constructor params) vs. mutable infrastructure (injected ports)
- Data class equality correctly compares only configuration, not injected infrastructure
- CLAUDE.md documentation aligns with actual implementation patterns
- ExomizerStep and DasmStep are exemplary implementations demonstrating proper hexagonal architecture

Changed plan status from "violations require fixes" to "no action required - full compliance confirmed". No code changes are needed; implementations are architecturally compliant.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

---------

Co-authored-by: Claude <noreply@anthropic.com>
* Update issue 57 action plan: Specification refinement for full option exposure

- Document gap: All 15+ exomizer options supported in domain/tasks, but only 3 exposed in flow DSL
- Add new decision: ALL options must be exposed at DSL level for feature parity
- Mark Phase 4 as IN PROGRESS with specific update requirements:
  * Step 4.1: Update ExomizerStep with all RawOptions properties (HIGH, 30 min)
  * Step 4.2: Update ExomizerPort interface for complete options (HIGH, 15 min)
  * Step 4.3: Rewrite ExomizerStepBuilder with full builders (HIGH, 45 min)
  * Step 4.5: Update FlowExomizerAdapter to wire all options (HIGH, 30 min)
- Mark Phase 5 tests/docs as needing corresponding updates
- Add execution log entry documenting specification refinement and solution approach
- Total effort: 2-3 hours for complete implementation
- Impact: Medium scope, fully backward compatible, no breaking changes

🤖 Generated with Claude Code

Co-Authored-By: Claude <noreply@anthropic.com>

* Implement full Exomizer option exposure through flows DSL

Complete implementation of Phase 4 and 5: All 15+ Exomizer options are now
fully exposed and tested through all layers - domain, adapters, DSL, tests,
and documentation.

Changes include:
- ExomizerStep: Added all 15 RawOptions properties as constructor parameters
- ExomizerPort: Updated signatures to accept Map<String, Any?> for full options
- ExomizerStepBuilder: Completely rewritten with RawModeBuilder and MemModeBuilder
  exposing all options to users through type-safe DSL
- FlowExomizerAdapter: Updated to extract and pass complete options
- ExomizerAdapter (out): Updated to match new port interface
- Tests: Comprehensive test coverage for all options flowing through stack
- Documentation: Updated status to COMPLETED with achievement summary

All layers now support complete option configuration consistently. Build
successful, all tests passing, backward compatible with existing configurations.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

* Fix output file path truncation in CommandLineBuilder

The outputFile() method was using Path.name which returns only the
filename, causing paths like "build/kickass/out.bin" to be truncated
to "./out.bin". Changed to use absolutePathString() to preserve the
full directory structure in KickAssembler's -o argument.

Root cause: Method was designed for use with separate -odir argument,
but when called with full path intent, it should use absolute path to
ensure output file is placed at the correct location.

Verified with successful build (188 actionable tasks).

🤖 Generated with Claude Code

Co-Authored-By: Claude <noreply@anthropic.com>

* Update issue 57 action plan: Error analysis and fix strategy for flow DSL inputs/outputs wiring

Diagnosed runtime error in ExomizerStep where flow DSL from()/to() methods populate
ExomizerStep.inputs/outputs correctly, but FlowTasksGenerator doesn't wire these to
Gradle task's inputFiles property, causing validation failure.

Root cause: Architecture has two separate input/output systems (flow DSL and Gradle task)
that were not connected. Fix requires updating FlowTasksGenerator to resolve step inputs
and wire them to task.inputFiles during task creation.

Added comprehensive execution log entry with detailed fix steps and verification checklist.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

* Fix flow DSL input/output wiring in FlowTasksGenerator

Remove `.filter { it.exists() }` from FlowTasksGenerator.configureBaseTask()
that was preventing input files from being wired to Gradle tasks. Input files
may not exist at configuration time if they're created by earlier build steps.
Gradle's task execution handles file validation at runtime, enabling proper
incremental build support for flow steps that depend on generated inputs.

This fixes the "requires input files but none were configured" validation error
when using flow DSL with steps like exomizerStep that declare inputs.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

---------

Co-authored-by: Claude <noreply@anthropic.com>
- /check: Run full build with static checks (Spotless, Detekt) plus JaCoCo coverage
- /test: Run unit tests across all 58+ modules with failure diagnostics

Both skills are user-invocable CLI commands that analyze project state and provide
detailed reports. Organized in .claude/skills/ directory per modern Claude Code convention.

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
- Remove generic designer.md and developer.md agents
- Add planner.md: creates and refines action plans interactively, reads codebase before writing, enters Q&A refinement loop until user is satisfied
- Add implementer.md: executes plans from .ai/ step-by-step, runs tests after each step, updates plan file with progress markers and execution log

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…ription

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Adds kotlin-lsp, claude-md-management, and commit-commands plugins to the
enabled plugins list, and updates the schema URL to the correct claude-code-settings.json.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Add automatic audit trail logging for changes to Claude Code internal assets
(CLAUDE.md, .claude/agents/, .claude/skills/, .claude/commands/, settings).

Changes:
- Create .claude/skills/meta-log/SKILL.md with 8-step procedure for logging
- Add Claude Code Asset Governance section to CLAUDE.md
- Create meta/README.md index for audit entries
- Log the implementation itself in meta/MET-0001_implement-meta-log-skill.md

The skill auto-triggers before modifications, presents a preview to the user,
and only writes the entry after explicit confirmation. Supports date backporting
via git log detection.

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
…com:c64lib/gradle-retro-assembler-plugin into feature/135-pipeline-dsl-parallel-execution
- Add .claude/skills/plan/SKILL.md: mechanical plan file I/O (create, update, list), plans/ storage, index maintenance, GitHub issue sync
- Add .claude/templates/plan.template.md: canonical plan document structure extracted from planner agent
- Refactor .claude/agents/planner.md: delegate all file I/O to plan skill, auto-detect issue number from branch, search plans/ before .ai/ for legacy fallback
- Create plans/README.md: empty index ready for first plan entry
- Add meta/MET-0002: audit trail entry for this change

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Meta skill: log Claude Code config evolution

1 participant