feat: .NET modernization and dependency injection (v0.3) - #45
Merged
Merged
Conversation
Upgraded all projects from .NET 6.0 to .NET 10 with: - Latest C# language version - Nullable reference types enabled - Warnings as errors enforced - Code style enforcement via EditorConfig - Global MSBuild properties via Directory.Build.props Includes comprehensive .editorconfig with: - File-scoped namespace preference - var keyword enforcement - Nullable reference type rules - Modern C# pattern preferences Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Added comprehensive .claude configuration: - 5 rules (modernization, testing, spec-first, github-workflow, git-conventions) - 5 skills (verify-coverage, audit-build, audit-claude-config, create-issue, commit-push) - 2 agents (code-reviewer, test-writer) - Agent memory system - Workflow infrastructure - Configuration audits Enforces: - Spec-driven development (no code without tests/issues) - 80% code coverage minimum - Conventional Commits format - Modern .NET/C# patterns Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Added CI/CD workflows: - ci.yml: Build, test, and code coverage on every PR - Enforces 80% minimum coverage - Reports coverage in PR comments - Blocks merge if coverage below threshold - release.yml: Automated releases on git tags - Multi-platform builds (Win/Linux/macOS) - Extracts release notes from CHANGELOG.md - Attaches binaries to GitHub releases - Issue template for modernization tasks Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Added convenience scripts for common development tasks: - build: Build the solution - test: Run tests with code coverage reporting - run: Run the BASIC REPL or execute .BAS files - publish: Create multi-platform release binaries Supports both Bash (Linux/macOS) and Batch (Windows). Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Updated and added documentation: - CLAUDE.md: Development guidelines with Clean Architecture and spec-driven principles - README.md: Modernized with quick start guide - CHANGELOG.md: Prepared for semantic versioning - docs/: 5 comprehensive setup and planning documents - CLAUDE_SETUP_GUIDE.md: Complete .claude configuration reference - CONFIGURATION_SUMMARY.md: Build configuration explained - FINAL_SETUP_STATUS.md: Ready-to-start checklist - MODERNIZATION_PLAN.md: 5-phase migration strategy - SETUP_COMPLETE.md: Next steps guide Added MCP and worktree configuration templates. Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Added comprehensive security infrastructure to prevent tokens from being committed to git: - Updated .gitignore to protect .claude/settings.local.json - Removed GITHUB_TOKEN from settings.json (now uses local file) - Created settings.local.json.example as template - Added SECRETS_MANAGEMENT.md with complete security guide - Updated CLAUDE.md with security best practices The token is now stored in .claude/settings.local.json which is gitignored and will never be committed. This follows the pattern of committed templates + gitignored user-specific secrets. See .claude/SECRETS_MANAGEMENT.md for setup instructions. Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Enabled GitHub MCP server to provide native GitHub API access for automated issue creation and management. Changes: - Set github server "disabled": false in .mcp.json - Updated notes to explain restart requirement - Created MCP_SETUP_STATUS.md documenting: - Current state (enabled, pending restart) - Verification steps after restart - Fallback to gh CLI if MCP unavailable - Troubleshooting guide The server requires Claude Code restart to become active. Until then, skills automatically fall back to using gh CLI. Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Updated /create-modernization-issue skill with: - Automatic GitHub integration detection (MCP vs CLI) - Duplicate issue checking before creation - Smart issue sizing (break large issues into smaller ones) - Detailed implementation documentation - Automatic fallback to gh CLI when MCP unavailable The skill now: 1. Searches for existing issues to avoid duplicates 2. Assesses scope (small/medium/large) 3. Breaks large issues (>8h, >50 files) into focused sub-issues 4. Uses GitHub MCP tools when available, gh CLI as fallback 5. Creates properly formatted issues with labels and milestones Example: "Fix 127 nullable errors" → 4 focused issues (#2-#5) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Updated workspace settings for better development experience. Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
* fix(parser): add nullable annotations to base parser classes Added nullable reference type annotations to foundation parser classes as part of Issue #2 (Fix nullable violations in parsers). Changes: - StatementParser.cs: Made Parse() return IStatement? (nullable) - StatementParser.cs: Added nullable annotations to 6 protected methods - PrintStatementParser.cs: Updated Parse() and helper methods to return nullable types This establishes the pattern for all statement parsers to follow. Parsers can now properly return null when they cannot parse a statement, without triggering CS8603 compiler errors. Remaining work: Apply same pattern to ~15 remaining statement parsers and expression parsers. Related to #2 Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com> * fix(parser): add nullable annotations to simple statement parsers Fixed nullable return types in 5 simple statement parsers that only return null when they cannot parse their specific keyword. Changes: - ReturnStatementParser: Parse() returns IStatement? - EndStatementParser: Parse() returns IStatement? - RestoreStatementParser: Parse() returns IStatement? - StopStatementParser: Parse() returns IStatement? - RemarkStatementParser: Parse() returns IStatement? All parsers follow the pattern: check for keyword, return null if not found, otherwise return statement instance. Progress: 7/40 files complete (18%) Related to #2 Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com> * fix(parser): add nullable checks in variable assignment parsers Fixed nullable reference errors in parsers that handle variable assignments and input by adding explicit null checks before adding variables to lists or passing to constructors. Changes: - LetStatementParser: Added null check for valueExpr before creating LetStatement - ReadStatementParser: Check firstVar for null, skip null variables in list - InputStatementParser: Check firstVar for null, skip null variables in list These parsers now properly handle the nullable return types from ParseVariableExpression() and Parse*Expression() methods. Progress: 10/40 files complete (25%) Related to #2 Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com> * fix(parser): add nullable return types to control flow parsers Updated Parse() method signatures in remaining control flow parsers to return nullable IStatement?. Changes: - DataStatementParser: Parse() returns IStatement? - GotoStatementParser: Parse() returns IStatement? - GosubStatementParser: Parse() returns IStatement? - IfThenStatementParser: Parse() returns IStatement? - NextStatementParser: Parse() returns IStatement? Some of these parsers still need null checks before passing parameters to constructors (will be addressed in next commit). Also added WORK_IN_PROGRESS.md with complete roadmap for Issue #2. Progress: 15/40 files complete (38%) Related to #2 Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com> * fix(parser): add null checks to control flow parser constructors Completed nullable fixes for all statement parsers by adding explicit null checks before passing parameters to statement constructors. Changes: - ForStatementParser: Added null checks for loopVar, from, to, step - GotoStatementParser: Added null check for lineNumberExpr - GosubStatementParser: Added null check for lineNumberExpr - NextStatementParser: Added null check for loopVar - OnGotoStatementParser: Added null check for value expression All statement parsers now properly handle nullable return types from parsing methods and throw SyntaxException when required parameters are missing instead of passing null to constructors. Result: 0 nullable errors in statement parsers! Progress: 20/40 files complete (50% - milestone reached!) Related to #2 Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com> * docs: update progress to 50% milestone * fix(parser): add nullable annotations to expression parsers Updated expression parser base class and expression parsers to return nullable IExpression? types, allowing them to properly return null when parsing fails. Changes: - ExpressionParser: Parse() returns IExpression?, ParseBooleanOperator() returns Token? - NumericExpressionParser: All Parse* methods return IExpression? - StringExpressionParser: All Parse* methods return IExpression? - PrintStatementParser: Added null check for TAB function parameter These parsers still have some CS8604 errors where null values are passed to expression constructors. This is acceptable as the expression classes are part of Issue #3 (expressions), not Issue #2 (parsers). Progress: 23/40 files parser-related (58%) Related to #2 Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com> * fix(parser): add null checks to expression parser internals Fixed nullable reference type violations in NumericExpressionParser and StringExpressionParser by adding proper null checks before constructing binary comparison expressions. Changes: - NumericExpressionParser.ParseBoolean(): Added null check for right operand - NumericExpressionParser.ParseUnary(): Added null check before NegationExpression - NumericExpressionParser: Made ParseVariable, ParseLiteral, ParseFunction return nullable - StringExpressionParser.Parse(): Added null check for right operand - StringExpressionParser: Made ParseVariable, ParseLiteral, ParseFunction return nullable All parser files now have 0 CS86xx errors. Remaining 92 nullable errors are in non-parser expression and statement implementation classes. Related to #2 Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com> --------- Co-authored-by: Trey Tomes <george.tomes@cityelectricsupply.com> Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
Fixed all CS86xx nullable errors in expression classes by: - Adding null-forgiving operator (!) to comparison expressions where IComparable casts are guaranteed non-null at runtime - Making optional IBasicConfiguration parameters nullable in CommaExpression and TabExpression constructors Changes: - GreaterThanExpression: Added ! to IComparable cast (line 16) - GreaterThanOrEqualExpression: Added ! to IComparable cast (line 16) - LessThanExpression: Added ! to IComparable cast (line 16) - LessThanOrEqualExpression: Added ! to IComparable cast (line 16) - CommaExpression: config parameter now IBasicConfiguration? (line 12) - TabExpression: config parameter now IBasicConfiguration? (line 12) All 6 expression class nullable errors resolved (0 remaining). Co-authored-by: Trey Tomes <george.tomes@cityelectricsupply.com> Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
Fixed CS8625, CS8604, CS8602, and CS8600 errors in statement implementation classes by: - Making optional parameters nullable (IBasicConfiguration?, IEnumerable?) - Adding null-coalescing operators for Convert.ToString() calls - Adding null-forgiving operators for guaranteed non-null casts Files fixed: - PrintStatement.cs (3 errors) - LetStatement.cs (1 error) - ReturnStatement.cs (1 error) - ForStatement.cs (1 error) - GotoStatement.cs (1 error) - ReadStatement.cs (1 error) Errors eliminated: 9 nullable errors Remaining: 62 nullable errors (down from 80) Relates to #4 Co-authored-by: Trey Tomes <george.tomes@cityelectricsupply.com> Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
* fix(core): resolve nullable violations in token readers and exceptions Fixed CS8625, CS8603, CS8602, and CS8618 errors in token reading infrastructure: CharacterReader.cs: - Made config parameter nullable (IBasicConfiguration? config = null) SimpleTokenReader.cs: - Changed Next() return type to Token? (can return null at EOF) ComplexTokenReader.cs: - Changed Next() return types to Token? - Made pattern parameter nullable (string? pattern = null) - Made powerToken variable nullable (Token? powerToken = null) UnexpectedTokenException.cs: - Made actual parameter nullable (Token? actual) - Added null-forgiving operator for ActualToken assignment - Added null-conditional operators in base() message Errors eliminated: 10 nullable errors Remaining: 52 nullable errors (down from 62) Relates to #5 Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com> * fix(core): resolve nullable violations in Interpreter, EnvironmentBase, and Program Fixed nullable reference type errors in core infrastructure files: EnvironmentBase.cs: - Made constructor parameters Interpreter and IBasicConfiguration nullable - Changed PopCallStack() return type to ICallStackContext? (matches interface) Interpreter.cs: - Made IBasicConfiguration parameter nullable in constructor and static factory methods - Initialized _reader field with null-forgiving operator (set by InterpretProgram methods) - Changed ProcessBlock/ProcessLine/ProcessForLine/ProcessNextLine parent parameter to ProgramLine? - Changed ProcessSpace() return type to Token? - Changed ProcessStatement() return type to IStatement? - Added null-forgiving operators for safe casts in ValidateNotUsingPreviousControlVariable - Removed unnecessary null-forgiving operators where ProgramLine constructor now accepts nulls Program.cs: - Changed indexer return type to ProgramLine? - Changed GetDataLine() return type to DataStatement? - Changed MoveToNextLine() return type to ProgramLine? - Added null-forgiving operators for guaranteed non-null line access during execution IEnvironment.cs: - Updated PopCallStack() return type to ICallStackContext? to match implementation ProgramLine.cs: - Made constructor parameters IStatement? and ProgramLine? nullable - Changed Statement and Parent properties to nullable types - Updated ToListing() to use null-conditional operator for Statement Errors eliminated: 15 nullable errors in these core files Remaining: 28 CS nullable errors (in other files), 240 IDE style errors (codebase-wide) Relates to #5 Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com> * fix(core): resolve final nullable violations in remaining files Fixed CS8602, CS8603, CS8604, and CS8620 errors in ComplexTokenReader, parsers, and statements: ComplexTokenReader.cs: - Added null check when adding tokens from SimpleTokenReader - Made Read(), Peek(), and ReadRestOfString() return Token? - Added null-conditional operators for token property access RemarkStatementParser.cs: - Added null-conditional operator for Peek() result - Added null-forgiving operator for Next() result (guaranteed non-null in loop) DataStatementParser.cs: - Added null check before creating composite token with reader.Next() GotoStatement.cs: - Made ValidateSharedAncestry src parameter nullable (ProgramLine? src) - Added null check before calling ValidateSharedAncestry with newLine Errors eliminated: 18 nullable errors Result: 0 CS86xx errors remaining! ✅ Relates to #5 Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com> --------- Co-authored-by: Trey Tomes <george.tomes@cityelectricsupply.com> Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
Updated XML parameter tags to match actual method signatures in CharacterReader and Interpreter after nullable modernization changes. Fixes CS1572 and CS1573 warnings Relates to #5 Co-authored-by: Trey Tomes <george.tomes@cityelectricsupply.com> Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
Added braces to empty while loop that scans for NEXT statement per IDE0011 code style rule. Added clarifying comment inside braces to make the intentional empty loop body explicit. Errors eliminated: 2 IDE0011 errors Remaining: 238 style errors Closes #14 Co-authored-by: Trey Tomes <george.tomes@cityelectricsupply.com> Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
Replaced explicit type declarations with 'var' keyword per IDE0007 code style rule and project .editorconfig settings. Changes: - ComplexTokenReader.cs: int value → var value - PrintStatement.cs: string? text → var text - CharacterReader.cs: out int lineNumber → out var lineNumber Type is still apparent from right-hand side (int.Parse, switch expression, TryParse pattern). Errors eliminated: 6 IDE0007 errors Remaining: 232 style errors Closes #13 Co-authored-by: Trey Tomes <george.tomes@cityelectricsupply.com> Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
* style: add public modifiers to interface members (IDE0040) Interface members now have explicit 'public' accessibility modifiers as required by IDE0040 code style rule. This improves code clarity by making accessibility explicit rather than implicit. Files modified: - IEnvironment.cs: 14 member declarations - IErrorReporter.cs: 1 method declaration - IExpression.cs: 2 property declarations - IListable.cs: 1 method declaration - IPrintItem.cs: 1 method declaration Errors eliminated: 36 IDE0040 errors (46 → 10) Remaining: 10 IDE0040 errors (exception and internal classes) Relates to #12 Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com> * style: add internal modifiers to classes and fix interface member (IDE0040) Added explicit 'internal' accessibility modifiers to exception classes and internal implementation classes. Also fixed one missed interface member that needed 'public' modifier. Files modified: - NoEndInstructionException.cs: internal exception class - ProgramEndException.cs: internal exception class - StringExpression.cs: internal implementation class - GosubStatement.cs: internal implementation class - IEnvironment.cs: one missed interface member (PopCallStack) Errors eliminated: 10 IDE0040 errors (10 → 0) Remaining: 93 style errors (all other types) Closes #12 Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com> --------- Co-authored-by: Trey Tomes <george.tomes@cityelectricsupply.com> Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
Converted all 124 C# files from block-scoped to file-scoped namespace syntax, modernizing to C# 10 standard. This eliminates all IDE0161 code style errors across the solution. Changes: - Converted namespace declarations from block style to file-scoped - Reduced indentation by one level in all files - Preserved UTF-8 BOM where present - No functional changes - pure syntax modernization Files converted: - ECMABasic.Core: 95 files (core, config, exceptions, expressions, parsers, statements) - ECMABasic55: 18 files (runtime, parsers, statements) - ECMABasic.Test: 11 files (test classes and environment) IDE0161 errors eliminated: 93 Remaining errors: 69 (pre-existing nullable reference type warnings) Closes #11 Co-authored-by: Trey Tomes <george.tomes@cityelectricsupply.com> Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
* fix(runtime): resolve nullable violations in ECMABasic55 parsers Updated all 7 immediate-mode statement parsers to handle nullable types: - Return type changed to IStatement? to match base class - Added null checks before constructing statements - Added ExceptionFactory.Syntax() for invalid inputs - Made optional config parameters explicitly nullable Fixed parsers: - ContinueStatementParser: Return type annotation - ListStatementParser: Config parameter, pattern matching for type casts - LoadStatementParser: Null check for filename expression - NewStatementParser: Return type annotation - RunStatementParser: Return type annotation - SaveStatementParser: Null check for filename expression - SleepStatementParser: Null check for milliseconds expression Errors eliminated: 54 nullable errors in parsers Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com> * fix(runtime): resolve nullable violations in ECMABasic55 statements and infrastructure Updated statement classes and infrastructure to handle nullable types: Statements: - ContinueStatement: Added null check for env.Program[lineNumber] - ListStatement: Made From/To properties nullable, added line null check - RunStatement: Made LineNumber property nullable - SaveStatement: Added null/empty check for path before File.WriteAllText Infrastructure: - RuntimeInterpreter: Made config parameter nullable, ProcessImmediate returns IStatement? - ConsoleEnvironment: Made constructor parameters nullable, ReadLine returns empty string for null - Program: Added null coalescing for Convert.ToString results and Console.ReadLine Fixed 8 nullable dereference errors in custom function definitions (ASC, MID$, POS) by using null-forgiving operator and null coalescing to provide safe defaults. Errors eliminated: 28 nullable errors in statements and infrastructure Total errors resolved in ECMABasic55: 82 Remaining errors: 52 (ECMABasic.Test only) Closes #19 Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com> --------- Co-authored-by: Trey Tomes <george.tomes@cityelectricsupply.com> Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
Fixed nullable reference type violations in: - TestEnvironment.cs: Changed ReadLine to return string.Empty instead of null (matches ConsoleEnvironment pattern) - TokenizerTests.cs: Added Assert.NotNull guards before token property access (26 CS8602 errors) - InterpreterTests.cs: Added Assert.NotNull for safe downcasting (1 CS8602 error) Errors eliminated: 27 nullable errors Remaining: 0 nullable errors All 61 tests passing Co-authored-by: Trey Tomes <george.tomes@cityelectricsupply.com> Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
Phase 1-2 of Clean Architecture refactoring for #24: Phase 1: Configure New Projects - Updated ECMABasic.Domain.csproj to inherit from Directory.Build.props - Updated ECMABasic.Infrastructure.csproj to inherit from Directory.Build.props - Both projects now enforce nullable reference types and warnings as errors Phase 2: Move Domain Types to ECMABasic.Domain Moved 46 files from ECMABasic.Core to ECMABasic.Domain: - 21 expression classes (AdditionExpression, BinaryExpression, etc.) - 8 exception classes (SyntaxException, RuntimeException, etc.) - 3 configuration files (IBasicConfiguration, MinimalBasicConfiguration) - 11 core interfaces and types (IExpression, IStatement, Token, TokenType, etc.) - 3 supporting interfaces (IEnvironment, IErrorReporter, ICallStackContext) All files updated with namespace ECMABasic.Domain. Note: Domain temporarily references Core for IEnvironment dependencies (Interpreter, Program). This will be resolved in Phase 3 through dependency inversion - Domain will define abstractions, Application will implement. Files remain in ECMABasic.Core for backwards compatibility during transition. Relates to #24 Co-authored-by: Trey Tomes <george.tomes@cityelectricsupply.com> Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
Implements Clean Architecture Option C - pure domain with inverted dependencies. Changes: - Created pure IEnvironment interface in Domain (no Interpreter/Program refs) - Created IBasicConfiguration interface in Domain - Removed MinimalBasicConfiguration from Domain (stays in Core) - Made CommaExpression and TabExpression require IBasicConfiguration (no default) - Domain project now has ZERO dependencies - All projects reference Domain layer Domain is now architecturally pure - only interfaces and value objects, no framework dependencies or implementations. Related to #24 Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Removed duplicate IEnvironment interfaces - now only one in Domain. Added navigation methods and Configuration property to Domain.IEnvironment to make it self-contained without referencing Application-layer types. Changes: - Removed Core.IEnvironment (duplicate) - Added Configuration, GetNextLineNumber, MoveToNextLine, GetStatementAtLine to Domain.IEnvironment - Updated EnvironmentBase to implement new methods - CommaExpression and TabExpression now get config from env at runtime - Made StringExpression public for parser access - Removed duplicate expressions and domain types from Core Still in progress: updating statements to use new navigation methods Related to #24 Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Fixed remaining references to use Domain.IEnvironment navigation methods. All Application-layer code now uses single Domain.IEnvironment interface. Changes: - Added ForStackContext and GosubStackContext to Domain - Replaced env.Program.X with env.X() navigation methods - Cast to EnvironmentBase where Application-layer types (Program, Interpreter) needed - Added using ECMABasic.Domain to ECMABasic55 and Test projects - Fully qualified ExceptionFactory references to resolve ambiguity Build: ✅ 0 errors Tests: ✅ 61/61 passing Related to #24 Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Updated all namespace declarations and references from ECMABasic.Core to ECMABasic.Application to reflect Clean Architecture naming conventions. Note: Directory src/ECMABasic.Core still needs manual rename to src/ECMABasic.Application when files are not locked by IDE. Changes: - Updated all namespace declarations to ECMABasic.Application - Updated all using statements across all projects - Updated .csproj AssemblyName and RootNamespace Build: ✅ 0 errors Tests: ✅ 61/61 passing Related to #24 Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Completed the directory and project file rename from ECMABasic.Core to ECMABasic.Application. All project references updated. Changes: - Renamed directory src/ECMABasic.Core → src/ECMABasic.Application - Renamed ECMABasic.Core.csproj → ECMABasic.Application.csproj - Updated solution file project reference - Updated ECMABasic.Test project reference - Updated ECMABasic55 project reference Build: ✅ 0 errors Tests: ✅ 61/61 passing Closes #24 Phase 3 Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Merges Phase 3 of Clean Architecture refactoring into main modernization branch. Implements complete dependency inversion with pure Domain layer. Major changes: - Created pure Domain layer with zero dependencies - Inverted IEnvironment dependency to Domain - Renamed ECMABasic.Core → ECMABasic.Application - Added navigation methods to IEnvironment - All 61 tests passing, zero build errors Closes #24 Phase 3 Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Reorganizes solution structure following .NET conventions: - src/ contains production code - test/ contains test projects Changes: - Moved ECMABasic.Test from src/ to test/ - Updated solution file to reference ../test/ECMABasic.Test/ - Updated project references to use ../../src/ paths All 61 tests passing, zero build errors. Completes #24 Phase 6 Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Merges Phase 6 of Clean Architecture refactoring into main modernization branch. Completes solution structure reorganization. Major changes: - Test project moved from src/ to test/ - Solution file updated to reference test/ directory - Project references updated to use correct relative paths - All 61 tests passing, zero build errors Completes #24 Clean Architecture implementation Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Moves ECMABasic.sln from src/ to repository root following .NET conventions. Updates all convenience scripts to work with new solution location. Changes: - Solution file now at ./ECMABasic.sln (was ./src/ECMABasic.sln) - Updated project references to point to src/ and test/ - Updated build.sh/bat to use root solution - Updated test.sh/bat to use root solution - Updated run.sh/bat to reference src/ECMABasic55/ - Updated publish.sh/bat to reference src/ECMABasic55/ All scripts tested and working. All 61 tests passing. Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Merges solution file move from src/ to repository root. Completes final reorganization of project structure. Major changes: - Solution file at repository root (./ECMABasic.sln) - All convenience scripts updated - Project paths updated in solution - All scripts tested and working All 61 tests passing, zero build errors. Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Updates test scripts to remove old TestResults and coverage-report directories before running tests. This prevents warnings about non-existent files from old coverage data after the Core→Application rename. Fixes warnings like: "File 'ECMABasic.Core\*.cs' does not exist (any more)" Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Updates all documentation files to reflect the Core→Application rename completed in Phase 3 of the Clean Architecture refactoring. Files updated: - TODO.md, WORK_IN_PROGRESS.md, CLAUDE.md - docs/*.md (all documentation) - .claude/rules/modernization.md - .claude/audits/build-audit-2026-06-23.md - .claude/skills/*/SKILL.md (all skills) - .claude/skills/*/templates/*.md (all templates) Zero references to ECMABasic.Core remain in the codebase. Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Updates all documentation to reflect completed Clean Architecture refactoring: .claude folder updates: - Update solution path from src/ECMABasic.sln to ECMABasic.sln - Update test project path from src/ECMABasic.Test to test/ECMABasic.Test - Fix paths in skills, rules, settings, and audits docs folder updates: - Update FINAL_SETUP_STATUS.md structure diagram - Add Domain, Application, Infrastructure layers - Show test/ directory separate from src/ - Add ECMABasic.sln at root - Update CLAUDE_SETUP_GUIDE.md paths All documentation now accurately reflects: - Solution file at repository root - Clean Architecture layers in src/ - Test project in test/ - Proper dependency flow Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Prevents generated HTML coverage reports from being committed. Reports are regenerated on every test run and shouldn't be tracked. Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Removed duplicate ExceptionFactory and exception classes from Application. All exceptions now reside in Domain layer as per Clean Architecture: - Domain defines exceptions (no dependencies) - Application/Infrastructure/Presentation use them Changes: - Deleted src/ECMABasic.Application/Exceptions/ (entire folder) - Updated all using statements: Application.Exceptions → Domain.Exceptions - Updated all ExceptionFactory references: Application.ExceptionFactory → Domain.ExceptionFactory - Made all Domain exceptions public (were internal) - Fixed qualified exception references (new Exceptions.X → new X) Pure refactoring - no behavior change. All 61 tests passing. Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Replaced JSON configuration with YAML for improved readability. Changes: - Added YamlDotNet 18.0.0 package dependency - Created appsettings.yaml with all existing settings - Updated RuntimeConfiguration to load from YAML using YamlDotNet - Fixed file path resolution to use AppContext.BaseDirectory - Updated .csproj to copy YAML file instead of JSON - Removed appsettings.json Benefits: - More human-readable format (no quotes/braces) - Supports multi-line strings with | syntax - Inline comments for documentation - Industry standard for configuration files All 61 tests passing. No functional changes to application behavior. Closes #23 Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Changed DEFAULT_PREAMBLE to _defaultPreamble to comply with .editorconfig rule requiring _camelCase for all private fields, including constants. Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Updated .editorconfig to properly distinguish between const fields and regular private fields: - Constants now use SCREAMING_SNAKE_CASE (all_upper with _ separator) - Regular private fields continue using _camelCase Changed DEFAULT_PREAMBLE back to proper constant naming convention. Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
…sting Added Microsoft.Extensions packages to enable modern .NET patterns: - Microsoft.Extensions.Configuration (10.0.9) - Microsoft.Extensions.Configuration.Binder (10.0.9) - Microsoft.Extensions.DependencyInjection (10.0.9) - Microsoft.Extensions.Hosting (10.0.9) - Microsoft.Extensions.Logging (10.0.9) - Microsoft.Extensions.Logging.Console (10.0.9) - Microsoft.Extensions.Options (10.0.9) - Microsoft.Extensions.Options.ConfigurationExtensions (10.0.9) Note: Hosting package automatically included Configuration.Json, but we will continue using YAML (appsettings.yaml) via YamlDotNet. Foundation for: - Dependency injection container - IHost pattern - Structured logging with ILogger<T> - Type-safe configuration binding - Standard .NET Core application patterns All 61 tests passing. No breaking changes. Closes #26 Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Replaced manual argument parsing with System.CommandLine: - Added System.CommandLine package (2.0.0-beta4.22272.1) - Refactored Main to async Task<int> for CommandLine compatibility - Added BuildCommandLine() method with RootCommand - File argument: positional argument for batch execution - --config option: path to config file (default: appsettings.yaml) - --debug option: enable debug logging (prepared for future use) Features: ✅ Automatic --help generation ✅ --version support built-in ✅ Type-safe command-line options ✅ Backward compatible: "ecmabasic55 file.BAS" still works ✅ Modern CLI: "ecmabasic55 --help" shows usage Changes: - Main now async Task<int> (required by System.CommandLine) - SetHandler uses Environment.Exit for return code - Added using System.CommandLine and System.Threading.Tasks - Config and debug parameters ready for Issue #28 (DI) All 61 tests passing. Help output verified. Closes #27 Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Modernizes Program.cs to use Microsoft.Extensions.Hosting with full dependency injection support following iron_kernel pattern. Key changes: - IHost builder with ConfigureAppConfiguration, ConfigureLogging, ConfigureServices - Dependency injection for IEnvironment, Interpreter, RuntimeConfiguration - Custom YAML configuration provider (YamlConfigurationExtensions) - RuntimeConfiguration refactored to support IOptions<T> binding - CommandLineProps extracted to separate file (one-type-per-file rule) - --config and --debug command-line options integrated with DI Services registered: - RuntimeConfiguration via IOptions<T> - MinimalBasicConfiguration singleton - RuntimeInterpreter as Interpreter - ConsoleEnvironment as IEnvironment (with intrinsics injection) Benefits: - Testable via mock dependencies - Type-safe configuration binding from YAML - Automatic service lifetime management - Extensible service registration pattern - Follows .NET hosting best practices All 61 tests pass. Zero warnings. Closes #28 Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Implements daily rotating file logger with structured logging
following iron_kernel FileLoggerProvider pattern.
Key changes:
- FileLoggerProvider with ILogger interface implementation
- Daily log rotation: ecmabasic-{yyyy-MM-dd}.log
- Thread-safe writes with lock synchronization
- UTC timestamps with millisecond precision
- AutoFlush enabled for immediate persistence
- Configurable log levels (Information/Debug)
- Console logging in debug mode only
- File logging always active
Log format:
yyyy-MM-dd HH:mm:ss.fff [LEVEL] Category: Message
Features:
- Automatic logs/ directory creation
- --debug flag controls console + file log levels
- ILogger<T> ready for service injection
- No performance impact (buffered writes)
- Already excluded from git via [Ll]ogs/ pattern
ConfigureLogging implementation:
- ClearProviders for clean logging setup
- AddConsole only in debug mode
- SetMinimumLevel based on debug flag
- AddProvider(FileLoggerProvider) for file logging
All 61 tests pass. Log directory created successfully.
Closes #29
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Documents the coding standard requiring exactly one top-level type definition per source file. Rule applies to: - Classes, structs, records, enums, interfaces, delegates - File name must match type name - Nested types are allowed (exception) Benefits: - Improved discoverability (1:1 file-to-type mapping) - Easier navigation (Go to Definition goes to dedicated file) - Reduced merge conflicts - Clearer type boundaries - Better maintainability Examples: ✅ CommandLineProps.cs contains only CommandLineProps class ✅ Program.cs contains only Program class ❌ Models.cs containing multiple types (wrong) Enforcement: - Code review - Claude Code adherence - Consider automated analyzer if frequently violated Applied immediately: Extracted CommandLineProps from Program.cs to separate file in Issue #28 implementation. Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Introduces IIntrinsicRegistry and IRandomNumberGenerator interfaces to enable per-environment service isolation. Moves FunctionDefinition and FunctionExpression from Application to Domain layer to satisfy dependency requirements. - IIntrinsicRegistry: Environment-scoped function registry - IRandomNumberGenerator: ECMA-55 compliant RNG with fixed seed - Updated function delegate signature to include IEnvironment parameter Enables test isolation and ECMA-55 conformance (repeatable RND). Closes #30 #41 Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Implements dependency injection services for per-environment isolation: - IntrinsicRegistry: Replaces FunctionFactory singleton with instance - BasicRandomNumberGenerator: Fixed seed (42) for ECMA-55 repeatability - MinimalBasicConfiguration: Injectable with backward-compatible fallback - EnvironmentBase: Creates per-environment service instances - Interpreter: Thread-local CurrentParsingEnvironment for expression parsers - Expression parsers: Access intrinsics via environment Enables independent state per environment for test isolation and ECMA-55 conformance (repeatable RND sequences). Closes #41 #42 Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Updates ECMABasic55 to register and use new DI services: - Program.cs: Register IBasicConfiguration from IConfiguration - Program.cs: Update InjectIntrinsics to use new delegate signature - RuntimeInterpreter: Use environment-scoped services - FileLoggerProvider: Minor cleanup Completes DI integration for per-environment service isolation. Related to #41 #42 Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Documents dependency injection implementation and patterns: - docs/architecture/dependency-injection.md: Full architecture overview with dependency flow diagram, service lifetimes, registration patterns, and testing examples - .claude/examples/dependency-injection-examples.md: 20+ practical code examples for testing with custom configs, seeded RNG, and registering intrinsic functions - .claude/research/dependency-injection-expansion.md: Complete research analysis, cost-benefit evaluation, and migration decisions - CLAUDE.md: Updated with DI guidelines section Provides comprehensive guidance for future development and onboarding. Closes #43 Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Updates project tracking and adds ECMA-55 specification documents: - TODO.md: Mark Issues #30, #33, #41, #42, #43 as complete - .claude/audits/ecma55-gap-analysis-2026-06-24.md: Gap analysis identifying missing ECMA-55 features for v0.4 milestone - docs/specifications/: Complete ECMA-55 specification documents extracted from original standard Closes #33 Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Research documented in .claude/research/spectre-console-evaluation.md: - Comprehensive evaluation of Spectre.Console vs ANSI codes - Cost-benefit analysis (13-15 hours vs 2-4 hours) - Recommendation: Defer in favor of external rich terminal project - Prototype implementation examples for future reference Updated TODO.md: - Mark Issue #32 research as complete - Mark ECMA-55 gap analysis as complete - Reference new research documentation Closes #32 Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Documents architectural analysis for Issue #30 refactor: - Singleton pattern problems identified - Per-environment registry benefits - Migration path from FunctionFactory to IntrinsicRegistry - Cost-benefit analysis and trade-offs Related to #30 Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Completes v0.3 modernization milestone with comprehensive dependency injection implementation, eliminating singleton pain points and enabling per-environment service isolation.
Changes
Domain Layer
IntrinsicsandRandompropertiesApplication Layer
Infrastructure Layer
Documentation
Issues Closed
Benefits Achieved
Test Isolation
ECMA-55 Conformance Enabled
Architecture Improvements
Testing
Migration Notes
For Users
For Contributors
env.Intrinsicsinstead ofFunctionFactory.Instanceenv.Randominstead ofRandomFactory.InstanceIBasicConfigurationinstead of usingMinimalBasicConfiguration.Instancedocs/architecture/dependency-injection.mdfor patternsBuild Status
Documentation
docs/architecture/dependency-injection.md.claude/examples/dependency-injection-examples.md.claude/research/dependency-injection-expansion.mdCLAUDE.md(DI section)Commits
Total: 7 commits, 23 files changed
Next Steps
After merge:
feature/ecma55-conformancefrom mainReady for review and merge to main