- STACK.md - Technologies and dependencies (.NET 4.7.2, NuGet, Costura.Fody) - ARCHITECTURE.md - Layered CLI with ICncMachine factory pattern - STRUCTURE.md - Directory layout and where to add new code - CONVENTIONS.md - C# style, naming, result wrapper pattern - TESTING.md - NUnit 3 + Moq, stubs, ignored FOCAS tests - INTEGRATIONS.md - FOCAS, LSV2, FTP, RSA licensing - CONCERNS.md - Blocking async, silent catch, no logging, Windows-only Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
7 KiB
7 KiB
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 codesArgParser.cs— staticParse(string[]) → InputArgs
Configuration:
NcProgramManager.csproj— Project metadata, NuGet refs, build configApp.config— Binding redirects onlypackages.config— NuGet dependency list
Core Logic:
Cnc/ICncMachine.cs— Primary abstraction interfaceCnc/CncMachineFactory.cs— Manufacturer dispatchCnc/Models/CncResult.cs— Result wrapper patternCnc/Fanuc/FanucMachine.cs— Largest impl (~740 lines)Licensing/LicenseValidator.cs— License check entry
Testing:
NcProgramManager.Tests/Unit/NcProgramValidatorTests.cs— Most comprehensive unit testsNcProgramManager.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
.csfiles:FanucMachine.cs,CncResult.cs - Interfaces prefixed with I:
ICncMachine.cs,IFocasDialect.cs - Config classes:
{Manufacturer}ConnectionConfig.cs - Test files:
{Subject}Tests.csor{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(implementICncMachine) - 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.csif new transport args needed
New Fanuc FOCAS feature:
- Add to
Cnc/Fanuc/IFocasDialect.cs, implement inLegacyFocasDialect.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.csregex parsing - Add field to
InputArgs.cs - Update
README.mdparams 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