chore: prepare 0.5.0 Linux and Windows release

This commit is contained in:
2026-10-25 23:00:45 +03:00
parent a65867fc39
commit d2d9fcd09e
7 changed files with 86 additions and 23 deletions
+2 -2
View File
@@ -1,12 +1,12 @@
name: Linux desktop release name: Linux desktop release
# Manual until a native Linux runner is registered. The current 0.4.0 # Manual until a native Linux runner is registered. The current 0.5.0
# packages are built locally using the identical gates documented below. # packages are built locally using the identical gates documented below.
on: on:
workflow_dispatch: workflow_dispatch:
inputs: inputs:
tag: tag:
description: Existing stable version tag to package (for example v0.4.0) description: Existing stable version tag to package (for example v0.5.0)
required: true required: true
type: string type: string
+1 -1
View File
@@ -1,6 +1,6 @@
# Desktop builds and releases # Desktop builds and releases
For this fork’s Linux and Windows 0.4.0 release on Gitea, see [Gitea releases](gitea-release.md). For this fork’s Linux and Windows 0.5.0 release on Gitea, see [Gitea releases](gitea-release.md).
The three-platform GitHub process below documents the upstream reference. The three-platform GitHub process below documents the upstream reference.
## Platforms ## Platforms
+17 -16
View File
@@ -2,7 +2,7 @@
The release destination is The release destination is
https://server2.sorokin-oleg-edu.xyz/replicated/learnharness. https://server2.sorokin-oleg-edu.xyz/replicated/learnharness.
Version **0.4.0 targets Linux x64 and Windows x64**, with each platform built Version **0.5.0 targets Linux x64 and Windows x64**, with each platform built
and verified on its native operating system. The upstream GitHub workflow and three-platform packaging and verified on its native operating system. The upstream GitHub workflow and three-platform packaging
configuration remain available as reference in `.github/workflows/release.yml` configuration remain available as reference in `.github/workflows/release.yml`
and `electron-builder.yml`. and `electron-builder.yml`.
@@ -48,18 +48,19 @@ node scripts/smoke-provider-runtime.mjs --standalone dist/linux-unpacked/resourc
xvfb-run -a node scripts/smoke-demo-runtime.mjs --standalone dist/linux-unpacked/resources/server/standalone --runtime dist/linux-unpacked/learnharness --browser xvfb-run -a node scripts/smoke-demo-runtime.mjs --standalone dist/linux-unpacked/resources/server/standalone --runtime dist/linux-unpacked/learnharness --browser
``` ```
The Linux portion of 0.4.0 has these attachments: The Linux portion of 0.5.0 has these attachments:
- `LearnHarness-0.4.0-x86_64.AppImage` - `LearnHarness-0.5.0-x86_64.AppImage`
- `LearnHarness-0.4.0-amd64.deb` - `LearnHarness-0.5.0-amd64.deb`
- `latest-linux.yml` - `latest-linux.yml`
- `SHA256SUMS` - `SHA256SUMS`
## Preparing Windows packages ## Preparing Windows packages
Use a clean checkout of the same `v0.4.0` tag on Windows x64 with Node 26 and Git Use a clean checkout of the same `v0.5.0` tag on Windows x64 with Node 26 and Git
for Windows. Keep build tools and logs outside the checkout. The local Windows for Windows. Keep build tools and logs outside the checkout. The Windows
checkout used for this release is `~/Documents/Gitea/learnharness`. release checkout is `~/Documents/Gitea/learnharness-release-0.5.0`, linked to the
existing repository in `~/Documents/Gitea/learnharness`.
In PowerShell, stop after any failed command: In PowerShell, stop after any failed command:
@@ -84,13 +85,13 @@ node scripts/smoke-demo-runtime.mjs --standalone dist/win-unpacked/resources/ser
Windows contributes three attachments: Windows contributes three attachments:
- `LearnHarness-0.4.0-x64-setup.exe` - `LearnHarness-0.5.0-x64-setup.exe`
- `LearnHarness-0.4.0-x64-setup.exe.blockmap` - `LearnHarness-0.5.0-x64-setup.exe.blockmap`
- `latest.yml` - `latest.yml`
The combined release has **seven attachments**, including one `SHA256SUMS` The combined release has **seven attachments**, including one `SHA256SUMS`
covering all six other files. Verify that `latest.yml` names the Windows covering all six other files. Verify that `latest.yml` names the Windows
installer exactly, reports version `0.4.0`, and matches the installer's actual installer exactly, reports version `0.5.0`, and matches the installer's actual
size and SHA-512. Its gzip blockmap must cover the installer and match every size and SHA-512. Its gzip blockmap must cover the installer and match every
block checksum. Confirm the packaged `resources/app-update.yml` uses the Gitea block checksum. Confirm the packaged `resources/app-update.yml` uses the Gitea
generic provider. Windows builds follow upstream's unsigned, per-user installer generic provider. Windows builds follow upstream's unsigned, per-user installer
@@ -101,8 +102,8 @@ configuration.
Commit and push the release source, then push its exact annotated tag: Commit and push the release source, then push its exact annotated tag:
```sh ```sh
git tag -a v0.4.0 -m 'LearnHarness 0.4.0' git tag -a v0.5.0 -m 'LearnHarness 0.5.0'
git push gitea main v0.4.0 git push gitea main v0.5.0
``` ```
Supply `GITEA_TOKEN` only to the upload command. A token file may remain outside Supply `GITEA_TOKEN` only to the upload command. A token file may remain outside
@@ -116,10 +117,10 @@ The tool requires the tag to exist in Gitea, creates or reuses one draft at that
tag, uploads missing assets, and downloads every attachment to verify its actual tag, uploads missing assets, and downloads every attachment to verify its actual
SHA-256 against the local verified build. Existing mismatched attachments and SHA-256 against the local verified build. Existing mismatched attachments and
published releases are refused. It never publishes or changes repository published releases are refused. It never publishes or changes repository
visibility. Release notes come from `docs/release-0.4.0.md`. visibility. Release notes come from `docs/release-0.5.0.md`.
This uploader and its remote verifier enforce a **Linux-only** inventory. They This uploader and its remote verifier enforce a **Linux-only** inventory. They
will refuse a combined Linux/Windows draft. For the combined 0.4.0 release, add will refuse a combined Linux/Windows draft. For the combined 0.5.0 release, add
the verified Windows attachments to the existing draft and replace `SHA256SUMS` the verified Windows attachments to the existing draft and replace `SHA256SUMS`
with the combined manifest. Keep the Linux installers and feed unchanged. Check with the combined manifest. Keep the Linux installers and feed unchanged. Check
all seven attachment names, sizes, and actual downloaded hashes against the all seven attachment names, sizes, and actual downloaded hashes against the
@@ -141,12 +142,12 @@ public `latest` feed and in-app automatic updates expose this version.
workflow with an existing release tag as input. It requires a native Linux x64 workflow with an existing release tag as input. It requires a native Linux x64
runner labeled `ubuntu-24.04`, the label used by upstream's Linux release job, runner labeled `ubuntu-24.04`, the label used by upstream's Linux release job,
plus the native Electron dependencies and `xvfb-run`. There were no runners plus the native Electron dependencies and `xvfb-run`. There were no runners
registered when 0.4.0 was prepared, so its packages are built locally. A tag push registered when 0.5.0 was prepared, so its packages are built locally. A tag push
does not queue a job that cannot run. does not queue a job that cannot run.
The workflow uses the repository's ephemeral `GITEA_TOKEN` with release-write The workflow uses the repository's ephemeral `GITEA_TOKEN` with release-write
permission only in the final upload step. It checks out the requested tag without permission only in the final upload step. It checks out the requested tag without
persisting credentials and leaves the result as a verified draft. Public pull persisting credentials and leaves the result as a verified draft. Public pull
requests cannot trigger this publishing workflow. This workflow remains requests cannot trigger this publishing workflow. This workflow remains
Linux-only; the combined 0.4.0 draft was assembled from local native builds. Linux-only; the combined 0.5.0 draft was assembled from local native builds.
Windows has its own standalone payload and smoke checks, as described above. Windows has its own standalone payload and smoke checks, as described above.
+62
View File
@@ -0,0 +1,62 @@
# LearnHarness 0.5.0
## English
This release adds ChatGPT Fast mode and improves the language controls and
Russian settings layout introduced in 0.4.0.
- Interface-language and speech-recognition selectors in **Settings → General**,
plus the quick selector beside the microphone, now use the app's styled menus.
The menus include selected-item checkmarks and keyboard navigation; Escape
closes the menu and restores focus to its trigger. Language preferences stay
independent, and STT selection remains locked while recording.
- **Quizzing** keeps its full Russian labels. The label and segmented control
share a row when space permits. Narrower panels stack the control beneath the
hint with matching left alignment and enough height for wrapped text.
- **Settings → Agent** now has a **⚡ Fast** toggle for each Strong, Cheap, and
Vision model tier. Fast mode is **off by default** and initially available only
for **ChatGPT** connections. It requests priority processing and may consume
more ChatGPT plan allowance; availability depends on the model and account.
- Fast preferences take effect on the **next request**, including existing
ChatGPT conversations and newly started background work in the corresponding
tier. The selected model and reasoning effort are preserved. Selecting another
provider turns Fast off for that tier; other providers show it as unavailable.
- Unsupported Fast requests produce actionable, localized errors. Connections
keep their existing account, background-consent, and no-API-key-fallback rules.
Packages: **Linux x64** AppImage and Debian, and a **Windows x64** installer.
Both platforms use this fork's public Gitea releases for automatic updates.
Windows packaging remains unsigned, matching upstream.
## Русский
В этом выпуске добавлен быстрый режим ChatGPT и улучшены языковые настройки
и их отображение на русском языке, появившиеся в версии 0.4.0.
- Выбор языка интерфейса и распознавания речи в разделе **Настройки → Общие**,
а также быстрый выбор языка рядом с микрофоном теперь используют меню в стиле
приложения. Выбранный пункт отмечен галочкой, поддерживается управление
клавиатурой. Escape закрывает меню и возвращает фокус на кнопку. Языковые
настройки остаются независимыми; язык распознавания нельзя менять во время
записи.
- В разделе **Проверка понимания** сохранены полные русские подписи. Если места
достаточно, заголовок и переключатель расположены в одной строке. В узких
панелях переключатель размещается под пояснением с выравниванием по левому
краю; высота кнопок учитывает перенос текста.
- В разделе **Настройки → Агент** появился переключатель **⚡ Быстро** для каждого
уровня моделей: основной, экономичной и с поддержкой изображений. Быстрый
режим **отключён по умолчанию** и пока доступен только для подключений
**ChatGPT**. Он запрашивает приоритетную обработку и может быстрее расходовать
лимит ChatGPT. Доступность зависит от модели и учётной записи.
- Настройка применяется к **следующему запросу**, в том числе в существующих
занятиях с ChatGPT и в новых фоновых задачах соответствующего уровня.
Выбранная модель и уровень рассуждений сохраняются. При выборе другого
провайдера быстрый режим для этого уровня отключается; для остальных
провайдеров переключатель недоступен.
- Если быстрый режим не поддерживается, приложение показывает понятную ошибку
на выбранном языке. Сохраняются выбранная учётная запись, разрешения на
фоновую работу и запрет автоматического перехода на API-ключ.
Пакеты: AppImage и Debian для **Linux x64**, установщик для **Windows x64**.
Обе версии используют публичные выпуски этого форка в Gitea для автоматических
обновлений. Установщик Windows не подписан, как и в исходном проекте.
+2 -2
View File
@@ -1,12 +1,12 @@
{ {
"name": "learnharness", "name": "learnharness",
"version": "0.4.0", "version": "0.5.0",
"lockfileVersion": 3, "lockfileVersion": 3,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "learnharness", "name": "learnharness",
"version": "0.4.0", "version": "0.5.0",
"license": "AGPL-3.0-only", "license": "AGPL-3.0-only",
"dependencies": { "dependencies": {
"@earendil-works/pi-agent-core": "1.4.0", "@earendil-works/pi-agent-core": "1.4.0",
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "learnharness", "name": "learnharness",
"version": "0.4.0", "version": "0.5.0",
"license": "AGPL-3.0-only", "license": "AGPL-3.0-only",
"author": { "author": {
"name": "Amos Blomqvist", "name": "Amos Blomqvist",
+1 -1
View File
@@ -74,7 +74,7 @@ export async function verifyLocal(directory, version) {
/** The downloaded bytes, not only API-reported sizes, must agree with the local verified package. */ /** The downloaded bytes, not only API-reported sizes, must agree with the local verified package. */
export async function verifyRemote(release, localInventory, headers = {}, request = fetch) { export async function verifyRemote(release, localInventory, headers = {}, request = fetch) {
assert.equal(release.draft, true, "only a draft may be prepared or verified by this tool"); assert.equal(release.draft, true, "only a draft may be prepared or verified by this tool");
assert.equal(release.prerelease, false, "0.4.0 is a stable release"); assert.equal(release.prerelease, false, "release must be stable");
assert.deepEqual(release.assets.map((asset) => asset.name).sort(), localInventory.map((asset) => asset.name).sort(), "remote draft has missing, duplicate, or unexpected assets"); assert.deepEqual(release.assets.map((asset) => asset.name).sort(), localInventory.map((asset) => asset.name).sort(), "remote draft has missing, duplicate, or unexpected assets");
const temporary = await fsp.mkdtemp(path.join(os.tmpdir(), "lh-release-verify-")); const temporary = await fsp.mkdtemp(path.join(os.tmpdir(), "lh-release-verify-"));
try { try {