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())