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
5 files manifest.firefox.json+1 −1manifest.json+1 −1package.json+1 −1src/shared/release-notes.test.ts+21 −9src/shared/release-notes.ts+1 −1
manifest.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": {

view file

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",

view file

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",

view file

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 () => {

view file

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 ];

view file