Android / Build, or is the channel already serving this? (push) Successful in 3s
CI & Build / Build now, or wait for Android? (push) Successful in 3s
CI & Build / Python lint (push) Successful in 4s
Desktop (Tauri) / Build, or is the channel already serving this? (push) Successful in 4s
CI & Build / TypeScript typecheck (push) Successful in 7s
CI & Build / Python tests (push) Successful in 12s
CI & Build / integration (push) Successful in 18s
CI & Build / Build & push image (push) Skipped
Desktop (Tauri) / Windows installer (cross-compiled) (push) Successful in 3m0s
Desktop (Tauri) / Tauri desktop (Linux) (push) Successful in 5m17s
Desktop (Tauri) / Update manifest (push) Successful in 4s
Android / Kotlin + Rust (APK) (push) Successful in 8m4s
Step 7 of M314, the last one. Rule 22 — the old path comes out completely. ## A release stops building `desktop.yml` no longer triggers on `v*`, and its two `Publish release` steps are gone. `ci.yml` lost its tag trigger in step 6. So a tag now reaches exactly one lane: the new `release.yml`, which builds nothing. That is not a simplification for its own sake. The merge to `main` already published everything a user can receive — `:latest` + `:<sha>`, both channel feeds, the updater manifest. A tag rebuilding that source produces identical artifacts under identical names and re-pushes `:<sha>` with different bytes, which rule 145 forbids even when they match. ## So what a release is FOR The changelog (note 3127 §5). Two halves to "what am I running", and the version answers only the first: which build is this (the footer, /api/config, the APK's versionName) and what is in it that was not in the one I ran last month (nothing, until now). `packaging/release-notes.sh` derives it from git rather than a hand-maintained CHANGELOG, which drifts into recording what someone MEANT to ship. Capped at 60 entries with the omitted count stated — the first dated release spans 181 commits since `v0.1.0`, and a truncated list that does not say it is truncated is a lie. It publishes through `publish-release.sh` rather than making its own API calls, for the create-or-PATCH-on-409 path: a fixed-tag release that only ever POSTs keeps whatever body its first run wrote, which is #2182, and reimplementing that correctly in a second place is how it comes back. ## Retired `MANIFEST_TAG` and the whole branch behind it. It let the manifest live on a `stable` pointer release while the bundles sat on a versioned one — a split step 3 removed when `stable` started holding its own bundles. Nothing had passed it since; a parameter that can only ever receive its own default is a branch nobody exercises and a comment that goes stale, and its stale text was still telling readers the installable builds live on the versioned releases. `desktop/src-tauri/Cargo.toml`'s version and `thoughtsync/__init__.py`'s both now say out loud that they are not shipped values. The Cargo one carries the history worth keeping: the old scheme took its base from that line, so `0.2.<run>` on dev outranked a bare `0.2.0` on main, and the remedy was "remember to bump the minor before tagging" — documented in a comment, enforced nowhere. #2183 is what that looked like in the field. **That ritual is now formally dead**, and this is the deliberate act of killing it rather than a side effect. ## Still there on purpose `install.sh`'s transitional stable fallback. It cannot go until `main` has published to `stable` at least once, and that is gated on an operator request. Removing it now would break the DEFAULT install channel. #3147 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
67 lines
3.2 KiB
TOML
67 lines
3.2 KiB
TOML
[package]
|
|
name = "thoughtsync-desktop"
|
|
# NOT THE SHIPPED VERSION, and bumping it has no effect on anything a user sees.
|
|
#
|
|
# Cargo requires a version here, and Tauri reads one from `tauri.conf.json` — both
|
|
# are overridden per build by `cargo tauri build --config '{"version": ...}'` with
|
|
# the value `packaging/version.sh key desktop` derives. See #3144.
|
|
#
|
|
# It used to matter: the old scheme took its base from this line and appended the CI
|
|
# run number on dev, so `0.2.<run>` on dev sat against a bare `0.2.0` on main and
|
|
# every dev build outranked every stable one. The remedy was "remember to bump the
|
|
# minor before tagging" — documented in a comment, enforced nowhere, and #2183 is
|
|
# what that looked like in the field. A scheme needing a human to remember something
|
|
# before each release has not removed the decision, only hidden it.
|
|
version = "0.2.0"
|
|
description = "ThoughtSync desktop — local-first Keep-style thought capture"
|
|
authors = ["bvandeusen"]
|
|
edition = "2021"
|
|
# The executable is named below, not inferred from this package name. Off so the
|
|
# inferred `thoughtsync-desktop` target and the explicit one can't both claim
|
|
# src/main.rs.
|
|
autobins = false
|
|
|
|
# App logic lives in the library (Tauri v2 pattern: a single `run()` entry point);
|
|
# main.rs is a thin shim.
|
|
#
|
|
# rlib only. The staticlib/cdylib types existed for Tauri mobile, which Android no
|
|
# longer uses — it is a native Kotlin client over `thoughtsync-core` instead
|
|
# (Scribe note 2730), and the .so it loads is built from that crate, not this one.
|
|
[lib]
|
|
name = "thoughtsync_desktop_lib"
|
|
crate-type = ["rlib"]
|
|
|
|
# The shipped command is `thoughtsync` on every install channel, and the binary's
|
|
# own name is what the desktop actually keys on: GTK derives the window's WM_CLASS
|
|
# from it, and Tauri's generated .desktop file sets StartupWMClass to that same
|
|
# name. (Written without braces on purpose: `tauri android init` round-trips this
|
|
# file through a TOML serializer that reformats brace tokens inside comments.)
|
|
# So the canonical name has to be carried by the build target itself, not just by
|
|
# the path it gets installed to (issue 2075). The crate stays `thoughtsync-desktop`
|
|
# — only the executable is renamed. `thoughtsync` is also fixed under kebab-casing,
|
|
# which the AppImage bundler applies to the binary name on its way in.
|
|
[[bin]]
|
|
name = "thoughtsync"
|
|
path = "src/main.rs"
|
|
|
|
[build-dependencies]
|
|
tauri-build = { version = "2", features = [] }
|
|
|
|
[dependencies]
|
|
# The framework-free client core: local SQLite store + sync engine. Shared with the
|
|
# Android client, which binds the same crate through uniffi (Scribe note 2730).
|
|
thoughtsync-core = { path = "../../core" }
|
|
|
|
tauri = { version = "2", features = [] }
|
|
serde = { workspace = true }
|
|
serde_json = { workspace = true }
|
|
log = { workspace = true }
|
|
# Startup + operation logging to stdout AND a persistent file, so portability
|
|
# issues are diagnosable from any environment.
|
|
tauri-plugin-log = "2"
|
|
# In-app updates (M10.9). Signature verification is minisign; the public half lives
|
|
# in tauri.conf.json and the private half only ever as a CI secret. Desktop only —
|
|
# the plugin declares android support level "none", which is why the Android client
|
|
# gets a server-served update path instead (Scribe note 2725).
|
|
tauri-plugin-updater = "2"
|