win-setup/
├── setup.ps1 # Main entry point
├── validate.ps1 # Validation utility
├── README.md # Main documentation
│
├── src/ # Source code
│ ├── core/ # Core installation logic
│ │ ├── Installation.ps1 # Install-Program, Invoke-SystemConfig
│ │ └── Configuration.ps1 # (Reserved) System configuration
│ │
│ ├── utils/ # Utility functions
│ │ ├── Logging.ps1 # Write-Log, Write-GroupHeader
│ │ ├── Validation.ps1 # Test-ProgramInstalled, Get-InstallationStatus, Show-InstallationReport
│ │ ├── Registry.ps1 # Set-RegistryValue, Remove-RegistryValue
│ │ └── System.ps1 # Test-IsElevated, Request-Elevation
│ │
│ └── modules/ # Installation groups (PowerShell Modules)
│ ├── base.psm1 # Essential programs & configuration
│ ├── dev.psm1 # Development tools & configuration
│ └── gaming.psm1 # Gaming programs & configuration
│
├── docs/ # Documentation
│ ├── ARCHITECTURE.md # This file
│ ├── EXAMPLES.md # Configuration examples
│ └── VALIDATION.md # Validation guide
│
├── tools/ # Utility scripts
│ └── (Reserved for future tools)
│
├── config/ # Configuration files
│ └── (Reserved for future config)
│
└── tests/ # Test scripts
└── (Reserved for future tests)
- Orchestrates the entire setup process
- Handles command-line arguments (-Group, -SkipElevation)
- Loads and executes installation modules
- Manages elevation/UAC prompts
Core business logic for installation and configuration
- Installation.ps1
Install-Program()- Main installation function (Winget + fallback)Install-FromUrl()- Custom installer download and executionInvoke-SystemConfig()- Apply system configurations with error handling
Reusable utilities and helpers
-
Logging.ps1 - Output formatting
Write-Log()- Timestamped colored log messagesWrite-GroupHeader()- Format group section headers
-
Validation.ps1 - Installation detection
Test-ProgramInstalled()- Quick boolean check (4 detection methods)Get-InstallationStatus()- Detailed status with method infoShow-InstallationReport()- Visual report for multiple programs
-
System.ps1 - System operations
Test-IsElevated()- Check admin privilegesRequest-Elevation()- Request UAC elevation
-
Registry.ps1 - Windows registry operations
Set-RegistryValue()- Set registry entries (creates paths)Remove-RegistryValue()- Remove a value (fall back to Windows default)
Installation groups (PowerShell Modules)
Each group contains:
Install-{Group}Programs()- List and install programsSet-{Group}Configuration()- Apply group-specific configurations
Supported groups:
- base.psm1 - Always executed; essential programs
- dev.psm1 - Development tools and IDEs
- gaming.psm1 - Gaming programs and configs
User-facing documentation
- ARCHITECTURE.md - This file; explains project structure
- EXAMPLES.md - How to add programs and configurations
- VALIDATION.md - Comprehensive validation guide
When setup.ps1 executes with -Group base:
- Load Logging →
.\src\utils\Logging.ps1 - Load System Utils →
.\src\utils\System.ps1 - Load Validation →
.\src\utils\Validation.ps1 - Load Registry Utils →
.\src\utils\Registry.ps1 - Load Core Installation →
.\src\core\Installation.ps1 - Load Module →
.\src\modules\base.psm1 - Execute Functions
Install-BasePrograms()Set-BaseConfiguration()
setup.ps1
├─ Logging.ps1 (required first)
├─ System.ps1 (elevation, privileges)
├─ Validation.ps1 (check installations)
├─ Registry.ps1 (system config)
├─ Installation.ps1 (core logic)
│ └─ Validation.ps1 (detect already-installed)
│ └─ Registry.ps1 (apply config)
└─ modules/{group}.psm1 (installation groups)
├─ Installation.ps1 (Install-Program)
├─ Logging.ps1 (Write-GroupHeader, Write-Log)
└─ Registry.ps1 (Set-RegistryValue)
- Create
src/modules/mygroup.psm1 - Define
Install-MygroupPrograms() - Define
Set-MygroupConfiguration() - Update
setup.ps1to include in$groupsToRun
-
Add to appropriate file in
src/utils/- Logging? →
Logging.ps1 - System check? →
System.ps1 - Installation detection? →
Validation.ps1 - Registry? →
Registry.ps1
- Logging? →
-
Import in dependent files:
. "$libPath\utils\Logging.ps1"
-
Edit appropriate module in
src/modules/ -
Use
Invoke-SystemConfiginSet-{Group}Configuration():Invoke-SystemConfig "Enable Dark Mode" { Set-RegistryValue -Path "HKCU:\Software\..." -Name "..." -Value 0 -Type DWord }
- Single Responsibility - Each file has one clear purpose
- Modularity - Groups are independent; can be enabled/disabled
- Reusability - Utilities are shared across all modules
- Idempotency - Installation checks prevent redundant work
- Logging - All operations are logged with clear status
- Testability - Functions are small and independently verifiable
- Validation: ~1-2 seconds per program (4 detection methods)
- Installation: Depends on program size and internet speed
- Total: 5-10 minutes for ~50 programs (varies by system)
Optimize by:
- Providing executable name for faster detection
- Using Winget IDs when available
- Grouping related programs
- Configuration file format (YAML/JSON) for declarative setup
- Dry-run mode to preview changes
- Rollback functionality
- Installation parallelization
- Post-installation verification tests
- Integration with Chocolatey/Scoop
- Cloud sync for settings