# MaksIT.UScheduler Changelog All notable changes to this project will be documented in this file. In-app What's New reads [WHATSNEW.md](WHATSNEW.md). The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## [Unreleased] ## [1.6.0] - 2026-10-24 ### Added - **Launch** writes the script log the same way a scheduled run does, and opens a window that follows new lines until the run finishes. Lines are colored by the `Write-Log` level. The footer shows Running, then Finished. **Copy** puts the shown text on the clipboard. A second launch of the same script uses the window that is already open and follows from that new run. The scheduler's finished line stays in the file log and is not shown in the window. ### Changed - `SchedulerTemplate.psm1` is 1.0.3. `Write-Log` writes `[Level] message` to the output stream unless the host is an interactive console, so a launch from the window is recorded in the script log. An interactive console still prints a colored line with a timestamp. - The README lists each screen in one line. Screen notes are in `docs/features.md`. The Microsoft Store description and product features include Launch following the script log. - Synced RepoUtils. The release script accepts `-InstallOnly` (version plugin and Helm install only; no build or push). Npm plugins are no longer vendored. `CollectCoverage`, `ContainerEngineProbe`, and `DiscoverPackageArtifacts` are included. - The README shows every screen. A `microsoft-store` comment above an image is the Store listing order, the same marks as in `docs/features.md`. The screenshot tour also saves Launch, and log screenshots show a short excerpt. ### Fixed - The launch window status uses the body text color, so Running and Finished stay visible. ## [1.5.0] - 2026-10-10 ### Added - The **Processes** tab lists programs the service keeps running. Each row shows running, restarting, stopped, or waiting. Add, remove, and save the list. **Start**, **Stop**, and **Restart** ask the running service, so the program runs as the service account. Stop leaves it down until Start, or until the service itself starts again. - A configured console program starts with the service, runs beside the others, and stops when the service stops. With `RestartOnFailure` (the default), any exit starts it again. A run shorter than `ThrottleMs` waits before the next start, and longer if it keeps exiting immediately, so a crash loop does not spin. Standard output and error go to that program's log. The service writes `process-status.json` in the log directory for the window. - Process settings: `Name` (empty uses the executable file name), `Directory` (working directory; empty uses the executable's directory), `RestartDelayMs`, and `ThrottleMs` (default 1500). - The window remembers its size, position, and state in the per-user UI settings. - Settings shows the service name and status, plus the settings file, scripts folder, and log directory. **Open logs** opens that directory. Log views use **Open Folder**, and **Show in folder** when a file is selected. ### Changed - The schedule tab is named **Scripts**. Screenshot tours use the id `scripts`. - Windows setup **Options** sets the scripts and logs folders. They start at `C:\MaksIT\Scripts` and `C:\MaksIT\Logs`. A portable install still keeps those folders inside the install folder unless the paths are changed. - Standard and Portable on the setup page sit below the welcome text. - `RestartOnFailure` defaults to `true` and restarts after any exit. Set it to `false` to leave the program stopped. Existing settings that omit the property pick up the new default. - Settings no longer asks for a service folder. The service is this same program. A saved `ServiceBinPath` is dropped from the per-user UI settings. - About, Logs, What's New, and the error dialog use the shared desktop windows. - README and Microsoft Store text describe supervised programs. Screenshots live under `assets/screenshots/`. ## [1.4.0] - 2026-10-05 ### Added - After an upgrade, What's New lists additions since the version you last opened. - Help → Logs shows the program log and crash reports. Help → About shows the product, license, and contact. - A Microsoft Store MSIX is packed for Partner Center (`MAKS-IT.UScheduler`). It stays in `releases/` and is not a GitHub release asset. ### Changed - The desktop program is the scheduler. Windows and systemd start `MaksIT.UScheduler.UI` with `--service`; there is no separate worker executable. Re-register an existing service so it points at the UI program. - **Launch** asks the running service to start the script, so the window stays unelevated. That run ignores the schedule and the minimum interval. - Each page composes its own footer actions. The shell shows that list instead of keeping every button in the layout and hiding the ones that do not apply. - Service message boxes show the command output (install path, service state, and errors) instead of a bare OK. **Copy** puts that text on the clipboard. - Synced RepoUtils (Community desktop, including `MsixPack`). Coverage badges stay shields.io URLs in the README. The test engine does not write SVG files. ### Fixed - Service commands no longer fail after they finish when the output log is read back. OEM code page 850 is registered, and redirected command output is read as UTF-8. ## [1.3.0] - 2026-09-30 ### Added - Unhandled UI errors open a dialog with the exception details and a **Copy** button. The same text is saved under `%AppData%\MaksIT\UScheduler\logs`. ### Fixed - Windows setup keeps an existing desktop shortcut when the checkbox is off on reinstall, and removes a leftover duplicate (`UScheduler (2).lnk`) so a checked box does not leave two icons. ## [1.2.0] - 2026-09-21 ### Added - Windows setup exe offers **Standard** or **Portable** install. Portable keeps binaries, scripts, logs, and settings in the selected folder (`Scripts`, `Logs`, and `Data` subfolders). `--prepare-data --portable` does the same from the CLI; the portable zip includes a `portable` marker so unpacked copies stay self-contained. ### Changed - Relicensed the project from MIT to **Apache 2.0**. ### Fixed - Linux Flatpak GNOME app icon uses X11/XWayland (`UsePlatformDetect` only). Avalonia 12.1.2 native Wayland still hangs on GNOME `xdg_toplevel.configure(0, 0)`. App id is lowercase `com.maks_it.uscheduler`. Uninstall the old `com.maks_it.UScheduler` id before installing a new bundle. AppStream lives in `data/`. - Flatpak AppStream version is the same shared release version as zip and MSI (`DotNetReleaseVersion` from the UI csproj / `Directory.Build.props`), so `flatpak info` matches the bundle file name. ## [1.1.1] - 2026-09-06 ### Fixed - Windows setup exe now ships bundled Scripts next to the worker and runs `--prepare-data` after files are installed, so example scripts are copied to `C:\MaksIT\Scripts` when those folders do not already exist. ## [1.1.0] - 2026-09-06 ### Added - **Avalonia UScheduler UI** on Windows and Linux (replaces WPF Schedule Manager). - **Linux systemd** install/start/stop for the worker (`Type=notify`), matching Windows SCM. - `--prepare-data` creates scripts, logs, and shared-settings folders (and ACLs) without registering the service. - Community desktop GitHub assets: portable `maksit-uscheduler-{version}.zip` (win-x64 worker, UI, Scripts), Windows setup exe, and Flatpak of the UI. - Script list shows a description and platform (`Windows` / `Linux`). Incompatible scripts stay in the list but are grayed out; the worker does not run them. Bundled Hyper-V Backup, Windows Update, and File Sync are Windows-only. ### Changed - **Schedule Manager** is now **MaksIT.UScheduler.UI**. The UI launches without elevation; register/start/stop/unregister prompt for UAC (or pkexec) in place. - Worker and UI install to `C:\Program Files\MaksIT\UScheduler` (Linux: `/opt/maksit/uscheduler`). The Windows setup exe is **x64** (not Program Files (x86)) and ships worker + UI in that folder. Scripts live in `C:\MaksIT\Scripts` (`/var/lib/maksit/scripts`) and logs in `C:\MaksIT\Logs` (`/var/log/maksit`), with Users/group write after `--install` / `--prepare-data`. Bundled examples are copied only when the destination file or script folder does not already exist; existing customizations are left unchanged. - Schedule configuration is stored in `%ProgramData%\MaksIT\UScheduler\settings.json` (Linux: `/var/lib/maksit/uscheduler/settings.json`). Shipped `appsettings.json` next to the worker keeps host logging and a first-run Configuration seed. Per-user UI prefs stay in `%AppData%\MaksIT\UScheduler\settings.json`. - UI dark theme uses the MAKS.IT origami blues (`#33A5CF` / `#006199`). App icon is a faceted scheduler clock (not the brand M). - Worker is no longer Windows-only: no `win-x64` RID lock; Event Log logging stays Windows-only. - `sc.exe create` uses `binPath= ` / `start= auto` (space after `=`). - **Tests:** migrate to **xunit.v3** **4.0** + **Microsoft Testing Platform** (`src/global.json` `test.runner`; **coverlet.MTP**). README coverage badges are shields.io URLs. - Synced RepoUtils to the Community desktop profile (local-copy only; no `Update-RepoUtils`). Release engine QualityGate / publish / installer / Flatpak target **MaksIT.UScheduler.UI**. ### Removed - WPF **MaksIT.UScheduler.ScheduleManager** project. - SVG coverage badges under `assets/badges/`. ## [1.0.3] - 2026-06-28 ### Added - **RepoUtils release engine**: `utils/engines/release/` with `BundleCustomization` plugin for bundled ZIP releases - **`.editorconfig`**: repo-wide C# formatting (2-space indent, MaksIT brace style) ### Changed - **PSScriptGateway**: MaksIT.Core logging/middleware, layered config, camelCase JSON, and `Result` → `ToActionResult()` flow - **README** and **CONTRIBUTING**: RepoUtils test/release entry points, commit format, and coverage badge workflow ### Fixed - **Release packaging**: `utils/Invoke-ReleasePackage.bat` now targets a wired release engine (previously missing `utils/engines/release/`) - **ScheduleManager version**: aligned with `MaksIT.UScheduler` at `1.0.3` ## [1.0.2] - 2026-03-01 ### Fixed - **PowerShell module loading**: Scripts with module dependencies now execute correctly when running as Windows service - Added recursive dependency scanning using PowerShell AST parser - Automatically unblocks `Import-Module`, `using module`, and dot-sourced (`. ./file.ps1`) dependencies - Resolves "AuthorizationManager check failed" errors for modules downloaded from the internet - Supports `.psm1` and `.psd1` module files in script directory and subfolders ## [1.0.1] - 2026-02-15 ### Added - **CLI service management**: Added command-line arguments for service installation and management - `--install`, `-i`: Install the Windows service - `--uninstall`, `-u`: Uninstall the Windows service - `--start`: Start the service - `--stop`: Stop the service - `--status`: Query service status - `--help`, `-h`: Show help message - **Relative path support**: Script and process paths can now be relative to the application directory - **OS guard**: Application now checks for Windows at startup and exits with error on unsupported platforms - **Release script enhancement**: Example scripts are now automatically added to `appsettings.json` in disabled state during release build - **Unit tests**: Added comprehensive test project `MaksIT.UScheduler.Tests` with tests for background services and configuration - **Uscheduler Manager UI**: Introduced a graphical user interface (WPF) for managing script schedules, viewing script status, and editing configuration in real time - **Live configuration reload**: Added `ConfigurationReloadBackgroundService` to log configuration changes at runtime - **Hot-reload for scripts/processes**: Background services now use `IOptionsMonitor` to pick up changes in `appsettings.json` without restart ### Changed - Default value for `IsSigned` in PowerShell script configuration changed from `false` to `true` for improved security - PSScriptService now implements `IDisposable` for proper RunspacePool cleanup - Method signatures updated: `RunScript` → `RunScriptAsync`, `RunProcess` → `RunProcessAsync` - Service is now installed with `start=auto` for automatic startup on boot - Updated package dependencies: - MaksIT.Core: 1.6.0 → 1.6.3 - Microsoft.Extensions.Hosting: 10.0.0 → 10.0.3 - Microsoft.Extensions.Hosting.WindowsServices: 10.0.0 → 10.0.3 - System.Diagnostics.PerformanceCounter: 10.0.0 → 10.0.3 - Microsoft.Extensions.Logging.Abstractions: 10.0.2 → 10.0.3 ### Removed - `Install.cmd` and `Uninstall.cmd` files (replaced by CLI arguments) ### Fixed - **Parallel execution**: Restored parallel execution of PowerShell scripts and processes (broken during .NET Framework to .NET migration) - PSScriptService now uses RunspacePool (up to CPU core count) for concurrent script execution - Background services use `Task.WhenAll` to launch all tasks simultaneously - **Unit test improvements**: Refactored tests to use `IOptionsMonitor` for better coverage and reliability ## [1.0.0] - 2025-12-06 ### Major Changes - Migrate of the Unified Scheduler Service in .NET 10 (previously .NET 8). - New solution and project structure under `MaksIT.UScheduler`. - Added support for scheduling and running both PowerShell scripts and console applications as Windows services. - Strongly typed configuration via `appsettings.json` and `Configuration.cs`. - Improved logging with configurable log directory. - New background services: - `PSScriptBackgroundService` for PowerShell script execution. - `ProcessBackgroundService` for process management. - Enhanced PowerShell script execution with signature validation and script unblocking. - Improved process management with restart-on-failure logic. - Added install/uninstall scripts (`Install.cmd`, `Uninstall.cmd`) for service management (removed in v1.0.1). - Added comprehensive README with usage, configuration, and scheduling examples. - MIT License included. ### Breaking Changes - Old solution, project, and service files removed. - Configuration format and service naming conventions updated. - Scheduling logic for console applications is not yet implemented (runs every 10 seconds).