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
14 changes: 7 additions & 7 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand All @@ -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
12 changes: 6 additions & 6 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -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"]
Expand Down
2 changes: 1 addition & 1 deletion docs/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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) |
Expand Down
24 changes: 12 additions & 12 deletions docs/releases/v0.1.0-alpha.1.md → docs/releases/v0.1.0.md
Original file line number Diff line number Diff line change
@@ -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.

Expand Down Expand Up @@ -38,28 +38,28 @@ 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

- [ ] 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.
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "cleanerx",
"private": true,
"version": "0.1.0-alpha.1",
"version": "0.1.0",
"author": "BeaCox",
"type": "module",
"scripts": {
Expand Down
4 changes: 2 additions & 2 deletions src-tauri/src/app_updates.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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());
}
Expand Down
2 changes: 1 addition & 1 deletion src-tauri/tauri.conf.json
Original file line number Diff line number Diff line change
@@ -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",
Expand Down
8 changes: 4 additions & 4 deletions src/App.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -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",
},
Expand All @@ -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();

Expand Down
4 changes: 2 additions & 2 deletions src/api.ts
Original file line number Diff line number Diff line change
Expand Up @@ -301,13 +301,13 @@ export const api = {

async getAppUpdateStatus(): Promise<AppUpdateStatus> {
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<AppUpdateStatus> {
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<void> {
Expand Down