# Codebase Structure **Analysis Date:** 2026-05-18 ## Directory Layout ``` nc_program_manager/ ├── NcProgramManager/ # Main application │ ├── Program.cs # CLI entry point, action dispatch │ ├── ArgParser.cs # CLI argument parser │ ├── InputArgs.cs # Parsed args config object │ ├── FanucProgram.cs # Fanuc composite NC file parser │ ├── fwlib32.cs # Fanuc FOCAS1 P/Invoke wrapper (auto-gen, 11K lines) │ ├── NcProgramManager.csproj # Project file (.NET 4.7.2, Console) │ ├── App.config # Runtime binding redirects │ ├── packages.config # NuGet dependencies │ ├── Licensing/ # License validation subsystem │ ├── Cnc/ # CNC abstraction + implementations │ │ ├── ICncMachine.cs │ │ ├── IFanucMachine.cs │ │ ├── INcProgramValidator.cs │ │ ├── NcProgramValidator.cs │ │ ├── CncMachineFactory.cs │ │ ├── Models/ # DTOs and value objects │ │ ├── Fanuc/ # FOCAS protocol │ │ │ └── libs/ # Native DLLs (embedded) │ │ ├── Heidenhain/ # LSV2 protocol │ │ ├── Siemens/ # FTP protocol │ │ └── Mitsubishi/ # FTP protocol │ └── Properties/ │ └── AssemblyInfo.cs ├── NcProgramManager.Tests/ # Test suite │ ├── Unit/ # Isolated unit tests │ ├── Integration/ # Protocol integration tests │ │ └── Stubs/ # In-process server stubs │ ├── NcProgramManager.Tests.csproj │ ├── packages.config │ └── nunit.runsettings ├── NcProgramManager.sln # Solution file ├── Dockerfile.test # Containerized test runner └── README.md # Italian operator docs ``` ## Directory Purposes **`Licensing/`:** - Purpose: RSA-based offline license validation - Key files: `LicenseValidator.cs`, `MachineFingerprint.cs`, `LicenseFile.cs`, `ILicenseValidator.cs`, `IMachineFingerprint.cs` **`Cnc/Models/`:** - Purpose: Shared DTOs and value objects for CNC layer - Key files: `CncResult.cs`, `CncError.cs`, `CncManufacturer.cs`, `CncProgram.cs`, `ConnectionState.cs`, `ValidationError.cs`, `ValidationResult.cs`, `ValidationSeverity.cs`, `MachineSnapshot.cs`, `MachineMode.cs`, `MotionState.cs`, `RunState.cs` **`Cnc/Fanuc/`:** - Purpose: Fanuc FOCAS protocol implementation - Key files: `FanucMachine.cs` (main), `FanucConnectionConfig.cs`, `IFocasDialect.cs`, `LegacyFocasDialect.cs`, `ModernFocasDialect.cs`, `FocasDialectFactory.cs`, `FanucDialectDetector.cs`, `FanucErrorTranslator.cs`, `IsoProgramFormatter.cs`, `FanucCapabilities.cs`, `FanucTransport.cs` **`Cnc/Heidenhain/`:** - Purpose: Heidenhain LSV2 protocol implementation - Key files: `HeidenhainMachine.cs`, `Lsv2Client.cs`, `ILsv2Client.cs`, `HeidenhainConnectionConfig.cs` **`Cnc/Siemens/`:** - Purpose: Siemens FTP protocol implementation - Key files: `SiemensMachine.cs`, `SiemensFtpClient.cs`, `ISiemensFtpClient.cs`, `SiemensConnectionConfig.cs` **`Cnc/Mitsubishi/`:** - Purpose: Mitsubishi FTP protocol implementation - Key files: `MitsubishiMachine.cs`, `MitsubishiFtpClient.cs`, `IMitsubishiFtpClient.cs`, `MitsubishiConnectionConfig.cs` **`NcProgramManager.Tests/Unit/`:** - Purpose: Isolated unit tests with mocks - Key files: `NcProgramValidatorTests.cs`, `FanucMachineTests.cs`, `FanucProgramParsingTests.cs`, `IsoProgramFormatterTests.cs`, `CncMachineFactoryTests.cs`, `LicenseValidatorTests.cs`, `SiemensMachineTests.cs`, `MitsubishiMachineTests.cs`, `HeidenhainMachineTests.cs` **`NcProgramManager.Tests/Integration/`:** - Purpose: Protocol-level tests using in-process stubs - Key files: `HeidenhainMachineIntegrationTests.cs`, `SiemensMachineIntegrationTests.cs`, `MitsubishiMachineIntegrationTests.cs` **`NcProgramManager.Tests/Integration/Stubs/`:** - Purpose: In-process server stubs for protocol testing - Key files: `FtpServerStub.cs` (FTP server with in-memory file store), `Lsv2ServerStub.cs` (LSV2 TCP server) ## Key File Locations **Entry Points:** - `Program.cs` — Main(), CLI orchestration, exit codes - `ArgParser.cs` — static `Parse(string[]) → InputArgs` **Configuration:** - `NcProgramManager.csproj` — Project metadata, NuGet refs, build config - `App.config` — Binding redirects only - `packages.config` — NuGet dependency list **Core Logic:** - `Cnc/ICncMachine.cs` — Primary abstraction interface - `Cnc/CncMachineFactory.cs` — Manufacturer dispatch - `Cnc/Models/CncResult.cs` — Result wrapper pattern - `Cnc/Fanuc/FanucMachine.cs` — Largest impl (~740 lines) - `Licensing/LicenseValidator.cs` — License check entry **Testing:** - `NcProgramManager.Tests/Unit/NcProgramValidatorTests.cs` — Most comprehensive unit tests - `NcProgramManager.Tests/Integration/Stubs/FtpServerStub.cs` — Reusable FTP stub **Documentation:** - `README.md` — Italian operator-facing docs (CLI args, license setup, error codes) ## Naming Conventions **Files:** - PascalCase for all `.cs` files: `FanucMachine.cs`, `CncResult.cs` - Interfaces prefixed with I: `ICncMachine.cs`, `IFocasDialect.cs` - Config classes: `{Manufacturer}ConnectionConfig.cs` - Test files: `{Subject}Tests.cs` or `{Subject}IntegrationTests.cs` **Directories:** - PascalCase for manufacturer dirs: `Fanuc/`, `Heidenhain/`, `Siemens/`, `Mitsubishi/` - Lowercase for support: `libs/` ## Where to Add New Code **New CNC manufacturer:** - Implementation: `Cnc/{Manufacturer}/{Manufacturer}Machine.cs` (implement `ICncMachine`) - Config: `Cnc/{Manufacturer}/{Manufacturer}ConnectionConfig.cs` - Client: `Cnc/{Manufacturer}/I{Manufacturer}FtpClient.cs` + `{Manufacturer}FtpClient.cs` (if FTP) - Wire: Add case to `Cnc/CncMachineFactory.cs` - Enum: Add value to `Cnc/Models/CncManufacturer.cs` - Args: Update `ArgParser.cs` if new transport args needed **New Fanuc FOCAS feature:** - Add to `Cnc/Fanuc/IFocasDialect.cs`, implement in `LegacyFocasDialect.cs` + `ModernFocasDialect.cs` - Surface in `Cnc/Fanuc/FanucMachine.cs` - If Fanuc-specific CLI exposure: update `IFanucMachine.cs`, `Program.cs` **New validation rule:** - Add to `Cnc/NcProgramValidator.cs` - Add test to `NcProgramManager.Tests/Unit/NcProgramValidatorTests.cs` **New CLI arg:** - Add to `ArgParser.cs` regex parsing - Add field to `InputArgs.cs` - Update `README.md` params table ## Special Directories **`Cnc/Fanuc/libs/`:** - Purpose: Native Fanuc FOCAS DLLs - Source: Fanuc-provided proprietary binaries - Committed: Yes (required for build) - Embedded: Via Costura.Fody into output EXE **`.paul/`:** - Purpose: PAUL project planning state - Source: Generated/maintained by PAUL workflow - Committed: Yes --- *Structure analysis: 2026-05-18* *Update when directory structure changes*