From 1edce7608ac25a137ca6491112a69d16767d000b Mon Sep 17 00:00:00 2001 From: BeaCox Date: Sat, 29 Aug 2026 01:24:51 +0800 Subject: [PATCH] Prepare stable v0.1.0 release --- CHANGELOG.md | 14 +++++------ Cargo.lock | 12 +++++----- Cargo.toml | 2 +- docs/README.md | 2 +- .../releases/{v0.1.0-alpha.1.md => v0.1.0.md} | 24 +++++++++---------- package.json | 2 +- src-tauri/src/app_updates.rs | 4 ++-- src-tauri/tauri.conf.json | 2 +- src/App.test.tsx | 8 +++---- src/api.ts | 4 ++-- 10 files changed, 37 insertions(+), 37 deletions(-) rename docs/releases/{v0.1.0-alpha.1.md => v0.1.0.md} (65%) diff --git a/CHANGELOG.md b/CHANGELOG.md index aa06496..5c90526 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,9 +4,9 @@ All notable CleanerX changes are recorded here. CleanerX follows Semantic Versio ## [Unreleased] -## [0.1.0-alpha.1] - 2026-08-28 +## [0.1.0] - 2026-08-29 -Initial engineering-preview release for bounded cross-platform and Agent compatibility testing. +Initial public release for bounded cross-platform and Agent compatibility. ### Added @@ -27,14 +27,14 @@ Initial engineering-preview release for bounded cross-platform and Agent compati ### Known limitations -- This is an unsigned, non-notarized alpha. Gatekeeper and Windows SmartScreen may warn because operating-system publisher identity is not established. +- This is an unsigned, non-notarized release. Gatekeeper and Windows SmartScreen may warn because operating-system publisher identity is not established. - Codex session deletion and global memory reset are irreversible because Codex exposes no supported import route. - Orphaned Codex media is inspect-only; session-owned media is removed only after the owning official session deletion succeeds. - Agent and storage compatibility is capability-gated, not guaranteed for every historical or future Agent version. -- The stable updater feed excludes GitHub prereleases, so `v0.1.0-alpha.1` is installed manually and is not offered by CleanerX's in-app update check. +- This stable release is eligible for CleanerX's manual in-app update checks; checks never run at startup or on a timer. - Linux in-app updates support AppImage only; `.deb` installations update through their original distribution channel or a manual release download. - The latest Tauri Linux GTK3 dependency chain includes `glib 0.18.5`, which has the open `RUSTSEC-2024-0429`/`GHSA-wrw7-89jp-8q8g` `VariantStrIter` unsoundness advisory. No affected call site was found in CleanerX or the downloaded dependency sources, and the alert remains open rather than dismissed. -- Broader native disposable mutation/restore cycles, accessibility acceptance, and external pilot evidence remain prerequisites for `v0.1.0`. +- Broader native disposable mutation/restore cycles, accessibility acceptance, and external pilot evidence remain publication checks in the release checklist. -[Unreleased]: https://github.com/BeaCox/CleanerX/compare/v0.1.0-alpha.1...HEAD -[0.1.0-alpha.1]: https://github.com/BeaCox/CleanerX/releases/tag/v0.1.0-alpha.1 +[Unreleased]: https://github.com/BeaCox/CleanerX/compare/v0.1.0...HEAD +[0.1.0]: https://github.com/BeaCox/CleanerX/releases/tag/v0.1.0 diff --git a/Cargo.lock b/Cargo.lock index 271cf1b..502e9d2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4,7 +4,7 @@ version = 4 [[package]] name = "adapter-claude" -version = "0.1.0-alpha.1" +version = "0.1.0" dependencies = [ "async-trait", "chrono", @@ -20,7 +20,7 @@ dependencies = [ [[package]] name = "adapter-codex" -version = "0.1.0-alpha.1" +version = "0.1.0" dependencies = [ "async-trait", "base64 0.22.1", @@ -42,7 +42,7 @@ dependencies = [ [[package]] name = "adapter-opencode" -version = "0.1.0-alpha.1" +version = "0.1.0" dependencies = [ "async-trait", "chrono", @@ -59,7 +59,7 @@ dependencies = [ [[package]] name = "adapter-pi" -version = "0.1.0-alpha.1" +version = "0.1.0" dependencies = [ "async-trait", "chrono", @@ -740,7 +740,7 @@ dependencies = [ [[package]] name = "cleanerx-app" -version = "0.1.0-alpha.1" +version = "0.1.0" dependencies = [ "adapter-claude", "adapter-codex", @@ -763,7 +763,7 @@ dependencies = [ [[package]] name = "cleanerx-core" -version = "0.1.0-alpha.1" +version = "0.1.0" dependencies = [ "age", "anyhow", diff --git a/Cargo.toml b/Cargo.toml index d62ab2b..4f96796 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,7 +10,7 @@ members = [ resolver = "2" [workspace.package] -version = "0.1.0-alpha.1" +version = "0.1.0" edition = "2024" license = "Apache-2.0" authors = ["BeaCox"] diff --git a/docs/README.md b/docs/README.md index 72b9ae3..9b02710 100644 --- a/docs/README.md +++ b/docs/README.md @@ -13,7 +13,7 @@ This directory contains the detailed product, compatibility, architecture, and r | what remains unfinished and what blocks a supported release | [Development roadmap](roadmap.md) | | how source preview, alpha, beta, unsigned artifacts, and `v0.1.0` are gated | [Open-source release policy](open-source-release-plan.md) | | how application update checks, signatures, platform packages, and release feeds work | [Application update strategy](update-strategy.md) | -| what changed in the first alpha and which release checks remain | [`v0.1.0-alpha.1` release checklist](releases/v0.1.0-alpha.1.md) and the [changelog](../CHANGELOG.md) | +| what changed in the first release and which release checks remain | [`v0.1.0` release checklist](releases/v0.1.0.md) and the [changelog](../CHANGELOG.md) | | the security boundary or how to report a vulnerability | [Security policy](../SECURITY.md) | | how to prepare and verify a contribution | [Contributor guide](../CONTRIBUTING.md) | | repository-wide constraints for coding agents | [Agent instructions](../AGENTS.md) | diff --git a/docs/releases/v0.1.0-alpha.1.md b/docs/releases/v0.1.0.md similarity index 65% rename from docs/releases/v0.1.0-alpha.1.md rename to docs/releases/v0.1.0.md index 6174875..2d1d6bc 100644 --- a/docs/releases/v0.1.0-alpha.1.md +++ b/docs/releases/v0.1.0.md @@ -1,16 +1,16 @@ -# `v0.1.0-alpha.1` release checklist +# `v0.1.0` release checklist Status: pre-tag preparation -Release type: unsigned engineering-preview prerelease +Release type: unsigned initial stable release -This checklist is the evidence record for the first CleanerX alpha. Do not publish the draft GitHub Release until every applicable item below is complete. Items that require tagged artifacts remain intentionally unchecked until the release workflow creates the draft. +This checklist is the evidence record for the first CleanerX release. Do not publish the draft GitHub Release until every applicable item below is complete. Items that require tagged artifacts remain intentionally unchecked until the release workflow creates the draft. ## Scope and identity - [x] The maintainer confirmed that the repository history, author identity, branding, and bundled image assets may be public. -- [x] The release is named `v0.1.0-alpha.1` and is presented as an engineering-preview prerelease, not the supported `v0.1.0` milestone. -- [x] Cargo workspace, frontend package, Tauri configuration, mock update status, and version-facing tests use `0.1.0-alpha.1`. +- [x] The release is named `v0.1.0` and is not presented as a prerelease; publication still requires every remaining gate below. +- [x] Cargo workspace, frontend package, Tauri configuration, mock update status, and version-facing tests use `0.1.0`. - [x] The updater public key is committed; `TAURI_SIGNING_PRIVATE_KEY` is configured as a GitHub Actions secret and is absent from the repository. - [x] The changelog records the user-visible scope, irreversible operations, updater boundary, and known limitations. @@ -38,8 +38,8 @@ This checklist is the evidence record for the first CleanerX alpha. Do not publi - [ ] Product CI reruns successfully from the exact tag. - [ ] macOS arm64, macOS x86_64, Linux x86_64, and Windows x86_64 release builds succeed. - [ ] Every expected manual installer, updater payload, `.sig`, `latest.json`, lockfile archive, build-metadata file, and checksum file appears exactly once in the draft. -- [ ] `latest.json` contains version `0.1.0-alpha.1`, the four intended updater targets, HTTPS URLs for the exact tag, and non-empty signatures. -- [ ] Every staged asset matches `CleanerX_0.1.0-alpha.1_SHA256SUMS.txt`. +- [ ] `latest.json` contains version `0.1.0`, the four intended updater targets, HTTPS URLs for the exact tag, and non-empty signatures. +- [ ] Every staged asset matches `CleanerX_0.1.0_SHA256SUMS.txt`. - [ ] Bundles contain no development URL, private absolute path, local preference, real Agent data, journal, backup archive, signing private key, or backup identity. ## Native draft verification @@ -47,19 +47,19 @@ This checklist is the evidence record for the first CleanerX alpha. Do not publi - [ ] Both macOS architecture artifacts launch on a clean supported system; Finder **Open** or System Settings approval is sufficient without disabling Gatekeeper. - [ ] The Linux AppImage and `.deb` launch on a clean supported environment; the AppImage updater path and `.deb` manual-update explanation are correct. - [ ] The Windows MSI and NSIS installers launch on Windows 10/11; SmartScreen disclosure and the passive NSIS updater path are correct. -- [ ] The MSI metadata uses numeric surrogate version `0.0.65535.10001`, while the application, NSIS installer, updater manifest, and release filenames retain `0.1.0-alpha.1`. +- [ ] The MSI metadata, application, NSIS installer, updater manifest, and release filenames all retain stable version `0.1.0`. - [ ] Read-only scan, bounded detail loading, review dialog, backup listing, settings persistence, and explicit read-only degradation are exercised on packaged builds. - [ ] Disposable Agent homes complete the applicable cleanup, optional backup, restore, interruption, and post-operation verification cycles without changing protected fixtures or source trees. -- [ ] Keyboard navigation, visible focus, Chinese and English, light and dark system themes, and reduced-motion behavior receive an alpha acceptance pass. +- [ ] Keyboard navigation, visible focus, Chinese and English, light and dark system themes, and reduced-motion behavior receive an initial-release acceptance pass. - [ ] A tampered updater payload or signature is rejected, no check occurs at startup or on a timer, and installation still requires separate check and install actions. ## Publication approval -- [ ] Release notes lead with alpha status, irreversible-deletion risk, unsigned/not-notarized status, compatibility limits, and checksum-versus-publisher-identity guidance. +- [ ] Release notes lead with irreversible-deletion risk, unsigned/not-notarized status, compatibility limits, and checksum-versus-publisher-identity guidance. - [ ] Release notes link the changelog, compatibility matrix, security policy, exact source commit, and this checklist. - [ ] Remaining observations are either documented limitations or release blockers with the affected mutation capability disabled. -- [ ] A maintainer has reviewed the complete draft and changed it from Draft to Pre-release. +- [ ] A maintainer has reviewed the complete draft and published it as the stable release. ## Current dependency-audit notes -The pre-release Rust dependency review must explicitly revisit the Tauri Linux dependency chain. The release-preparation RustSec run reported zero vulnerability-classified advisories, sixteen unmaintained transitive crates, and the `glib 0.18.5` unsoundness warning `RUSTSEC-2024-0429` (`GHSA-wrw7-89jp-8q8g`). GitHub reports that unsoundness advisory as one open moderate Dependabot alert. It affects `VariantStrIter`; no CleanerX or downloaded dependency source call site was found, but the current latest Tauri `2.11.5` Linux GTK3 chain still requires `glib 0.18.5`, while the advisory is patched in `glib 0.20.0`. The alert has not been dismissed. It does not widen CleanerX's cleanup allowlists, but it remains tracked release risk and must not be described as a clean warning-free audit. +The release Rust dependency review must explicitly revisit the Tauri Linux dependency chain. The release-preparation RustSec run reported zero vulnerability-classified advisories, sixteen unmaintained transitive crates, and the `glib 0.18.5` unsoundness warning `RUSTSEC-2024-0429` (`GHSA-wrw7-89jp-8q8g`). GitHub reports that unsoundness advisory as one open moderate Dependabot alert. It affects `VariantStrIter`; no CleanerX or downloaded dependency source call site was found, but the current latest Tauri `2.11.5` Linux GTK3 chain still requires `glib 0.18.5`, while the advisory is patched in `glib 0.20.0`. The alert has not been dismissed. It does not widen CleanerX's cleanup allowlists, but it remains tracked release risk and must not be described as a clean warning-free audit. diff --git a/package.json b/package.json index 1db20a6..ee05843 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "cleanerx", "private": true, - "version": "0.1.0-alpha.1", + "version": "0.1.0", "author": "BeaCox", "type": "module", "scripts": { diff --git a/src-tauri/src/app_updates.rs b/src-tauri/src/app_updates.rs index 5a2e977..5ae6c0e 100644 --- a/src-tauri/src/app_updates.rs +++ b/src-tauri/src/app_updates.rs @@ -197,8 +197,8 @@ mod tests { #[test] fn local_status_does_not_claim_that_a_network_check_ran() { - let status = status_for("0.1.0-alpha.1".into(), AppUpdateSupport::Available, None); - assert_eq!(status.current_version, "0.1.0-alpha.1"); + let status = status_for("0.1.0".into(), AppUpdateSupport::Available, None); + assert_eq!(status.current_version, "0.1.0"); assert_eq!(status.support, AppUpdateSupport::Available); assert!(status.update.is_none()); } diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json index 12410bf..999a893 100644 --- a/src-tauri/tauri.conf.json +++ b/src-tauri/tauri.conf.json @@ -1,7 +1,7 @@ { "$schema": "https://schema.tauri.app/config/2", "productName": "CleanerX", - "version": "0.1.0-alpha.1", + "version": "0.1.0", "identifier": "com.cleanerx.CleanerX", "build": { "beforeDevCommand": "pnpm dev", diff --git a/src/App.test.tsx b/src/App.test.tsx index 22105e1..10e1c66 100644 --- a/src/App.test.tsx +++ b/src/App.test.tsx @@ -156,14 +156,14 @@ describe("CleanerX GUI", () => { it("checks for signed application updates only after explicit user action", async () => { const status = vi.spyOn(api, "getAppUpdateStatus").mockResolvedValue({ - currentVersion: "0.1.0-alpha.1", + currentVersion: "0.1.0", support: "available", }); const checkUpdate = vi.spyOn(api, "checkForAppUpdate").mockResolvedValue({ - currentVersion: "0.1.0-alpha.1", + currentVersion: "0.1.0", support: "available", update: { - currentVersion: "0.1.0-alpha.1", + currentVersion: "0.1.0", version: "0.2.0", notes: "Signed release notes", }, @@ -180,7 +180,7 @@ describe("CleanerX GUI", () => { expect(checkUpdate).not.toHaveBeenCalled(); fireEvent.click(screen.getByRole("button", { name: "Settings" })); - expect(await screen.findByText("Current version 0.1.0-alpha.1")).toBeVisible(); + expect(await screen.findByText("Current version 0.1.0")).toBeVisible(); expect(status).toHaveBeenCalledTimes(1); expect(checkUpdate).not.toHaveBeenCalled(); diff --git a/src/api.ts b/src/api.ts index 6698295..6b0ad69 100644 --- a/src/api.ts +++ b/src/api.ts @@ -301,13 +301,13 @@ export const api = { async getAppUpdateStatus(): Promise { if (inTauri()) return invoke("get_app_update_status"); - return { currentVersion: "0.1.0-alpha.1", support: "available" }; + return { currentVersion: "0.1.0", support: "available" }; }, async checkForAppUpdate(): Promise { if (inTauri()) return invoke("check_for_app_update"); await delay(180); - return { currentVersion: "0.1.0-alpha.1", support: "available" }; + return { currentVersion: "0.1.0", support: "available" }; }, async installAppUpdate(onEvent: (event: AppUpdateEvent) => void): Promise {