Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/ISSUE_TEMPLATE/Bug_Report.yml
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ body:
id: version
attributes:
label: winTerm version
placeholder: 1.0.1 or exact commit
placeholder: 1.0.2 or exact commit
validations:
required: true
- type: dropdown
Expand Down
62 changes: 31 additions & 31 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,18 +3,18 @@ name: winTerm self-signed stable release
on:
push:
tags:
- 'v1.0.1'
- 'v1.0.2'

permissions:
contents: read

concurrency:
group: winterm-v1.0.1-stable-release
group: winterm-v1.0.2-stable-release
cancel-in-progress: false

env:
WINTERM_VERSION: 1.0.1
WINTERM_TAG: v1.0.1
WINTERM_VERSION: 1.0.2
WINTERM_TAG: v1.0.2
WINTERM_PUBLISHER: CN=winTerm Development
WINTERM_UPSTREAM_REVISION: 1cea42d433253d95c4487a3037db48197b5e72f4

Expand All @@ -33,12 +33,12 @@ jobs:
- name: Verify tag, commit, and clean checkout
shell: pwsh
run: |
if ('${{ github.ref }}' -ne 'refs/tags/v1.0.1') {
throw 'Stable release runs must check out refs/tags/v1.0.1.'
if ('${{ github.ref }}' -ne 'refs/tags/v1.0.2') {
throw 'Stable release runs must check out refs/tags/v1.0.2.'
}
$tagCommit = (git rev-list -n 1 v1.0.1).Trim()
$tagCommit = (git rev-list -n 1 v1.0.2).Trim()
if ($tagCommit -ne '${{ github.sha }}') {
throw 'v1.0.1 does not point to the checked-out release commit.'
throw 'v1.0.2 does not point to the checked-out release commit.'
}
if (-not [string]::IsNullOrWhiteSpace((git status --porcelain))) {
throw 'The release checkout is not clean.'
Expand Down Expand Up @@ -120,15 +120,15 @@ jobs:
-PackagePath $env:WINTERM_UNSIGNED_X64_PACKAGE `
-OutputDirectory $output `
-ReleaseAsset
"WINTERM_X64_PACKAGE=$(Join-Path $output 'winTerm-1.0.1-x64.msix')" >> $env:GITHUB_ENV
"WINTERM_PUBLIC_CERTIFICATE=$(Join-Path $output 'winTerm-1.0.1.cer')" >> $env:GITHUB_ENV
"WINTERM_X64_PACKAGE=$(Join-Path $output 'winTerm-1.0.2-x64.msix')" >> $env:GITHUB_ENV
"WINTERM_PUBLIC_CERTIFICATE=$(Join-Path $output 'winTerm-1.0.2.cer')" >> $env:GITHUB_ENV
"WINTERM_INSTALL_INSTRUCTIONS=$(Join-Path $output 'INSTALL.txt')" >> $env:GITHUB_ENV

- name: Generate allowlisted release assets, SBOMs, symbols, and checksums
shell: pwsh
run: |
.\scripts\winterm\generate-release-artifacts.ps1 `
-Version '1.0.1' `
-Version '1.0.2' `
-X64PackagePath $env:WINTERM_X64_PACKAGE `
-CertificatePath $env:WINTERM_PUBLIC_CERTIFICATE `
-InstallationInstructionsPath $env:WINTERM_INSTALL_INSTRUCTIONS `
Expand Down Expand Up @@ -160,34 +160,34 @@ jobs:
env:
GH_TOKEN: ${{ github.token }}
run: |
gh release view v1.0.1 --repo '${{ github.repository }}' *> $null
gh release view v1.0.2 --repo '${{ github.repository }}' *> $null
if ($LASTEXITCODE -eq 0) {
throw 'A v1.0.1 Release already exists. This workflow never replaces or clobbers Release assets.'
throw 'A v1.0.2 Release already exists. This workflow never replaces or clobbers Release assets.'
}

$notesPath = Join-Path $env:RUNNER_TEMP 'winTerm-1.0.1-release-notes.md'
Copy-Item -LiteralPath 'docs\releases\1.0.1.md' -Destination $notesPath
$notesPath = Join-Path $env:RUNNER_TEMP 'winTerm-1.0.2-release-notes.md'
Copy-Item -LiteralPath 'docs\releases\1.0.2.md' -Destination $notesPath
Add-Content -LiteralPath $notesPath -Value @'

> **Self-signed installer:** download `winTerm-1.0.1-x64.msix`, `winTerm-1.0.1.cer`, `INSTALL.txt`, and `SHA256SUMS.txt`. Windows does not trust this certificate by default. Verify the hashes and repository URL before importing the certificate into Trusted People.
> **Self-signed installer:** download `winTerm-1.0.2-x64.msix`, `winTerm-1.0.2.cer`, `INSTALL.txt`, and `SHA256SUMS.txt`. Windows does not trust this certificate by default. Verify the hashes and repository URL before importing the certificate into Trusted People.
'@

$assets = @(
'artifacts\release\winTerm-1.0.1-x64.msix',
'artifacts\release\winTerm-1.0.1.cer',
'artifacts\release\winTerm-1.0.2-x64.msix',
'artifacts\release\winTerm-1.0.2.cer',
'artifacts\release\INSTALL.txt',
'artifacts\release\SHA256SUMS.txt',
'artifacts\release\THIRD_PARTY_NOTICES.md',
'artifacts\release\SBOM.spdx.json',
'artifacts\release\SBOM.cyclonedx.json',
'artifacts\release\release-metadata.json',
'artifacts\release\winTerm-1.0.1-symbols.zip',
'artifacts\release\winTerm-1.0.1-release-notes.md'
'artifacts\release\winTerm-1.0.2-symbols.zip',
'artifacts\release\winTerm-1.0.2-release-notes.md'
)
gh release create v1.0.1 @assets `
gh release create v1.0.2 @assets `
--repo '${{ github.repository }}' `
--verify-tag `
--title 'winTerm 1.0.1' `
--title 'winTerm 1.0.2' `
--notes-file $notesPath `
--draft
if ($LASTEXITCODE -ne 0) {
Expand All @@ -201,7 +201,7 @@ jobs:
run: |
$verificationDirectory = Join-Path $env:RUNNER_TEMP 'winterm-draft-download'
New-Item -ItemType Directory -Path $verificationDirectory | Out-Null
gh release download v1.0.1 --repo '${{ github.repository }}' --dir $verificationDirectory
gh release download v1.0.2 --repo '${{ github.repository }}' --dir $verificationDirectory
if ($LASTEXITCODE -ne 0) {
throw 'Draft Release asset download failed.'
}
Expand All @@ -211,12 +211,12 @@ jobs:
-Architecture x64 `
-RequireSelfSigned `
-ExpectedPublisher $env:WINTERM_PUBLISHER
gh attestation verify (Join-Path $verificationDirectory 'winTerm-1.0.1-x64.msix') --repo '${{ github.repository }}'
gh attestation verify (Join-Path $verificationDirectory 'winTerm-1.0.2-x64.msix') --repo '${{ github.repository }}'
if ($LASTEXITCODE -ne 0) {
throw 'Artifact attestation verification failed.'
}
$release = gh release view v1.0.1 --repo '${{ github.repository }}' --json tagName,name,isDraft,isPrerelease,url | ConvertFrom-Json
if ($release.tagName -ne 'v1.0.1' -or $release.name -ne 'winTerm 1.0.1' -or -not $release.isDraft -or $release.isPrerelease) {
$release = gh release view v1.0.2 --repo '${{ github.repository }}' --json tagName,name,isDraft,isPrerelease,url | ConvertFrom-Json
if ($release.tagName -ne 'v1.0.2' -or $release.name -ne 'winTerm 1.0.2' -or -not $release.isDraft -or $release.isPrerelease) {
throw 'Draft Release state verification failed.'
}

Expand All @@ -225,16 +225,16 @@ jobs:
env:
GH_TOKEN: ${{ github.token }}
run: |
gh release edit v1.0.1 `
gh release edit v1.0.2 `
--repo '${{ github.repository }}' `
--draft=false `
--prerelease=false `
--latest
if ($LASTEXITCODE -ne 0) {
throw 'GitHub Release publication failed.'
}
$release = gh release view v1.0.1 --repo '${{ github.repository }}' --json tagName,name,isDraft,isPrerelease,assets,url | ConvertFrom-Json
if ($release.isDraft -or $release.isPrerelease -or $release.tagName -ne 'v1.0.1') {
$release = gh release view v1.0.2 --repo '${{ github.repository }}' --json tagName,name,isDraft,isPrerelease,assets,url | ConvertFrom-Json
if ($release.isDraft -or $release.isPrerelease -or $release.tagName -ne 'v1.0.2') {
throw 'Published Release state verification failed.'
}
"Published Release URL: $($release.url)" >> $env:GITHUB_STEP_SUMMARY
Expand All @@ -246,7 +246,7 @@ jobs:
run: |
$publicDirectory = Join-Path $env:RUNNER_TEMP 'winterm-public-download'
New-Item -ItemType Directory -Path $publicDirectory | Out-Null
gh release download v1.0.1 --repo '${{ github.repository }}' --dir $publicDirectory
gh release download v1.0.2 --repo '${{ github.repository }}' --dir $publicDirectory
if ($LASTEXITCODE -ne 0) {
throw 'Public Release asset download failed.'
}
Expand All @@ -256,7 +256,7 @@ jobs:
-Architecture x64 `
-RequireSelfSigned `
-ExpectedPublisher $env:WINTERM_PUBLISHER
gh attestation verify (Join-Path $publicDirectory 'winTerm-1.0.1-x64.msix') --repo '${{ github.repository }}'
gh attestation verify (Join-Path $publicDirectory 'winTerm-1.0.2-x64.msix') --repo '${{ github.repository }}'
if ($LASTEXITCODE -ne 0) {
throw 'Public artifact attestation verification failed.'
}
Expand Down
24 changes: 12 additions & 12 deletions .github/workflows/winget.yml
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ permissions:
jobs:
validate:
name: Generate and validate public-release manifests
if: github.event_name == 'workflow_dispatch' || github.event.release.tag_name == 'v1.0.1'
if: github.event_name == 'workflow_dispatch' || github.event.release.tag_name == 'v1.0.2'
runs-on: windows-2022
timeout-minutes: 20
steps:
Expand All @@ -26,41 +26,41 @@ jobs:
env:
GH_TOKEN: ${{ github.token }}
run: |
$release = gh release view v1.0.1 --repo '${{ github.repository }}' --json tagName,isDraft,isPrerelease,url,assets | ConvertFrom-Json
if ($release.tagName -ne 'v1.0.1' -or $release.isDraft -or $release.isPrerelease) {
throw 'WinGet manifests may be generated only from the public stable v1.0.1 Release.'
$release = gh release view v1.0.2 --repo '${{ github.repository }}' --json tagName,isDraft,isPrerelease,url,assets | ConvertFrom-Json
if ($release.tagName -ne 'v1.0.2' -or $release.isDraft -or $release.isPrerelease) {
throw 'WinGet manifests may be generated only from the public stable v1.0.2 Release.'
}
$asset = @($release.assets | Where-Object { $_.name -eq 'winTerm-1.0.1-x64.msix' })
$asset = @($release.assets | Where-Object { $_.name -eq 'winTerm-1.0.2-x64.msix' })
if ($asset.Count -ne 1) {
throw 'The public Release does not contain exactly one x64 installer.'
}

$downloadDirectory = Join-Path $env:RUNNER_TEMP 'winterm-winget-source'
New-Item -ItemType Directory -Path $downloadDirectory | Out-Null
gh release download v1.0.1 --repo '${{ github.repository }}' --pattern 'winTerm-1.0.1-x64.msix' --dir $downloadDirectory
gh release download v1.0.2 --repo '${{ github.repository }}' --pattern 'winTerm-1.0.2-x64.msix' --dir $downloadDirectory
if ($LASTEXITCODE -ne 0) {
throw 'Public installer download failed.'
}
$packagePath = Join-Path $downloadDirectory 'winTerm-1.0.1-x64.msix'
$packagePath = Join-Path $downloadDirectory 'winTerm-1.0.2-x64.msix'
$sha = (Get-FileHash -LiteralPath $packagePath -Algorithm SHA256).Hash
$url = 'https://github.com/${{ github.repository }}/releases/download/v1.0.1/winTerm-1.0.1-x64.msix'
$url = 'https://github.com/${{ github.repository }}/releases/download/v1.0.2/winTerm-1.0.2-x64.msix'
.\scripts\winterm\generate-winget-manifests.ps1 `
-InstallerUrl $url `
-InstallerSha256 $sha `
-OutputDirectory 'packaging\winget\1.0.1'
-OutputDirectory 'packaging\winget\1.0.2'

- name: Validate WinGet manifests
shell: pwsh
run: |
winget validate 'packaging\winget\1.0.1'
winget validate 'packaging\winget\1.0.2'
if ($LASTEXITCODE -ne 0) {
throw 'winget validate failed.'
}

- name: Upload the validated manifest set for manual submission
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: HelloThisWorld.winTerm-1.0.1-winget
path: packaging/winget/1.0.1
name: HelloThisWorld.winTerm-1.0.2-winget
path: packaging/winget/1.0.2
if-no-files-found: error
retention-days: 30
23 changes: 23 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,28 @@
# Changelog

## 1.0.2 - Stable

### Fixed

- Reserved `Ctrl+C` for interrupting the foreground terminal process, including Python development servers and other long-running commands.
- Migrated the legacy generated `Ctrl+C` copy binding out of existing user settings while preserving `Ctrl+Shift+C` for copying selected text.
- Added regression coverage for the default right-click workflow: copy and clear an active selection, then paste when no selection remains.

### Documentation

- Added detailed keyboard, mouse, clipboard, paste-warning, and VT mouse-reporting instructions to the README.
- Updated clipboard documentation to match the integrated runtime behavior and its current safety boundaries.

### Security

- The Release continues to publish a self-signed x64 MSIX, public CER, installation instructions, checksums, notices, SBOMs, symbols, and provenance from the exact immutable `v1.0.2` commit.
- Existing `v1.0.1` assets are not replaced or modified.

### Known issues

- The installer is self-signed, is not publicly trusted or timestamped, and requires administrators to import the attached CER into Trusted People.
- ARM64 and Windows 10 are not supported by this Release.

## 1.0.1 - Stable

### Changed
Expand Down
Loading