diff --git a/.github/workflows/winget.yml b/.github/workflows/winget.yml index d606a2a05..dd506a87d 100644 --- a/.github/workflows/winget.yml +++ b/.github/workflows/winget.yml @@ -38,7 +38,13 @@ jobs: validate: name: Generate and validate manifests from a public Release - if: github.event_name == 'release' || github.event_name == 'workflow_dispatch' + # WinGet distributes stable versions only. A prerelease Release (alpha or + # beta) must never generate a WinGet manifest, so it is skipped here rather + # than failing later on a version string WinGet cannot express. A manual + # dispatch still works for republishing an existing stable Release. + if: >- + (github.event_name == 'release' && !github.event.release.prerelease) + || github.event_name == 'workflow_dispatch' runs-on: windows-2022 timeout-minutes: 30 steps: diff --git a/CHANGELOG.md b/CHANGELOG.md index 8815eb5e2..e8d96742e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,42 @@ # Changelog +## 1.3.0-alpha1 - 2026-08-04 + +First public prerelease of the Command Timeline. This is an alpha for local +testing, not a stable release: GitHub Latest and the winTerm website continue +to point at v1.2.0, and this version is not submitted to WinGet. + +### Added + +- Promoted the Command Timeline to a testable prerelease, combining engineering + checkpoints v1.2.1 through v1.2.4: the pane-owned OSC 133 index, the overlay + and deterministic navigation, load/copy/jump entry actions, and pane-local + search with the two public settings. +- Published `commandTimeline.enabled` (default `true`) and + `commandTimeline.historyLimit` (default `500`, range 50–5000) under + Settings → Appearance → Command timeline. + +### Changed + +- Advanced the release channel to `alpha` with application version + `1.3.0-alpha1`, package/file version `1.3.0.0`, and PowerShell module version + `1.3.0` plus prerelease suffix `alpha1`. The release workflow marks any + non-stable channel as a GitHub prerelease with `--latest=false`, so the + public Latest download remains v1.2.0. +- Relaxed `verify-version.ps1` from a stable-only gate to a channel-aware one. + It now accepts `stable`, `alpha`, and `beta`, and additionally enforces that + the channel, the module prerelease suffix, and the application-version suffix + agree, that the package version stays four-part numeric, and that the module + version stays numeric. +- Added a prerelease guard to the WinGet workflow so an alpha or beta Release + never generates a WinGet manifest. + +### Checkpoint status + +- Workspace schema, docking model, shell protocol, theme schema, update + manifest schema, package identity, and signing policy are unchanged from + v1.2.0. The Setup EXE remains unsigned; see the release notes. + ## 1.2.4 - 2026-08-04 ### Added diff --git a/custom.props b/custom.props index d1e1361f0..7957ab45c 100644 --- a/custom.props +++ b/custom.props @@ -5,7 +5,7 @@ true 2026 1 - 2 + 3 winTerm Windows Terminal 1033 diff --git a/docs/current-progress.md b/docs/current-progress.md index 6549fccd6..a1fd382da 100644 --- a/docs/current-progress.md +++ b/docs/current-progress.md @@ -4,68 +4,63 @@ Last updated: 2026-08-04 ## Repository state -- Branch: `feature/command-timeline-v1.3.0-phase4` -- Base branch: `main`. Command Timeline Phase 3 (tag `v1.2.3`) was squash-merged - to `main` as `5fd2172` through pull request #29. +- Branch: `release/v1.3.0-alpha1` +- Base branch: `main` at `ac760eab` (Command Timeline Phase 4, pull request #30) - Microsoft Terminal upstream revision: `1cea42d433253d95c4487a3037db48197b5e72f4` -- Engineering application and PowerShell module version: `1.2.4` -- Engineering package version: `1.2.4.0` -- Intended checkpoint tag: `v1.2.4` -- Final Command Timeline release target: `v1.3.0` -- Current public Latest: `v1.2.0` +- Application version: `1.3.0-alpha1` +- Package/file version: `1.3.0.0` +- PowerShell module version: `1.3.0` with prerelease suffix `alpha1` +- Release channel: `alpha` +- Release tag: `v1.3.0-alpha1` +- Current public Latest: `v1.2.0`, the stable Visual Progress release - Supported target: Windows 11 x64 -`v1.2.4` is a development checkpoint, not a distributable release. The README -and GitHub Latest continue to identify v1.2.0 as the public Visual Progress -release. Checkpoint tags v1.2.1 through v1.2.4 run quick validation only and are -explicitly excluded from full build, installer packaging, asset publication, -and GitHub Release jobs. +`v1.3.0-alpha1` is a published GitHub **prerelease**, not a stable release. The +release workflow marks any non-stable channel with `--prerelease` and +`--latest=false`, so `/releases/latest` keeps resolving to v1.2.0. The alpha is +deliberately not listed on the winTerm website and is skipped by the WinGet +workflow. -## Implemented in the working tree +## Command Timeline status -- Retained the Phase 1 index, the Phase 2 overlay and navigation model, and the - Phase 3 load/copy/jump entry actions unchanged in behavior. -- Added pane-local search over each pane's bounded in-memory command text. The - match is a literal case-insensitive substring search; there is no regex, no - fuzzy matching, no output search, and no terminal-buffer rescan. -- Added a 256 UTF-16 code-unit query cap that truncates without leaving a lone - surrogate, enforced in the model and mirrored by `MaxLength` on the filter box. -- Reworked the navigation model to walk a filtered projection while keeping - stable `CommandId` identity. A still-matching command stays selected, a command - that stops matching hands selection to the nearest surviving match, and a new - command only takes the selection when it matches and the view was already - following the latest command. -- Added `/` and Tab to focus the filter box. Both are consumed before the PTY, - and filter-box text never reaches the shell. Escape now clears a non-empty - query before it closes the overlay. -- Added the `commandTimeline.enabled` and `commandTimeline.historyLimit` global - settings with defaults `true` and `500`, a 50–5000 clamped range, JSON schema - entries, and a Settings UI section under Appearance. An absent setting is not - serialized back, so existing settings files need no migration. -- Added bounded per-pane history with oldest-first eviction that applies to - panes that already exist and to new panes. Raising the limit never resurrects - an evicted command and sequence IDs are never reused. -- Added four distinct empty states so an unsupported shell is never reported as - simply having run no commands. -- Made list item position and set size reflect the filtered result count, and - kept localized accessible names, non-color status, High Contrast theme - resources, and the Reduced Motion-safe no-animation path. -- Advanced authoritative engineering version surfaces to `1.2.4`/`1.2.4.0` and - added the v1.2.4 root changelog entry. -- Kept `v1.3.0-alpha` out of scope: no persistent history, no output cache, no - telemetry, and no public release work. +The Command Timeline is feature-complete for its in-memory surface. Engineering +checkpoints v1.2.1 through v1.2.4 are all merged to `main`: -## Validation state +| Checkpoint | Scope | +| --- | --- | +| `v1.2.1` | Pane-owned OSC 133 index, stable command IDs, bounded command-text cache | +| `v1.2.2` | Overlay, deterministic navigation, wheel accumulation, accessibility | +| `v1.2.3` | Load without executing, copy command/output, jump to output, context menu | +| `v1.2.4` | Pane-local search, public settings, shell degradation, bounded history | + +There is no persistent history, no output cache, no output search, and no +telemetry. + +## Release channel handling + +`verify-version.ps1` is now channel-aware rather than stable-only. It accepts +`stable`, `alpha`, and `beta`, and enforces that the channel, the module +prerelease suffix, and the application-version suffix agree with each other, so +a prerelease can never publish as Latest and a stable release can never carry a +prerelease suffix. The package version stays four-part numeric for MSIX and the +Win32 resource fields, and the PowerShell module version stays numeric with the +suffix carried in `PrivateData.PSData.Prerelease`. -Phase 4 validation requires the focused Command Timeline model/control tests, -the Settings Model Command Timeline tests, the extended -`test-command-timeline.ps1` source, search, settings, and privacy boundaries, -version and branding verification, release/CI classification guards, repository -Smoke validation, the smallest affected native projects, and GitHub quick PR -validation. Record exact results in the Draft PR and final task report; do not -treat this document as evidence for a command that did not run. +## Next steps + +1. Install `v1.3.0-alpha1` locally and exercise the Command Timeline. +2. Fix anything the alpha testing surfaces. +3. Cut `v1.3.0-beta1` on channel `beta`. The beta may be listed on the winTerm + website alongside the stable v1.2.0 download. +4. Promote to a stable `v1.3.0` only after beta testing, which is the point at + which Latest, WinGet, and the website stable slot move. + +## Validation state -The annotated `v1.2.4` checkpoint tag must point to the final commit that passes -those gates. Its tag workflow must run checkpoint quick validation only and -must not create a GitHub Release or update Latest. +Publication is gated by the tag-triggered release workflow: exact tag/version +match, release absence, clean checkout, version and branding verification, +static/security/privacy/workflow gates, an x64 Release build with compiled +tests, artifact generation, Draft asset re-download testing, and only then +publication. Record results from those actual runs; do not treat this document +as evidence for a command that did not run. diff --git a/docs/releases/1.3.0-alpha1.md b/docs/releases/1.3.0-alpha1.md new file mode 100644 index 000000000..f24b5f542 --- /dev/null +++ b/docs/releases/1.3.0-alpha1.md @@ -0,0 +1,146 @@ +# winTerm 1.3.0-alpha1 + +**This is an alpha prerelease for local testing. It is not a stable release.** +The current stable release remains +[v1.2.0](https://github.com/HelloThisWorld/winTerm/releases/tag/v1.2.0), and +`/releases/latest` continues to point there. This alpha is published only as a +tagged GitHub prerelease; it is not listed on the winTerm website and is not +submitted to WinGet. + +winTerm 1.3.0-alpha1 brings the Command Timeline feature to a testable state. +It is the combined result of engineering checkpoints v1.2.1 through v1.2.4. + +## What is new: Command Timeline + +The Command Timeline is a per-pane, in-memory list of the commands that pane +has run. Open it with `Ctrl+Tab`, or with the handle on the left edge of the +terminal. + +- **Per-pane history.** Each pane keeps its own list, built from OSC 133 shell + integration only. winTerm never guesses where a prompt or output begins. +- **Load without executing.** `Enter` or a single click puts the selected + command on the input line and stops there. No carriage return is ever sent, + the Windows clipboard is never read, and input broadcast never forwards the + load to another pane. You review the command and press Enter yourself. +- **Filtering.** Press `/` or `Tab` and type to narrow the list. Matching is a + plain, case-insensitive substring match over command text only — no + wildcards, no regular expressions, no fuzzy matching, and command output is + never searched. +- **Copy and jump.** Right-click an entry to copy the command, copy its output, + or scroll to where its output begins. Output is read from the terminal buffer + only at that moment and is never cached. +- **Trustworthy status.** A command shows as succeeded or failed only when the + shell actually reported it. Incomplete shell integration reads as Unknown + rather than guessing, and status is never conveyed by color alone. + +## Keyboard + +| Shortcut | Behavior | +| --- | --- | +| `Ctrl+Tab` | Toggle the Command Timeline for the focused pane | +| `Ctrl+T` | Next tab | +| `Ctrl+Shift+T` | Previous tab | +| `Ctrl+Alt+T` | Open new tab | + +While the Timeline is open: + +| Key | Behavior | +| --- | --- | +| `/` or `Tab` | Move focus to the filter box | +| `Up` / `Down` | Move the selection by one command | +| `Left` / `Right` | Select the first / last command on the current page | +| `Enter` | Load the selected command; never runs it | +| `Space` | Scroll the terminal to that command's output | +| `Ctrl+C` | Copy the selected command text | +| `Escape` | Clear the filter, or close the Timeline if the filter is empty | + +Your own key bindings take precedence over every default above. Keys the +Timeline consumes are not sent to the shell, and filter text never reaches the +shell. + +## Settings and defaults + +A new section lives under **Settings → Appearance → Command timeline**: + +```json +{ + "commandTimeline.enabled": true, + "commandTimeline.historyLimit": 500 +} +``` + +- **Show command timeline** defaults on. Turning it off hides the handle, + closes an open overlay, and stops `Ctrl+Tab` from opening it. +- **Commands remembered per pane** defaults to 500 and accepts 50 through 5000. + Lowering it discards the oldest commands immediately; raising it does not + bring them back. + +An existing settings file needs no migration. An out-of-range value is clamped +into the supported range rather than failing the settings load. + +## Shell requirements + +The Timeline depends on OSC 133 shell integration. + +| Situation | What you see | +| --- | --- | +| Capability not yet determined | `Waiting for shell integration` | +| Shell does not report complete command boundaries | `Command timeline unavailable` | +| Shell integration works, no commands yet | `No commands yet` | +| A filter is active and nothing matches | `No matching commands` | + +PowerShell with winTerm shell integration reports full boundaries. `cmd.exe` +does not, and winTerm adds no prompt parser for it, so the Timeline stays +unavailable there rather than showing untrustworthy results. + +## Privacy + +- Command text lives only in memory, only in the pane that ran it, and only + while that pane is open. Nothing is written to disk; there is no command + history file or database. +- Command output is never cached, indexed, or searched. +- Filter text is never saved and never leaves the pane. +- No telemetry is written, and no command, output, path, or filter text is + logged. +- The clipboard is written only by an explicit copy action, and is never read. + +See the [privacy policy](https://github.com/HelloThisWorld/winTerm/blob/main/PRIVACY.md). + +## Unchanged in this release + +Workspace schema (2), docking model (1), shell protocol (1), theme schema (1), +update manifest schema (1), package identity, and signing policy are all +unchanged from v1.2.0. Visual Progress behavior is unchanged. + +## Known limitations + +- The Timeline requires OSC 133 shell integration; it stays unavailable under + `cmd.exe`. +- A multi-line command is refused when the shell has not enabled bracketed + paste, because unbracketed line breaks would be read as pressing Enter. +- Loading a command longer than 1024 characters asks for a confirming `Enter`. +- Command history does not survive closing a pane, and is intentionally never + persisted. + +## Installation + +The Setup EXE supports current-user and all-users installation; the Portable +ZIP can be extracted to a writable directory and run without installation. + +Publisher: `helloThisWorld`. Tag: `v1.3.0-alpha1`. + +Because this is an alpha, install it alongside or after backing up your +settings. Package identity stays separate from Microsoft Terminal, so it does +not disturb an existing Windows Terminal installation. + +## Signing + +The winTerm 1.3.0-alpha1 Setup EXE is not Authenticode-signed. Windows may +display Unknown Publisher or a SmartScreen warning. Download only from the +official GitHub Release and verify the file against `SHA256SUMS.txt` before +running it. + +## Policies + +- [Code signing policy](https://github.com/HelloThisWorld/winTerm/blob/main/CODE_SIGNING_POLICY.md) +- [Privacy policy](https://github.com/HelloThisWorld/winTerm/blob/main/PRIVACY.md) diff --git a/scripts/winterm/package-shell-assets.ps1 b/scripts/winterm/package-shell-assets.ps1 index bfe4703bf..ca38981ca 100644 --- a/scripts/winterm/package-shell-assets.ps1 +++ b/scripts/winterm/package-shell-assets.ps1 @@ -32,9 +32,9 @@ foreach ($relativePath in $sourceAssets) } $version = Get-Content -LiteralPath (Join-Path $repositoryRoot 'shell\shared\version.json') -Raw | ConvertFrom-Json -if ($version.moduleVersion -ne '1.2.4' -or - $version.modulePrerelease -ne '' -or - $version.applicationVersion -ne '1.2.4' -or +if ($version.moduleVersion -ne '1.3.0' -or + $version.modulePrerelease -ne 'alpha1' -or + $version.applicationVersion -ne '1.3.0-alpha1' -or $version.protocolVersion -ne 1) { throw 'The winTerm Shell asset version metadata is invalid.' diff --git a/scripts/winterm/test-release-workflow.ps1 b/scripts/winterm/test-release-workflow.ps1 index 973f70b15..e122810a5 100644 --- a/scripts/winterm/test-release-workflow.ps1 +++ b/scripts/winterm/test-release-workflow.ps1 @@ -137,6 +137,10 @@ try throw "WinGet workflow is missing required boundary '$required'." } } + if (-not $wingetWorkflow.Contains("github.event_name == 'release' && !github.event.release.prerelease")) + { + throw 'WinGet workflow must skip prerelease Releases so alpha and beta never reach WinGet.' + } if ($wingetWorkflow.Contains('Repair-WinGetPackageManager -Latest') -or $wingetWorkflow -match '(?i)\.msix(bundle)?') { diff --git a/scripts/winterm/test-visual-progress.ps1 b/scripts/winterm/test-visual-progress.ps1 index e0d390884..b3baa4840 100644 --- a/scripts/winterm/test-visual-progress.ps1 +++ b/scripts/winterm/test-visual-progress.ps1 @@ -1378,12 +1378,12 @@ try $version = $source.VersionMetadata | ConvertFrom-Json $expectedVersionValues = [ordered]@{ - applicationVersion = '1.2.4' - packageVersion = '1.2.4.0' - moduleVersion = '1.2.4' - modulePrerelease = '' - channel = 'stable' - tag = 'v1.2.4' + applicationVersion = '1.3.0-alpha1' + packageVersion = '1.3.0.0' + moduleVersion = '1.3.0' + modulePrerelease = 'alpha1' + channel = 'alpha' + tag = 'v1.3.0-alpha1' workspaceSchemaVersion = 2 dockingModelVersion = 1 shellProtocolVersion = 1 @@ -1398,39 +1398,39 @@ try } } $shellVersion = $source.ShellVersion | ConvertFrom-Json - if ($shellVersion.applicationVersion -ne '1.2.4' -or $shellVersion.moduleVersion -ne '1.2.4' -or $shellVersion.protocolVersion -ne 1) + if ($shellVersion.applicationVersion -ne '1.3.0-alpha1' -or $shellVersion.moduleVersion -ne '1.3.0' -or $shellVersion.protocolVersion -ne 1) { - throw 'Shell version metadata does not match winTerm engineering checkpoint 1.2.4 with protocol version 1.' + throw 'Shell version metadata does not match winTerm release 1.3.0-alpha1 with protocol version 1.' } foreach ($surface in @( - @{ Content = $source.ReleaseMetadata; Value = 'ApplicationVersion{ L"1.2.4" }'; Description = 'About release metadata' }, - @{ Content = $source.PackageManifest; Value = 'Version="1.2.4.0"'; Description = 'MSIX package manifest' }, - @{ Content = $source.HostResource; Value = 'FILEVERSION 1,2,4,0'; Description = 'Terminal host file version' }, - @{ Content = $source.HostResource; Value = '"ProductVersion", "1.2.4\0"'; Description = 'Terminal host display version' }, - @{ Content = $source.ShimResource; Value = 'FILEVERSION 1,2,4,0'; Description = 'Shim file version' }, - @{ Content = $source.ShimResource; Value = '"ProductVersion", "1.2.4\0"'; Description = 'Shim display version' }, + @{ Content = $source.ReleaseMetadata; Value = 'ApplicationVersion{ L"1.3.0-alpha1" }'; Description = 'About release metadata' }, + @{ Content = $source.PackageManifest; Value = 'Version="1.3.0.0"'; Description = 'MSIX package manifest' }, + @{ Content = $source.HostResource; Value = 'FILEVERSION 1,3,0,0'; Description = 'Terminal host file version' }, + @{ Content = $source.HostResource; Value = '"ProductVersion", "1.3.0-alpha1\0"'; Description = 'Terminal host display version' }, + @{ Content = $source.ShimResource; Value = 'FILEVERSION 1,3,0,0'; Description = 'Shim file version' }, + @{ Content = $source.ShimResource; Value = '"ProductVersion", "1.3.0-alpha1\0"'; Description = 'Shim display version' }, @{ Content = $source.CustomProps; Value = '1'; Description = 'Executable major version' }, - @{ Content = $source.CustomProps; Value = '2'; Description = 'Executable minor version' }, - @{ Content = $source.ShellModuleManifest; Value = "ModuleVersion = '1.2.4'"; Description = 'PowerShell module manifest' }, - @{ Content = $source.ShellModule; Value = "`$script:WinTermModuleVersion = '1.2.4'"; Description = 'PowerShell module runtime' }, + @{ Content = $source.CustomProps; Value = '3'; Description = 'Executable minor version' }, + @{ Content = $source.ShellModuleManifest; Value = "ModuleVersion = '1.3.0'"; Description = 'PowerShell module manifest' }, + @{ Content = $source.ShellModule; Value = "`$script:WinTermModuleVersion = '1.3.0'"; Description = 'PowerShell module runtime' }, @{ Content = $source.PackageShellAssets; Value = "'shell\shared\version.json'"; Description = 'Canonical shell version metadata packaging' }, - @{ Content = $source.WorkspaceSerializer; Value = '"1.2.4"'; Description = 'Workspace application-version fallback' } + @{ Content = $source.WorkspaceSerializer; Value = '"1.3.0-alpha1"'; Description = 'Workspace application-version fallback' } )) { Assert-Contains $surface.Content $surface.Value $surface.Description } foreach ($required in @( - "applicationVersion -eq '1.2.4'", - "packageVersion -eq '1.2.4.0'", - "moduleVersion -eq '1.2.4'", - "tag -eq 'v1.2.4'", + "applicationVersion -eq '1.3.0-alpha1'", + "packageVersion -eq '1.3.0.0'", + "moduleVersion -eq '1.3.0'", + "tag -eq 'v1.3.0-alpha1'", "Workspace Schema version remains 2", "Docking Model version remains 1", "Shell Protocol version remains 1", "Theme Schema remains at version 1" )) { - Assert-Contains $source.VerifyVersion $required 'Authoritative v1.2.4 version validation surface' + Assert-Contains $source.VerifyVersion $required 'Authoritative v1.3.0-alpha1 version validation surface' } $testBinary = Join-Path $root "bin\$Platform\$Configuration\UnitTests_SettingsModel\SettingsModel.Unit.Tests.dll" diff --git a/scripts/winterm/test.ps1 b/scripts/winterm/test.ps1 index 031c0feb7..a9b8275a4 100644 --- a/scripts/winterm/test.ps1 +++ b/scripts/winterm/test.ps1 @@ -292,8 +292,8 @@ function Test-ShellExperienceFoundations } $manifest = Import-PowerShellDataFile -LiteralPath $moduleManifest - if ($manifest.ModuleVersion -ne '1.2.4' -or - $manifest.PrivateData.PSData.Prerelease -ne '' -or + if ($manifest.ModuleVersion -ne '1.3.0' -or + $manifest.PrivateData.PSData.Prerelease -ne 'alpha1' -or $manifest.PowerShellVersion -ne '5.1') { throw 'The winTerm PowerShell module manifest does not declare the supported version boundary.' diff --git a/scripts/winterm/verify-branding.ps1 b/scripts/winterm/verify-branding.ps1 index 2f49ef1ca..cccb3667e 100644 --- a/scripts/winterm/verify-branding.ps1 +++ b/scripts/winterm/verify-branding.ps1 @@ -126,7 +126,7 @@ function Test-Manifest Test-Requirement -Condition ($null -ne $identity -and $identity.Name -eq 'HelloThisWorld.winTerm') -Message "$Path uses package identity HelloThisWorld.winTerm" Test-Requirement -Condition ($null -ne $identity -and $identity.Name -notmatch '^Microsoft\.') -Message "$Path does not use a Microsoft package name" Test-Requirement -Condition ($null -ne $identity -and $identity.Publisher -ceq $ExpectedPublisher) -Message "$Path uses the expected non-Microsoft publisher" - Test-Requirement -Condition ($null -ne $identity -and $identity.Version -eq '1.2.4.0') -Message "$Path uses package version 1.2.4.0" + Test-Requirement -Condition ($null -ne $identity -and $identity.Version -eq '1.3.0.0') -Message "$Path uses package version 1.3.0.0" Test-Requirement -Condition ($null -ne $properties -and $properties.DisplayName -eq 'winTerm') -Message "$Path package display name is winTerm" Test-Requirement -Condition ($null -ne $application -and $application.Id -eq 'winTerm') -Message "$Path application ID is winTerm" Test-Requirement -Condition ($null -ne $visualElements -and $visualElements.DisplayName -eq 'winTerm') -Message "$Path application display name is winTerm" diff --git a/scripts/winterm/verify-version.ps1 b/scripts/winterm/verify-version.ps1 index 06d6865f8..9166c4b7b 100644 --- a/scripts/winterm/verify-version.ps1 +++ b/scripts/winterm/verify-version.ps1 @@ -49,12 +49,24 @@ try $versionPath = Join-Path $repositoryRoot 'src\winterm\Branding\version.json' $version = Get-Content -LiteralPath $versionPath -Raw | ConvertFrom-Json - Assert-Condition ($version.applicationVersion -eq '1.2.4') 'Application version is 1.2.4' - Assert-Condition ($version.packageVersion -eq '1.2.4.0') 'Package version is 1.2.4.0' - Assert-Condition ($version.moduleVersion -eq '1.2.4') 'PowerShell module version is 1.2.4' - Assert-Condition ($version.modulePrerelease -eq '') 'PowerShell module has no prerelease suffix' - Assert-Condition ($version.channel -eq 'stable') 'Release channel is stable' - Assert-Condition ($version.tag -eq 'v1.2.4') 'Engineering checkpoint tag is v1.2.4' + Assert-Condition ($version.applicationVersion -eq '1.3.0-alpha1') 'Application version is 1.3.0-alpha1' + Assert-Condition ($version.packageVersion -eq '1.3.0.0') 'Package version is 1.3.0.0' + Assert-Condition ($version.moduleVersion -eq '1.3.0') 'PowerShell module version is 1.3.0' + Assert-Condition ($version.modulePrerelease -eq 'alpha1') 'PowerShell module prerelease suffix is alpha1' + + # The release workflow treats any channel other than 'stable' as a + # prerelease: it marks the GitHub Release --prerelease and --latest=false. + # Keep the channel, the module prerelease suffix, and the application + # version suffix consistent so a prerelease can never publish as Latest. + $supportedChannels = @('stable', 'alpha', 'beta') + Assert-Condition ($supportedChannels -contains $version.channel) "Release channel is one of: $($supportedChannels -join ', ')" + $isPrerelease = $version.channel -ne 'stable' + Assert-Condition ($isPrerelease -eq ($version.modulePrerelease -ne '')) 'Module prerelease suffix agrees with the release channel' + Assert-Condition ($isPrerelease -eq ($version.applicationVersion -match '-')) 'Application version suffix agrees with the release channel' + Assert-Condition ($version.packageVersion -match '^\d+\.\d+\.\d+\.\d+$') 'Package version stays a four-part numeric version' + Assert-Condition ($version.moduleVersion -match '^\d+\.\d+\.\d+$') 'PowerShell module version stays numeric' + + Assert-Condition ($version.tag -eq 'v1.3.0-alpha1') 'Release tag is v1.3.0-alpha1' Assert-Condition ($version.workspaceSchemaVersion -eq 2) 'Workspace Schema version remains 2' Assert-Condition ($version.dockingModelVersion -eq 1) 'Docking Model version remains 1' Assert-Condition ($version.shellProtocolVersion -eq 1) 'Shell Protocol version remains 1' @@ -73,12 +85,12 @@ try $propsNamespace.AddNamespace('m', 'http://schemas.microsoft.com/developer/msbuild/2003') $major = $customProps.SelectSingleNode('//m:VersionMajor', $propsNamespace).'#text' $minor = $customProps.SelectSingleNode('//m:VersionMinor', $propsNamespace).'#text' - Assert-Condition ("$major.$minor" -eq '1.2') 'Executable metadata major and minor versions match 1.2' + Assert-Condition ("$major.$minor" -eq '1.3') 'Executable metadata major and minor versions match 1.3' $moduleManifest = Import-PowerShellDataFile -LiteralPath (Join-Path $repositoryRoot 'shell\powershell\winTerm.Shell\winTerm.Shell.psd1') Assert-Condition ($moduleManifest.ModuleVersion.ToString() -eq $version.moduleVersion) 'PowerShell manifest version matches release metadata' Assert-Condition ($moduleManifest.PrivateData.PSData.Prerelease -eq $version.modulePrerelease) 'PowerShell manifest prerelease matches release metadata' - Assert-Condition ((Get-Text 'shell\powershell\winTerm.Shell\winTerm.Shell.psm1').Contains("`$script:WinTermModuleVersion = '1.2.4'")) 'PowerShell module runtime version matches release metadata' + Assert-Condition ((Get-Text 'shell\powershell\winTerm.Shell\winTerm.Shell.psm1').Contains("`$script:WinTermModuleVersion = '1.3.0'")) 'PowerShell module runtime version matches release metadata' $shellVersion = Get-Text 'shell\shared\version.json' | ConvertFrom-Json Assert-Condition ($shellVersion.applicationVersion -eq $version.applicationVersion) 'Shell asset application version matches release metadata' @@ -86,8 +98,8 @@ try Assert-Condition ($shellVersion.protocolVersion -eq $version.shellProtocolVersion) 'Shell asset protocol version matches release metadata' $releaseHeader = Get-Text 'src\winterm\Branding\ReleaseMetadata.h' - Assert-Condition ($releaseHeader.Contains('ApplicationVersion{ L"1.2.4" }')) 'About metadata application version is 1.2.4' - Assert-Condition ($releaseHeader.Contains('ReleaseChannel{ L"Stable" }')) 'About metadata channel is Stable' + Assert-Condition ($releaseHeader.Contains('ApplicationVersion{ L"1.3.0-alpha1" }')) 'About metadata application version is 1.3.0-alpha1' + Assert-Condition ($releaseHeader.Contains('ReleaseChannel{ L"Alpha" }')) 'About metadata channel is Alpha' Assert-Condition ($releaseHeader.Contains($version.microsoftTerminalUpstreamRevision)) 'About metadata contains the Microsoft Terminal upstream revision' Assert-Condition ($releaseHeader.Contains('WorkspaceSchemaVersion{ 2 }')) 'About metadata contains Workspace Schema version 2' Assert-Condition ($releaseHeader.Contains('DockingModelVersion{ 1 }')) 'About metadata contains Docking Model version 1' @@ -117,10 +129,10 @@ try Assert-Condition ((Get-Text 'src\winterm\Workspaces\Model\WorkspaceDescriptor.h').Contains('WorkspaceSchemaVersion{ 2 }')) 'Workspace model remains at Schema version 2' Assert-Condition ((Get-Text 'src\winterm\Workspaces\Model\WorkspaceDescriptor.h').Contains('DockingModelVersion{ 1 }')) 'Workspace model remains at Docking version 1' - Assert-Condition ((Get-Text 'src\winterm\Workspaces\Model\WorkspaceDescriptor.h').Contains('applicationVersion{ "1.2.4" }')) 'Workspace model application-version fallback is 1.2.4' + Assert-Condition ((Get-Text 'src\winterm\Workspaces\Model\WorkspaceDescriptor.h').Contains('applicationVersion{ "1.3.0-alpha1" }')) 'Workspace model application-version fallback is 1.3.0-alpha1' Assert-Condition ((Get-Text 'src\winterm\Shell\Protocol\ShellIntegrationProtocol.h').Contains('ShellProtocolVersion{ 1 }')) 'Shell protocol remains at version 1' Assert-Condition ((Get-Text 'src\winterm\Appearance\Themes\ThemeDescriptor.h').Contains('CurrentThemeSchemaVersion{ 1 }')) 'Theme Schema remains at version 1' - Assert-Condition ((Get-Text 'src\winterm\Workspaces\Persistence\WorkspaceSerializer.cpp').Contains('"1.2.4"')) 'Workspace serializer application-version fallback is 1.2.4' + Assert-Condition ((Get-Text 'src\winterm\Workspaces\Persistence\WorkspaceSerializer.cpp').Contains('"1.3.0-alpha1"')) 'Workspace serializer application-version fallback is 1.3.0-alpha1' $releaseWorkflow = Get-Text '.github\workflows\release.yml' Assert-Condition ($releaseWorkflow.Contains("- 'v*'")) 'Release workflow accepts version tags through a generic guarded trigger' @@ -135,7 +147,7 @@ try if ($RequireTag) { $tag = (& git describe --tags --exact-match 2>$null).Trim() - Assert-Condition ($LASTEXITCODE -eq 0 -and $tag -eq $version.tag) 'Checked-out commit is exactly tagged v1.2.4' + Assert-Condition ($LASTEXITCODE -eq 0 -and $tag -eq $version.tag) 'Checked-out commit is exactly tagged v1.3.0-alpha1' } Write-Host 'winTerm version consistency verification passed.' -ForegroundColor Green diff --git a/shell/powershell/winTerm.Shell/winTerm.Shell.psd1 b/shell/powershell/winTerm.Shell/winTerm.Shell.psd1 index 22b9bb95d..7acfa0b82 100644 --- a/shell/powershell/winTerm.Shell/winTerm.Shell.psd1 +++ b/shell/powershell/winTerm.Shell/winTerm.Shell.psd1 @@ -1,6 +1,6 @@ @{ RootModule = 'winTerm.Shell.psm1' - ModuleVersion = '1.2.4' + ModuleVersion = '1.3.0' GUID = 'f65cd8f4-5d25-4a2a-a0d4-58df1ab3dc5a' Author = 'winTerm contributors' CompanyName = 'winTerm' @@ -12,7 +12,7 @@ AliasesToExport = @() PrivateData = @{ PSData = @{ - Prerelease = '' + Prerelease = 'alpha1' Tags = @('winTerm', 'terminal', 'shell-integration') ProjectUri = 'https://github.com/HelloThisWorld/winTerm' LicenseUri = 'https://github.com/HelloThisWorld/winTerm/blob/main/LICENSE' diff --git a/shell/powershell/winTerm.Shell/winTerm.Shell.psm1 b/shell/powershell/winTerm.Shell/winTerm.Shell.psm1 index c117e226f..60ce7475c 100644 --- a/shell/powershell/winTerm.Shell/winTerm.Shell.psm1 +++ b/shell/powershell/winTerm.Shell/winTerm.Shell.psm1 @@ -3,7 +3,7 @@ Set-StrictMode -Version Latest -$script:WinTermModuleVersion = '1.2.4' +$script:WinTermModuleVersion = '1.3.0' $script:WinTermProtocolVersion = 1 $script:WinTermIntegrationEnabled = $false $script:WinTermPromptWrapped = $false diff --git a/shell/shared/version.json b/shell/shared/version.json index da2d0f242..7d4bbc6ba 100644 --- a/shell/shared/version.json +++ b/shell/shared/version.json @@ -1,6 +1,6 @@ { - "applicationVersion": "1.2.4", - "moduleVersion": "1.2.4", - "modulePrerelease": "", + "applicationVersion": "1.3.0-alpha1", + "moduleVersion": "1.3.0", + "modulePrerelease": "alpha1", "protocolVersion": 1 } diff --git a/src/cascadia/CascadiaPackage/Package-winTerm.appxmanifest b/src/cascadia/CascadiaPackage/Package-winTerm.appxmanifest index c7a8dd902..7afe72e1d 100644 --- a/src/cascadia/CascadiaPackage/Package-winTerm.appxmanifest +++ b/src/cascadia/CascadiaPackage/Package-winTerm.appxmanifest @@ -18,7 +18,7 @@ + Version="1.3.0.0" /> winTerm diff --git a/src/cascadia/WindowsTerminal/WindowsTerminal.rc b/src/cascadia/WindowsTerminal/WindowsTerminal.rc index 0e87afc96..f6cbaa177 100644 --- a/src/cascadia/WindowsTerminal/WindowsTerminal.rc +++ b/src/cascadia/WindowsTerminal/WindowsTerminal.rc @@ -83,8 +83,8 @@ IDI_APPICON_HC_WHITE ICON "..\\..\\..\\res\\terminal\\imag #if defined(WT_BRANDING_WINTERM) 1 VERSIONINFO - FILEVERSION 1,2,4,0 - PRODUCTVERSION 1,2,4,0 + FILEVERSION 1,3,0,0 + PRODUCTVERSION 1,3,0,0 FILEFLAGSMASK 0x3fL #ifdef _DEBUG FILEFLAGS VS_FF_DEBUG @@ -101,12 +101,12 @@ BEGIN BEGIN VALUE "CompanyName", "helloThisWorld\0" VALUE "FileDescription", "winTerm Terminal Host\0" - VALUE "FileVersion", "1.2.4.0\0" + VALUE "FileVersion", "1.3.0.0\0" VALUE "InternalName", "WindowsTerminal\0" VALUE "LegalCopyright", "Copyright (c) winTerm contributors. Portions copyright Microsoft Corporation.\0" VALUE "OriginalFilename", "WindowsTerminal.exe\0" VALUE "ProductName", "winTerm\0" - VALUE "ProductVersion", "1.2.4\0" + VALUE "ProductVersion", "1.3.0-alpha1\0" END END BLOCK "VarFileInfo" diff --git a/src/cascadia/wt/wt.rc b/src/cascadia/wt/wt.rc index 4985150f0..f9bc98620 100644 --- a/src/cascadia/wt/wt.rc +++ b/src/cascadia/wt/wt.rc @@ -58,8 +58,8 @@ IDI_APPICON ICON "..\\..\\..\\res\\terminal.ico" #if defined(WT_BRANDING_WINTERM) 1 VERSIONINFO - FILEVERSION 1,2,4,0 - PRODUCTVERSION 1,2,4,0 + FILEVERSION 1,3,0,0 + PRODUCTVERSION 1,3,0,0 FILEFLAGSMASK 0x3fL #ifdef _DEBUG FILEFLAGS VS_FF_DEBUG @@ -76,12 +76,12 @@ BEGIN BEGIN VALUE "CompanyName", "helloThisWorld\0" VALUE "FileDescription", "winTerm Launcher\0" - VALUE "FileVersion", "1.2.4.0\0" + VALUE "FileVersion", "1.3.0.0\0" VALUE "InternalName", "winTerm\0" VALUE "LegalCopyright", "Copyright (c) winTerm contributors. Portions copyright Microsoft Corporation.\0" VALUE "OriginalFilename", "winTerm.exe\0" VALUE "ProductName", "winTerm\0" - VALUE "ProductVersion", "1.2.4\0" + VALUE "ProductVersion", "1.3.0-alpha1\0" END END BLOCK "VarFileInfo" diff --git a/src/winterm-tools/winterm-shim/winterm-shim.rc b/src/winterm-tools/winterm-shim/winterm-shim.rc index 7f700a2b4..a9085a8f4 100644 --- a/src/winterm-tools/winterm-shim/winterm-shim.rc +++ b/src/winterm-tools/winterm-shim/winterm-shim.rc @@ -4,8 +4,8 @@ #include 1 VERSIONINFO - FILEVERSION 1,2,4,0 - PRODUCTVERSION 1,2,4,0 + FILEVERSION 1,3,0,0 + PRODUCTVERSION 1,3,0,0 FILEFLAGSMASK 0x3fL #ifdef _DEBUG FILEFLAGS VS_FF_DEBUG @@ -22,12 +22,12 @@ BEGIN BEGIN VALUE "CompanyName", "helloThisWorld\0" VALUE "FileDescription", "winTerm Shell Integration Helper\0" - VALUE "FileVersion", "1.2.4.0\0" + VALUE "FileVersion", "1.3.0.0\0" VALUE "InternalName", "winterm-shim\0" VALUE "LegalCopyright", "Copyright (c) winTerm contributors.\0" VALUE "OriginalFilename", "winterm-shim.exe\0" VALUE "ProductName", "winTerm\0" - VALUE "ProductVersion", "1.2.4\0" + VALUE "ProductVersion", "1.3.0-alpha1\0" END END BLOCK "VarFileInfo" diff --git a/src/winterm/Branding/ReleaseMetadata.h b/src/winterm/Branding/ReleaseMetadata.h index 3768520ff..2ecfffab3 100644 --- a/src/winterm/Branding/ReleaseMetadata.h +++ b/src/winterm/Branding/ReleaseMetadata.h @@ -25,8 +25,8 @@ namespace winTerm::Branding { inline constexpr std::wstring_view Publisher{ L"helloThisWorld" }; - inline constexpr std::wstring_view ApplicationVersion{ L"1.2.4" }; - inline constexpr std::wstring_view ReleaseChannel{ L"Stable" }; + inline constexpr std::wstring_view ApplicationVersion{ L"1.3.0-alpha1" }; + inline constexpr std::wstring_view ReleaseChannel{ L"Alpha" }; inline constexpr std::wstring_view CommitSha{ WINTERM_BUILD_COMMIT_SHA }; inline constexpr std::wstring_view BuildTimestamp{ WINTERM_BUILD_TIMESTAMP }; inline constexpr std::wstring_view WorkflowRunId{ WINTERM_BUILD_WORKFLOW_RUN_ID }; diff --git a/src/winterm/Branding/version.json b/src/winterm/Branding/version.json index d7f64f369..8a675870d 100644 --- a/src/winterm/Branding/version.json +++ b/src/winterm/Branding/version.json @@ -1,10 +1,10 @@ { - "applicationVersion": "1.2.4", - "packageVersion": "1.2.4.0", - "moduleVersion": "1.2.4", - "modulePrerelease": "", - "channel": "stable", - "tag": "v1.2.4", + "applicationVersion": "1.3.0-alpha1", + "packageVersion": "1.3.0.0", + "moduleVersion": "1.3.0", + "modulePrerelease": "alpha1", + "channel": "alpha", + "tag": "v1.3.0-alpha1", "workspaceSchemaVersion": 2, "dockingModelVersion": 1, "shellProtocolVersion": 1, diff --git a/src/winterm/Workspaces/Model/WorkspaceDescriptor.h b/src/winterm/Workspaces/Model/WorkspaceDescriptor.h index 375e890bf..13fee3070 100644 --- a/src/winterm/Workspaces/Model/WorkspaceDescriptor.h +++ b/src/winterm/Workspaces/Model/WorkspaceDescriptor.h @@ -219,7 +219,7 @@ namespace winTerm::Workspaces std::string createdAt; std::string updatedAt; WorkspaceSource source{ WorkspaceSource::User }; - std::string applicationVersion{ "1.2.4" }; + std::string applicationVersion{ "1.3.0-alpha1" }; uint32_t protocolVersion{ 1 }; uint32_t dockingModelVersion{ DockingModelVersion }; WorkspaceStartupBehavior startupBehavior; diff --git a/src/winterm/Workspaces/Persistence/WorkspaceSerializer.cpp b/src/winterm/Workspaces/Persistence/WorkspaceSerializer.cpp index 17f19856a..3f2b1d8fd 100644 --- a/src/winterm/Workspaces/Persistence/WorkspaceSerializer.cpp +++ b/src/winterm/Workspaces/Persistence/WorkspaceSerializer.cpp @@ -618,7 +618,7 @@ WorkspaceDescriptor WorkspaceSerializer::FromJson(const Json::Value& json, const throw std::runtime_error("The workspace source is not supported."); } workspace.source = *source; - workspace.applicationVersion = StringOrDefault(json, "applicationVersion", "1.2.4"); + workspace.applicationVersion = StringOrDefault(json, "applicationVersion", "1.3.0-alpha1"); workspace.protocolVersion = UIntOrDefault(json, "protocolVersion", 1); workspace.dockingModelVersion = UIntOrDefault(json, "dockingModelVersion", DockingModelVersion); if (const auto& startup = json["startupBehavior"]; !startup.isNull())