06cc122e0cb4
fix: publish standalone sync recovery breaking notice (v5.2.17)
- time
- 2026-09-07 22:43 UTC · 1 month ago
- machine
- koh2
- agent
- claude-opus-5
- session
- publish sync recovery warning
- parent
- 80fa1c4f430d
↓ peach-browser-06cc122e.tar.gzatlas at this save
files changed5 files
manifest.firefox.json+1 −1manifest.json+1 −1package.json+1 −1src/shared/release-notes.test.ts+21 −9src/shared/release-notes.ts+1 −1manifest.firefox.json+1 −1
@@ -1,7 +1,7 @@11 {22 "manifest_version": 3,33 "name": "Peach Password Manager",4- "version": "5.2.16",4+ "version": "5.2.17",55 "description": "Zero-knowledge password manager",66 "browser_specific_settings": {77 "gecko": {manifest.json+1 −1
@@ -2,7 +2,7 @@22 "manifest_version": 3,33 "minimum_chrome_version": "116",44 "name": "Peach Password Manager",5- "version": "5.2.16",5+ "version": "5.2.17",66 "description": "Zero-knowledge password manager",77 "action": {88 "default_popup": "src/popup/index.html",package.json+1 −1
@@ -1,6 +1,6 @@11 {22 "name": "peach",3- "version": "5.2.16",3+ "version": "5.2.17",44 "description": "Zero-knowledge password manager",55 "license": "GPL-3.0-only",66 "type": "module",src/shared/release-notes.test.ts+21 −9
@@ -43,19 +43,31 @@4343 expect(PEACH_VERSION.length).toBeGreaterThan(0);4444 });4545 46- it("RELEASES has a versioned breaking V4 entry", () => {47- const breaking = RELEASES.find((release) => release.importance === "breaking");48- expect(breaking).toBeDefined();49- expect(breaking!.notes.some((note) => note.body.toLowerCase().includes("android"))).toBe(true);50- expect(breaking!.notes.some((note) => note.body.toLowerCase().includes("revoke") && note.body.toLowerCase().includes("pair"))).toBe(true);46+ it("keeps sync recovery as its own breaking release", () => {47+ const syncRecovery = RELEASES.find((release) =>48+ release.notes.some((note) => {49+ const body = note.body.toLowerCase();50+ return body.includes("revoke") && body.includes("pair");51+ })52+ );53+ expect(syncRecovery?.importance).toBe("breaking");54+ expect(syncRecovery?.version).toBe("5.2.17");55+56+ const vaultV4 = RELEASES.find((release) => release.version === "5.1.3");57+ expect(vaultV4?.importance).toBe("breaking");58+ expect(vaultV4?.notes.some((note) => note.body.toLowerCase().includes("revoke"))).toBe(false);5159 });5260 61+ it("shows the sync recovery release for upgrades from 5.2.15", () => {62+ expect(importantReleasesSince("5.2.15").map((release) => release.version)).toEqual(["5.2.17"]);63+ });64+5365 it("hasReleaseNotes returns true when notes exist", () => {5466 expect(hasReleaseNotes()).toBe(true);5567 });5668 5769 it("combines every important release newer than the installed version", () => {58- expect(importantReleasesSince("5.0.0").map((release) => release.version)).toEqual(["5.1.3"]);70+ expect(importantReleasesSince("5.0.0").map((release) => release.version)).toEqual(["5.2.17", "5.1.3"]);5971 });6072 6173 it("combines several important patches across a skipped upgrade interval", () => {@@ -73,8 +85,8 @@7385 expect(await shouldShowWhatsNew()).toBe(true);7486 });7587 76- it("routine patches do not show the interruptive view", async () => {77- store["peach_release_notes_from"] = "5.2.4";88+ it("does not show the interruptive view after the current breaking release", async () => {89+ store["peach_release_notes_from"] = "5.2.17";7890 expect(await shouldShowWhatsNew()).toBe(false);7991 });8092 @@ -82,7 +94,7 @@8294 await recordInstalledVersion({ reason: "update", previousVersion: "5.0.0" } as chrome.runtime.InstalledDetails);8395 await recordInstalledVersion({ reason: "update", previousVersion: "5.1.0" } as chrome.runtime.InstalledDetails);8496 expect(store["peach_release_notes_from"]).toBe("5.0.0");85- expect((await pendingImportantReleases()).map((release) => release.version)).toEqual(["5.1.3"]);97+ expect((await pendingImportantReleases()).map((release) => release.version)).toEqual(["5.2.17", "5.1.3"]);8698 });8799 88100 it("shouldShowWhatsNew returns false on a fresh install (nothing seen yet)", async () => {src/shared/release-notes.ts+1 −1
@@ -20,6 +20,7 @@2020 }2121 2222 export const RELEASES: PeachRelease[] = [23+ { version: "5.2.17", releasedAt: "2026-09-07", importance: "breaking", notes: [{ heading: "Sync may need device repair", body: "If sync starts failing after this security update, revoke the affected devices and pair them again. A recent security change may require repairing device trust before sync can resume." }] },2324 { version: "5.2.6", releasedAt: "2026-09-06", notes: [{ heading: "Release history", body: "Settings now has an accurate, versioned changelog. Important notices combine every critical or breaking change since your previous installed version." }] },2425 { version: "5.2.5", releasedAt: "2026-09-06", notes: [{ heading: "Quieter update notices", body: "Routine updates no longer replay unchanged What's New information." }] },2526 { version: "5.2.4", releasedAt: "2026-09-06", notes: [{ heading: "Chrome passkey sign-in", body: "Older Peach passkeys work again on GitHub and other strict sites." }] },@@ -30,7 +31,6 @@3031 notes: [3132 { heading: "Passphrases & long passwords", body: "Peach supports passphrases and passwords up to 256 characters." },3233 { heading: "Update Android before using Vault V4", body: "Vault V4 requires Peach Android v2.15.3 or newer. Update Android and export a backup there before moving to Vault V4." },33- { heading: "Sync may need device repair", body: "If sync starts failing after this security update, revoke the affected devices and pair them again. A recent security change may require repairing device trust before sync can resume." },3434 ],3535 },3636 ];