Skip to content

fix(release): cut v0.15.2 with linux build fix - #299

Closed
tomymaritano wants to merge 229 commits into
mainfrom
develop
Closed

fix(release): cut v0.15.2 with linux build fix#299
tomymaritano wants to merge 229 commits into
mainfrom
develop

Conversation

@tomymaritano

@tomymaritano tomymaritano commented Jun 9, 2026

Copy link
Copy Markdown
Collaborator

Why

v0.15.1 shipped without binaries because the linux job failed at AppImage build (`executableName contains invalid chars: @readieddesktop`). The Build's `publish` job was skipped, no electron-updater feed produced. v0.15.1 has been marked as draft so it doesn't surface to update-checking clients.

#298 (now on develop) adds `linux.executableName: "readied"` to apps/desktop/package.json. This PR brings that to main so semantic-release cuts v0.15.2 and Build retries cleanly on all 3 platforms.

Expected Build flow for v0.15.2

  1. semantic-release on main → tag `v0.15.2` pushed (release.config.js has `draftRelease: true`, so the GitHub Release is created as draft).
  2. Tag push → `build.yml` runs on mac/win/linux.
  3. mac: builds + signs + notarizes + publishes to draft → ✅
  4. win: builds NSIS + publishes to draft → ✅
  5. linux: builds AppImage + deb with executable name `readied` + publishes to draft → ✅ (the fix)
  6. `publish` job runs `gh release edit v0.15.2 --draft=false` → release published with binaries.
  7. `sync-develop` auto-PRs main → develop with the release commit.

v0.15.1 recovery

  • Release marked as draft (`gh release edit v0.15.1 --draft`) so it's not visible at /releases and not consumed by electron-updater.
  • Tag remains for git history.
  • Can be deleted entirely later if desired.

Verification gates (still in place)

  • ✅ Pre-flight `semantic-release --dry-run` confirms a release will be cut.
  • ✅ `scripts/bump-version.mjs` updates both package.json files.
  • ✅ Post-flight assertion verifies versions match.
  • ✅ `build.yml` artifact upload uses `if-no-files-found: error`.

The single feat commit on develop since v0.15.1 is the linux fix; `fix:` triggers a patch bump → v0.15.2.

Summary by CodeRabbit

Release Notes - v0.15.1

  • Bug Fixes
    • Released v0.15.1 following Phase 0 DevOps stabilization efforts.
    • Enhanced error messages in encryption operations to provide clearer feedback when issues occur.

tomymaritano and others added 30 commits March 11, 2026 01:41
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Notebooks now sync before notes in syncNow() to ensure note-notebook
dependencies are satisfied. Adds pullNotebooks/pushNotebooks methods
and applyRemoteNotebookChange for bidirectional notebook sync.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Move validateNotebookTree from inline test definition to a shared module
so it can be reused by the API route and other consumers.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add conflict state to SyncStatusIndicator with amber warning icon
and count. Conflicts now take priority over idle state so users
discover them without navigating to Settings.

Also export ConflictResolver from sync components barrel.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
DatabaseConnection.transaction() already calls the inner fn — no need
for extra () at call site.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Fix pullNotebooks() to only advance cursor to last successfully
  applied change (prevents skipping failed changes on retry)
- Fix tree validation snapshot to properly exclude deleted notebooks
  (prevents ghost parent references in validation)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
feat: add bidirectional notebook sync
test: add sync-core unit tests (62 tests)
feat: surface sync conflicts in status indicator
# Conflicts:
#	apps/desktop/src/main/services/apiClient.ts
#	apps/desktop/src/main/services/syncService.ts
#	packages/api/src/db/schema.ts
#	packages/api/src/routes/sync.ts
#	packages/storage-sqlite/src/migrations/index.ts
Configure automated code review with path-specific instructions
for core, storage, desktop, and API packages.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…ration

Add optional metadata (name, version, priority) to registerRemarkPlugin
and registerRehypePlugin signatures for debugging and execution ordering.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
dependabot Bot and others added 13 commits June 8, 2026 07:03
…ates (#263)

Bumps the production group with 37 updates in the / directory:

| Package | From | To |
| --- | --- | --- |
|
[@commitlint/cli](https://github.com/conventional-changelog/commitlint/tree/HEAD/@commitlint/cli)
| `21.0.0` | `21.0.2` |
|
[@commitlint/config-conventional](https://github.com/conventional-changelog/commitlint/tree/HEAD/@commitlint/config-conventional)
| `21.0.0` | `21.0.2` |
| [lint-staged](https://github.com/lint-staged/lint-staged) | `17.0.4` |
`17.0.7` |
| [turbo](https://github.com/vercel/turborepo) | `2.9.12` | `2.9.16` |
|
[typescript-eslint](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/typescript-eslint)
| `8.59.2` | `8.60.1` |
| [@codemirror/autocomplete](https://github.com/codemirror/autocomplete)
| `6.20.2` | `6.20.3` |
| [@codemirror/view](https://github.com/codemirror/view) | `6.42.1` |
`6.43.0` |
|
[@tanstack/react-query](https://github.com/TanStack/query/tree/HEAD/packages/react-query)
| `5.100.9` | `5.101.0` |
| [better-sqlite3](https://github.com/WiseLibs/better-sqlite3) |
`12.9.0` | `12.10.0` |
|
[electron-updater](https://github.com/electron-userland/electron-builder/tree/HEAD/packages/electron-updater)
| `6.8.3` | `6.8.9` |
| [isomorphic-git](https://github.com/isomorphic-git/isomorphic-git) |
`1.37.6` | `1.38.4` |
|
[lucide-react](https://github.com/lucide-icons/lucide/tree/HEAD/packages/lucide-react)
| `1.14.0` | `1.17.0` |
|
[react-resizable-panels](https://github.com/bvaughn/react-resizable-panels)
| `4.11.0` | `4.11.2` |
| [zustand](https://github.com/pmndrs/zustand) | `5.0.13` | `5.0.14` |
|
[@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/tree/HEAD/packages/plugin-react)
| `6.0.1` | `6.0.2` |
| [electron](https://github.com/electron/electron) | `42.0.1` | `42.3.3`
|
|
[electron-builder](https://github.com/electron-userland/electron-builder/tree/HEAD/packages/electron-builder)
| `26.8.1` | `26.15.2` |
| [react](https://github.com/facebook/react/tree/HEAD/packages/react) |
`19.2.6` | `19.2.7` |
|
[react-dom](https://github.com/facebook/react/tree/HEAD/packages/react-dom)
| `19.2.6` | `19.2.7` |
| [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) |
`8.0.11` | `8.0.16` |
|
[@radix-ui/react-accordion](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/accordion)
| `1.2.12` | `1.2.13` |
|
[@radix-ui/react-dialog](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/dialog)
| `1.1.15` | `1.1.16` |
|
[@radix-ui/react-separator](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/separator)
| `1.1.8` | `1.1.9` |
|
[@radix-ui/react-slot](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/slot)
| `1.2.4` | `1.2.5` |
| [framer-motion](https://github.com/motiondivision/motion) | `12.38.0`
| `12.40.0` |
| [fumadocs-core](https://github.com/fuma-nama/fumadocs) | `16.8.8` |
`16.9.3` |
| [fumadocs-mdx](https://github.com/fuma-nama/fumadocs) | `15.0.0` |
`15.0.11` |
| [fumadocs-ui](https://github.com/fuma-nama/fumadocs) | `16.8.8` |
`16.9.3` |
| [marked](https://github.com/markedjs/marked) | `18.0.3` | `18.0.5` |
| [next](https://github.com/vercel/next.js) | `16.2.6` | `16.2.7` |
| [tailwind-merge](https://github.com/dcastil/tailwind-merge) | `3.5.0`
| `3.6.0` |
| [postcss](https://github.com/postcss/postcss) | `8.5.14` | `8.5.15` |
| [hono](https://github.com/honojs/hono) | `4.12.18` | `4.12.23` |
| [stripe](https://github.com/stripe/stripe-node) | `22.1.1` | `22.2.0`
|
| [@cloudflare/workers-types](https://github.com/cloudflare/workerd) |
`4.20260509.1` | `4.20260608.1` |
|
[wrangler](https://github.com/cloudflare/workers-sdk/tree/HEAD/packages/wrangler)
| `4.90.0` | `4.98.0` |
| [tsx](https://github.com/privatenumber/tsx) | `4.21.0` | `4.22.4` |


Updates `@commitlint/cli` from 21.0.0 to 21.0.2
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/conventional-changelog/commitlint/releases">@​commitlint/cli's
releases</a>.</em></p>
<blockquote>
<h2>v21.0.2</h2>
<h2><a
href="https://github.com/conventional-changelog/commitlint/compare/v21.0.1...v21.0.2">21.0.2</a>
(2026-05-29)</h2>
<h3>Bug Fixes</h3>
<ul>
<li>fix: emit actionable error when --edit cannot find COMMIT_EDITMSG
(<a
href="https://github.com/conventional-changelog/commitlint/tree/HEAD/@commitlint/cli/issues/589">#589</a>)
by <a href="https://github.com/escapedcat"><code>@​escapedcat</code></a>
in <a
href="https://redirect.github.com/conventional-changelog/commitlint/pull/4755">conventional-changelog/commitlint#4755</a></li>
<li>fix: apply oxfmt formatting to get-edit-commit.ts by <a
href="https://github.com/escapedcat"><code>@​escapedcat</code></a> in <a
href="https://redirect.github.com/conventional-changelog/commitlint/pull/4768">conventional-changelog/commitlint#4768</a></li>
<li>fix(read): fail when --from and --to share no merge-base <a
href="https://github.com/conventional-changelog/commitlint/tree/HEAD/@commitlint/cli/issues/4555">#4555</a>
by <a href="https://github.com/CervEdin"><code>@​CervEdin</code></a> in
<a
href="https://redirect.github.com/conventional-changelog/commitlint/pull/4754">conventional-changelog/commitlint#4754</a></li>
<li>fix: disallow same commit hash for --from and --to by <a
href="https://github.com/knocte"><code>@​knocte</code></a> in <a
href="https://redirect.github.com/conventional-changelog/commitlint/pull/4773">conventional-changelog/commitlint#4773</a></li>
</ul>
<h3>Chore/CI</h3>
<ul>
<li>ci: have renovate rebase stale PRs before merging by <a
href="https://github.com/escapedcat"><code>@​escapedcat</code></a> in <a
href="https://redirect.github.com/conventional-changelog/commitlint/pull/4782">conventional-changelog/commitlint#4782</a></li>
<li>chore: have renovate hold PRs for 3 days after release by <a
href="https://github.com/escapedcat"><code>@​escapedcat</code></a> in <a
href="https://redirect.github.com/conventional-changelog/commitlint/pull/4788">conventional-changelog/commitlint#4788</a></li>
<li>chore: anchor vite 8 by <a
href="https://github.com/escapedcat"><code>@​escapedcat</code></a> in <a
href="https://redirect.github.com/conventional-changelog/commitlint/pull/4790">conventional-changelog/commitlint#4790</a></li>
<li>ci: run commitlint once per same-repo PR by <a
href="https://github.com/escapedcat"><code>@​escapedcat</code></a> in <a
href="https://redirect.github.com/conventional-changelog/commitlint/pull/4795">conventional-changelog/commitlint#4795</a></li>
</ul>
<h2>New Contributors</h2>
<ul>
<li><a href="https://github.com/CervEdin"><code>@​CervEdin</code></a>
made their first contribution in <a
href="https://redirect.github.com/conventional-changelog/commitlint/pull/4754">conventional-changelog/commitlint#4754</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/conventional-changelog/commitlint/compare/v21.0.1...v21.0.2">https://github.com/conventional-changelog/commitlint/compare/v21.0.1...v21.0.2</a></p>
<h2>v21.0.1</h2>
<h2><a
href="https://github.com/conventional-changelog/commitlint/compare/v21.0.0...v21.0.1">21.0.1</a>
(2026-05-12)</h2>
<h3>Bug Fixes</h3>
<ul>
<li>fix(load): only resolve relative formatter paths by <a
href="https://github.com/escapedcat"><code>@​escapedcat</code></a> in <a
href="https://redirect.github.com/conventional-changelog/commitlint/pull/4761">conventional-changelog/commitlint#4761</a></li>
<li>fix(types): add presetConfig to ParserPreset interface by <a
href="https://github.com/SAY-5"><code>@​SAY-5</code></a> in <a
href="https://redirect.github.com/conventional-changelog/commitlint/pull/4749">conventional-changelog/commitlint#4749</a></li>
</ul>
<h2>CI</h2>
<ul>
<li>ci: stop spawning schedule jobs on contributors' forks by <a
href="https://github.com/knocte"><code>@​knocte</code></a> in <a
href="https://redirect.github.com/conventional-changelog/commitlint/pull/4753">conventional-changelog/commitlint#4753</a></li>
<li>ci: add weekly non-blocking pnpm audit by <a
href="https://github.com/escapedcat"><code>@​escapedcat</code></a> in <a
href="https://redirect.github.com/conventional-changelog/commitlint/pull/4766">conventional-changelog/commitlint#4766</a></li>
</ul>
<h2>New Contributors</h2>
<ul>
<li><a href="https://github.com/SAY-5"><code>@​SAY-5</code></a> made
their first contribution in <a
href="https://redirect.github.com/conventional-changelog/commitlint/pull/4749">conventional-changelog/commitlint#4749</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/conventional-changelog/commitlint/compare/v21.0.0...v21.0.1">https://github.com/conventional-changelog/commitlint/compare/v21.0.0...v21.0.1</a></p>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/conventional-changelog/commitlint/blob/master/@commitlint/cli/CHANGELOG.md">@​commitlint/cli's
changelog</a>.</em></p>
<blockquote>
<h2><a
href="https://github.com/conventional-changelog/commitlint/compare/v21.0.1...v21.0.2">21.0.2</a>
(2026-05-29)</h2>
<h3>Bug Fixes</h3>
<ul>
<li>disallow same commit hash for --from and --to (<a
href="https://redirect.github.com/conventional-changelog/commitlint/issues/4773">#4773</a>)
(<a
href="https://github.com/conventional-changelog/commitlint/commit/121005e86341537c4bf59a8453cae21dbd4954ec">121005e</a>)</li>
</ul>
<h2><a
href="https://github.com/conventional-changelog/commitlint/compare/v21.0.0...v21.0.1">21.0.1</a>
(2026-05-12)</h2>
<p><strong>Note:</strong> Version bump only for package
<code>@​commitlint/cli</code></p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/conventional-changelog/commitlint/commit/806904829c497cdfedeebfbac573bd1c8ee66b2b"><code>8069048</code></a>
v21.0.2</li>
<li><a
href="https://github.com/conventional-changelog/commitlint/commit/121005e86341537c4bf59a8453cae21dbd4954ec"><code>121005e</code></a>
fix: disallow same commit hash for --from and --to (<a
href="https://github.com/conventional-changelog/commitlint/tree/HEAD/@commitlint/cli/issues/4773">#4773</a>)</li>
<li><a
href="https://github.com/conventional-changelog/commitlint/commit/db8d7d6461d721fe2561ce4307e4069eaf6dcc8c"><code>db8d7d6</code></a>
v21.0.1</li>
<li><a
href="https://github.com/conventional-changelog/commitlint/commit/1329a25fd6f13b993fdf4e8c1b5a25ff2bf7ee07"><code>1329a25</code></a>
chore: migrate to pnpm (<a
href="https://github.com/conventional-changelog/commitlint/tree/HEAD/@commitlint/cli/issues/4762">#4762</a>)</li>
<li><a
href="https://github.com/conventional-changelog/commitlint/commit/db39968cdcf7b655e5951d2f550edadc4f0768ef"><code>db39968</code></a>
chore: pre pnpm cleanup (<a
href="https://github.com/conventional-changelog/commitlint/tree/HEAD/@commitlint/cli/issues/4759">#4759</a>)</li>
<li><a
href="https://github.com/conventional-changelog/commitlint/commit/6099ae50aa71fe7f99d75af1b8d9537aa7685747"><code>6099ae5</code></a>
chore: replace eslint with oxlint (<a
href="https://github.com/conventional-changelog/commitlint/tree/HEAD/@commitlint/cli/issues/4756">#4756</a>)</li>
<li>See full diff in <a
href="https://github.com/conventional-changelog/commitlint/commits/v21.0.2/@commitlint/cli">compare
view</a></li>
</ul>
</details>
<br />

Updates `@commitlint/config-conventional` from 21.0.0 to 21.0.2
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/conventional-changelog/commitlint/releases">@​commitlint/config-conventional's
releases</a>.</em></p>
<blockquote>
<h2>v21.0.2</h2>
<h2><a
href="https://github.com/conventional-changelog/commitlint/compare/v21.0.1...v21.0.2">21.0.2</a>
(2026-05-29)</h2>
<h3>Bug Fixes</h3>
<ul>
<li>fix: emit actionable error when --edit cannot find COMMIT_EDITMSG
(<a
href="https://github.com/conventional-changelog/commitlint/tree/HEAD/@commitlint/config-conventional/issues/589">#589</a>)
by <a href="https://github.com/escapedcat"><code>@​escapedcat</code></a>
in <a
href="https://redirect.github.com/conventional-changelog/commitlint/pull/4755">conventional-changelog/commitlint#4755</a></li>
<li>fix: apply oxfmt formatting to get-edit-commit.ts by <a
href="https://github.com/escapedcat"><code>@​escapedcat</code></a> in <a
href="https://redirect.github.com/conventional-changelog/commitlint/pull/4768">conventional-changelog/commitlint#4768</a></li>
<li>fix(read): fail when --from and --to share no merge-base <a
href="https://github.com/conventional-changelog/commitlint/tree/HEAD/@commitlint/config-conventional/issues/4555">#4555</a>
by <a href="https://github.com/CervEdin"><code>@​CervEdin</code></a> in
<a
href="https://redirect.github.com/conventional-changelog/commitlint/pull/4754">conventional-changelog/commitlint#4754</a></li>
<li>fix: disallow same commit hash for --from and --to by <a
href="https://github.com/knocte"><code>@​knocte</code></a> in <a
href="https://redirect.github.com/conventional-changelog/commitlint/pull/4773">conventional-changelog/commitlint#4773</a></li>
</ul>
<h3>Chore/CI</h3>
<ul>
<li>ci: have renovate rebase stale PRs before merging by <a
href="https://github.com/escapedcat"><code>@​escapedcat</code></a> in <a
href="https://redirect.github.com/conventional-changelog/commitlint/pull/4782">conventional-changelog/commitlint#4782</a></li>
<li>chore: have renovate hold PRs for 3 days after release by <a
href="https://github.com/escapedcat"><code>@​escapedcat</code></a> in <a
href="https://redirect.github.com/conventional-changelog/commitlint/pull/4788">conventional-changelog/commitlint#4788</a></li>
<li>chore: anchor vite 8 by <a
href="https://github.com/escapedcat"><code>@​escapedcat</code></a> in <a
href="https://redirect.github.com/conventional-changelog/commitlint/pull/4790">conventional-changelog/commitlint#4790</a></li>
<li>ci: run commitlint once per same-repo PR by <a
href="https://github.com/escapedcat"><code>@​escapedcat</code></a> in <a
href="https://redirect.github.com/conventional-changelog/commitlint/pull/4795">conventional-changelog/commitlint#4795</a></li>
</ul>
<h2>New Contributors</h2>
<ul>
<li><a href="https://github.com/CervEdin"><code>@​CervEdin</code></a>
made their first contribution in <a
href="https://redirect.github.com/conventional-changelog/commitlint/pull/4754">conventional-changelog/commitlint#4754</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/conventional-changelog/commitlint/compare/v21.0.1...v21.0.2">https://github.com/conventional-changelog/commitlint/compare/v21.0.1...v21.0.2</a></p>
<h2>v21.0.1</h2>
<h2><a
href="https://github.com/conventional-changelog/commitlint/compare/v21.0.0...v21.0.1">21.0.1</a>
(2026-05-12)</h2>
<h3>Bug Fixes</h3>
<ul>
<li>fix(load): only resolve relative formatter paths by <a
href="https://github.com/escapedcat"><code>@​escapedcat</code></a> in <a
href="https://redirect.github.com/conventional-changelog/commitlint/pull/4761">conventional-changelog/commitlint#4761</a></li>
<li>fix(types): add presetConfig to ParserPreset interface by <a
href="https://github.com/SAY-5"><code>@​SAY-5</code></a> in <a
href="https://redirect.github.com/conventional-changelog/commitlint/pull/4749">conventional-changelog/commitlint#4749</a></li>
</ul>
<h2>CI</h2>
<ul>
<li>ci: stop spawning schedule jobs on contributors' forks by <a
href="https://github.com/knocte"><code>@​knocte</code></a> in <a
href="https://redirect.github.com/conventional-changelog/commitlint/pull/4753">conventional-changelog/commitlint#4753</a></li>
<li>ci: add weekly non-blocking pnpm audit by <a
href="https://github.com/escapedcat"><code>@​escapedcat</code></a> in <a
href="https://redirect.github.com/conventional-changelog/commitlint/pull/4766">conventional-changelog/commitlint#4766</a></li>
</ul>
<h2>New Contributors</h2>
<ul>
<li><a href="https://github.com/SAY-5"><code>@​SAY-5</code></a> made
their first contribution in <a
href="https://redirect.github.com/conventional-changelog/commitlint/pull/4749">conventional-changelog/commitlint#4749</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/conventional-changelog/commitlint/compare/v21.0.0...v21.0.1">https://github.com/conventional-changelog/commitlint/compare/v21.0.0...v21.0.1</a></p>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/conventional-changelog/commitlint/blob/master/@commitlint/config-conventional/CHANGELOG.md">@​commitlint/config-conventional's
changelog</a>.</em></p>
<blockquote>
<h2><a
href="https://github.com/conventional-changelog/commitlint/compare/v21.0.1...v21.0.2">21.0.2</a>
(2026-05-29)</h2>
<p><strong>Note:</strong> Version bump only for package
<code>@​commitlint/config-conventional</code></p>
<h2><a
href="https://github.com/conventional-changelog/commitlint/compare/v21.0.0...v21.0.1">21.0.1</a>
(2026-05-12)</h2>
<p><strong>Note:</strong> Version bump only for package
<code>@​commitlint/config-conventional</code></p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/conventional-changelog/commitlint/commit/806904829c497cdfedeebfbac573bd1c8ee66b2b"><code>8069048</code></a>
v21.0.2</li>
<li><a
href="https://github.com/conventional-changelog/commitlint/commit/db8d7d6461d721fe2561ce4307e4069eaf6dcc8c"><code>db8d7d6</code></a>
v21.0.1</li>
<li><a
href="https://github.com/conventional-changelog/commitlint/commit/1329a25fd6f13b993fdf4e8c1b5a25ff2bf7ee07"><code>1329a25</code></a>
chore: migrate to pnpm (<a
href="https://github.com/conventional-changelog/commitlint/tree/HEAD/@commitlint/config-conventional/issues/4762">#4762</a>)</li>
<li><a
href="https://github.com/conventional-changelog/commitlint/commit/6099ae50aa71fe7f99d75af1b8d9537aa7685747"><code>6099ae5</code></a>
chore: replace eslint with oxlint (<a
href="https://github.com/conventional-changelog/commitlint/tree/HEAD/@commitlint/config-conventional/issues/4756">#4756</a>)</li>
<li>See full diff in <a
href="https://github.com/conventional-changelog/commitlint/commits/v21.0.2/@commitlint/config-conventional">compare
view</a></li>
</ul>
</details>
<br />

Updates `lint-staged` from 17.0.4 to 17.0.7
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/lint-staged/lint-staged/releases">lint-staged's
releases</a>.</em></p>
<blockquote>
<h2>v17.0.7</h2>
<h3>Patch Changes</h3>
<ul>
<li><a
href="https://redirect.github.com/lint-staged/lint-staged/pull/1806">#1806</a>
<a
href="https://github.com/lint-staged/lint-staged/commit/e692e58ced9eae65b2077435b7e799c632f3db07"><code>e692e58</code></a>
- Update dependency <code>tinyexec@^1.2.4</code>.</li>
</ul>
<h2>v17.0.6</h2>
<h3>Patch Changes</h3>
<ul>
<li>
<p><a
href="https://redirect.github.com/lint-staged/lint-staged/pull/1803">#1803</a>
<a
href="https://github.com/lint-staged/lint-staged/commit/bdf27700a6e25b40333672eef4d438984a2d0383"><code>bdf2770</code></a>
- Run all tests with <a href="https://deno.com">Deno</a>, in addition to
Node.js and Bun.</p>
</li>
<li>
<p><a
href="https://redirect.github.com/lint-staged/lint-staged/pull/1796">#1796</a>
<a
href="https://github.com/lint-staged/lint-staged/commit/75082727cdd070adb59d62c9040515da3bbbb2f9"><code>7508272</code></a>
- Fix performance regression of <em>lint-staged</em> v17 by going back
to using <code>git add</code> to stage task modifications. This was
changed to <code>git update-index --again</code> in v17 for less manual
work, but unfortunately the <code>update-index</code> command gets
slower in very large Git repos.</p>
</li>
<li>
<p><a
href="https://redirect.github.com/lint-staged/lint-staged/pull/1797">#1797</a>
<a
href="https://github.com/lint-staged/lint-staged/commit/7b2505a1f8fb8735e6306c7dabdd5295632f8c1a"><code>7b2505a</code></a>
- This version of <em>lint-staged</em> uses the new <a
href="https://docs.npmjs.com/staged-publishing">staged publishing for
npm packages</a> feature. Releases are already published from GitHub
Actions with <a href="https://docs.npmjs.com/trusted-publishers">trusted
publishing</a>, but now an additional approval with two-factor
authentication is also required.</p>
</li>
<li>
<p><a
href="https://redirect.github.com/lint-staged/lint-staged/pull/1802">#1802</a>
<a
href="https://github.com/lint-staged/lint-staged/commit/321b0a972a434006f5b5fac18867974ef040d037"><code>321b0a9</code></a>
- Downgrade dependency <code>tinyexec@1.2.2</code> to avoid issues in
version 1.2.3.</p>
</li>
</ul>
<h2>v17.0.5</h2>
<h3>Patch Changes</h3>
<ul>
<li><a
href="https://redirect.github.com/lint-staged/lint-staged/pull/1792">#1792</a>
<a
href="https://github.com/lint-staged/lint-staged/commit/1f672718b6fa67e0f00aafe107cb9f084f4d9102"><code>1f67271</code></a>
- Correctly set the <code>--max-arg-length</code> default value based on
the running platform. This controls how very long lists of staged files
are split into multiple chunks.</li>
</ul>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/lint-staged/lint-staged/blob/main/CHANGELOG.md">lint-staged's
changelog</a>.</em></p>
<blockquote>
<h2>17.0.7</h2>
<h3>Patch Changes</h3>
<ul>
<li><a
href="https://redirect.github.com/lint-staged/lint-staged/pull/1806">#1806</a>
<a
href="https://github.com/lint-staged/lint-staged/commit/e692e58ced9eae65b2077435b7e799c632f3db07"><code>e692e58</code></a>
- Update dependency <code>tinyexec@^1.2.4</code>.</li>
</ul>
<h2>17.0.6</h2>
<h3>Patch Changes</h3>
<ul>
<li>
<p><a
href="https://redirect.github.com/lint-staged/lint-staged/pull/1803">#1803</a>
<a
href="https://github.com/lint-staged/lint-staged/commit/bdf27700a6e25b40333672eef4d438984a2d0383"><code>bdf2770</code></a>
- Run all tests with <a href="https://deno.com">Deno</a>, in addition to
Node.js and Bun.</p>
</li>
<li>
<p><a
href="https://redirect.github.com/lint-staged/lint-staged/pull/1796">#1796</a>
<a
href="https://github.com/lint-staged/lint-staged/commit/75082727cdd070adb59d62c9040515da3bbbb2f9"><code>7508272</code></a>
- Fix performance regression of <em>lint-staged</em> v17 by going back
to using <code>git add</code> to stage task modifications. This was
changed to <code>git update-index --again</code> in v17 for less manual
work, but unfortunately the <code>update-index</code> command gets
slower in very large Git repos.</p>
</li>
<li>
<p><a
href="https://redirect.github.com/lint-staged/lint-staged/pull/1797">#1797</a>
<a
href="https://github.com/lint-staged/lint-staged/commit/7b2505a1f8fb8735e6306c7dabdd5295632f8c1a"><code>7b2505a</code></a>
- This version of <em>lint-staged</em> uses the new <a
href="https://docs.npmjs.com/staged-publishing">staged publishing for
npm packages</a> feature. Releases are already published from GitHub
Actions with <a href="https://docs.npmjs.com/trusted-publishers">trusted
publishing</a>, but now an additional approval with two-factor
authentication is also required.</p>
</li>
<li>
<p><a
href="https://redirect.github.com/lint-staged/lint-staged/pull/1802">#1802</a>
<a
href="https://github.com/lint-staged/lint-staged/commit/321b0a972a434006f5b5fac18867974ef040d037"><code>321b0a9</code></a>
- Downgrade dependency <code>tinyexec@1.2.2</code> to avoid issues in
version 1.2.3.</p>
</li>
</ul>
<h2>17.0.5</h2>
<h3>Patch Changes</h3>
<ul>
<li><a
href="https://redirect.github.com/lint-staged/lint-staged/pull/1792">#1792</a>
<a
href="https://github.com/lint-staged/lint-staged/commit/1f672718b6fa67e0f00aafe107cb9f084f4d9102"><code>1f67271</code></a>
- Correctly set the <code>--max-arg-length</code> default value based on
the running platform. This controls how very long lists of staged files
are split into multiple chunks.</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/lint-staged/lint-staged/commit/cd11fec419c59b4900aab194f288adf6bb4afdd1"><code>cd11fec</code></a>
Merge pull request <a
href="https://redirect.github.com/lint-staged/lint-staged/issues/1807">#1807</a>
from lint-staged/changeset-release/main</li>
<li><a
href="https://github.com/lint-staged/lint-staged/commit/15a8ee0df4ffb4c6fc65ea6828133cc32740c9c4"><code>15a8ee0</code></a>
chore(changeset): release</li>
<li><a
href="https://github.com/lint-staged/lint-staged/commit/797bbd943a7adab888640915449c09b8a67cc11d"><code>797bbd9</code></a>
Merge pull request <a
href="https://redirect.github.com/lint-staged/lint-staged/issues/1808">#1808</a>
from lint-staged/add-stashing-faq</li>
<li><a
href="https://github.com/lint-staged/lint-staged/commit/504e307c819a8b2decdf6c791d5350c4db0b15ed"><code>504e307</code></a>
docs: add FAQ entry on how stashing works</li>
<li><a
href="https://github.com/lint-staged/lint-staged/commit/eff5cd19633ce51ca62ac17a9e66d972a2aaf104"><code>eff5cd1</code></a>
Merge pull request <a
href="https://redirect.github.com/lint-staged/lint-staged/issues/1806">#1806</a>
from lint-staged/update-tinyexec</li>
<li><a
href="https://github.com/lint-staged/lint-staged/commit/e692e58ced9eae65b2077435b7e799c632f3db07"><code>e692e58</code></a>
build(deps): update <code>tinyexec@^1.2.4</code></li>
<li><a
href="https://github.com/lint-staged/lint-staged/commit/a2dd4ea97b1ff36486d88d9bad285834acef7ea6"><code>a2dd4ea</code></a>
Merge pull request <a
href="https://redirect.github.com/lint-staged/lint-staged/issues/1805">#1805</a>
from lint-staged/update-github-templates</li>
<li><a
href="https://github.com/lint-staged/lint-staged/commit/c92851945ff4fa604841e53fe044b47177b159b8"><code>c928519</code></a>
docs: update GitHub templates</li>
<li><a
href="https://github.com/lint-staged/lint-staged/commit/094ba56a3caeeda2cf83ad0a0c83df38ab2f6d06"><code>094ba56</code></a>
Merge pull request <a
href="https://redirect.github.com/lint-staged/lint-staged/issues/1798">#1798</a>
from lint-staged/changeset-release/main</li>
<li><a
href="https://github.com/lint-staged/lint-staged/commit/88e19fe3d81b8e1516564e7afaf6681f09f83b16"><code>88e19fe</code></a>
chore(changeset): release</li>
<li>Additional commits viewable in <a
href="https://github.com/lint-staged/lint-staged/compare/v17.0.4...v17.0.7">compare
view</a></li>
</ul>
</details>
<br />

Updates `turbo` from 2.9.12 to 2.9.16
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/vercel/turborepo/releases">turbo's
releases</a>.</em></p>
<blockquote>
<h2>Turborepo v2.9.16</h2>
<!-- raw HTML omitted -->
<h2>What's Changed</h2>
<h3>Changelog</h3>
<ul>
<li>release(turborepo): 2.9.15 by <a
href="https://github.com/github-actions"><code>@​github-actions</code></a>[bot]
in <a
href="https://redirect.github.com/vercel/turborepo/pull/12955">vercel/turborepo#12955</a></li>
<li>fix: Avoid hanging PTY shutdown by <a
href="https://github.com/anthonyshew"><code>@​anthonyshew</code></a> in
<a
href="https://redirect.github.com/vercel/turborepo/pull/12958">vercel/turborepo#12958</a></li>
<li>fix: Retry npm tlog publish failures by <a
href="https://github.com/anthonyshew"><code>@​anthonyshew</code></a> in
<a
href="https://redirect.github.com/vercel/turborepo/pull/12959">vercel/turborepo#12959</a></li>
<li>release(turborepo): 2.9.16-canary.1 by <a
href="https://github.com/anthonyshew"><code>@​anthonyshew</code></a> in
<a
href="https://redirect.github.com/vercel/turborepo/pull/12960">vercel/turborepo#12960</a></li>
<li>fix: Preserve nested Bun dependency versions by <a
href="https://github.com/anthonyshew"><code>@​anthonyshew</code></a> in
<a
href="https://redirect.github.com/vercel/turborepo/pull/12963">vercel/turborepo#12963</a></li>
<li>Revert &quot;fix: Preserve nested Bun dependency versions&quot; by
<a href="https://github.com/anthonyshew"><code>@​anthonyshew</code></a>
in <a
href="https://redirect.github.com/vercel/turborepo/pull/12964">vercel/turborepo#12964</a></li>
<li>release(turborepo): 2.9.16-canary.2 by <a
href="https://github.com/github-actions"><code>@​github-actions</code></a>[bot]
in <a
href="https://redirect.github.com/vercel/turborepo/pull/12961">vercel/turborepo#12961</a></li>
<li>fix: Preserve nested Bun dependency versions by <a
href="https://github.com/anthonyshew"><code>@​anthonyshew</code></a> in
<a
href="https://redirect.github.com/vercel/turborepo/pull/12965">vercel/turborepo#12965</a></li>
<li>fix: Don't delete existing <code>.git</code> when using
<code>--no-git</code> flag by <a
href="https://github.com/anthonyshew"><code>@​anthonyshew</code></a> in
<a
href="https://redirect.github.com/vercel/turborepo/pull/12968">vercel/turborepo#12968</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/vercel/turborepo/compare/v2.9.15...v2.9.16">https://github.com/vercel/turborepo/compare/v2.9.15...v2.9.16</a></p>
<h2>Turborepo v2.9.16-canary.2</h2>
<!-- raw HTML omitted -->
<h2>What's Changed</h2>
<h3>Changelog</h3>
<ul>
<li>release(turborepo): 2.9.15-canary.7 by <a
href="https://github.com/github-actions"><code>@​github-actions</code></a>[bot]
in <a
href="https://redirect.github.com/vercel/turborepo/pull/12935">vercel/turborepo#12935</a></li>
<li>fix: Restore a few internal invariant checks by <a
href="https://github.com/anthonyshew"><code>@​anthonyshew</code></a> in
<a
href="https://redirect.github.com/vercel/turborepo/pull/12933">vercel/turborepo#12933</a></li>
<li>fix: Improve profile tracing coverage by <a
href="https://github.com/anthonyshew"><code>@​anthonyshew</code></a> in
<a
href="https://redirect.github.com/vercel/turborepo/pull/12936">vercel/turborepo#12936</a></li>
<li>fix: Use build-scale OTel duration buckets by <a
href="https://github.com/anthonyshew"><code>@​anthonyshew</code></a> in
<a
href="https://redirect.github.com/vercel/turborepo/pull/12939">vercel/turborepo#12939</a></li>
<li>fix: Preserve pnpm injected peer package entries by <a
href="https://github.com/anthonyshew"><code>@​anthonyshew</code></a> in
<a
href="https://redirect.github.com/vercel/turborepo/pull/12940">vercel/turborepo#12940</a></li>
<li>feat: Add heap allocation profiling by <a
href="https://github.com/anthonyshew"><code>@​anthonyshew</code></a> in
<a
href="https://redirect.github.com/vercel/turborepo/pull/12943">vercel/turborepo#12943</a></li>
<li>release(turborepo): 2.9.15-canary.8 by <a
href="https://github.com/anthonyshew"><code>@​anthonyshew</code></a> in
<a
href="https://redirect.github.com/vercel/turborepo/pull/12945">vercel/turborepo#12945</a></li>
<li>docs: Correct attribute presence claims in turborepo-otel by <a
href="https://github.com/adityasingh2400"><code>@​adityasingh2400</code></a>
in <a
href="https://redirect.github.com/vercel/turborepo/pull/12932">vercel/turborepo#12932</a></li>
<li>chore(turbo-codemod): Remove duplicate &quot;in&quot; in transforms
path comment by <a
href="https://github.com/mvanhorn"><code>@​mvanhorn</code></a> in <a
href="https://redirect.github.com/vercel/turborepo/pull/12948">vercel/turborepo#12948</a></li>
<li>chore: Switch Geist font imports to npm geist package by <a
href="https://github.com/christopherkindl"><code>@​christopherkindl</code></a>
in <a
href="https://redirect.github.com/vercel/turborepo/pull/12952">vercel/turborepo#12952</a></li>
<li>fix: Respect root gitignore during prune by <a
href="https://github.com/anthonyshew"><code>@​anthonyshew</code></a> in
<a
href="https://redirect.github.com/vercel/turborepo/pull/12953">vercel/turborepo#12953</a></li>
<li>fix: Harden OTEL endpoint validation by <a
href="https://github.com/anthonyshew"><code>@​anthonyshew</code></a> in
<a
href="https://redirect.github.com/vercel/turborepo/pull/12954">vercel/turborepo#12954</a></li>
<li>release(turborepo): 2.9.15 by <a
href="https://github.com/github-actions"><code>@​github-actions</code></a>[bot]
in <a
href="https://redirect.github.com/vercel/turborepo/pull/12955">vercel/turborepo#12955</a></li>
<li>fix: Avoid hanging PTY shutdown by <a
href="https://github.com/anthonyshew"><code>@​anthonyshew</code></a> in
<a
href="https://redirect.github.com/vercel/turborepo/pull/12958">vercel/turborepo#12958</a></li>
<li>fix: Retry npm tlog publish failures by <a
href="https://github.com/anthonyshew"><code>@​anthonyshew</code></a> in
<a
href="https://redirect.github.com/vercel/turborepo/pull/12959">vercel/turborepo#12959</a></li>
<li>release(turborepo): 2.9.16-canary.1 by <a
href="https://github.com/anthonyshew"><code>@​anthonyshew</code></a> in
<a
href="https://redirect.github.com/vercel/turborepo/pull/12960">vercel/turborepo#12960</a></li>
</ul>
<h2>New Contributors</h2>
<ul>
<li><a
href="https://github.com/adityasingh2400"><code>@​adityasingh2400</code></a>
made their first contribution in <a
href="https://redirect.github.com/vercel/turborepo/pull/12932">vercel/turborepo#12932</a></li>
<li><a href="https://github.com/mvanhorn"><code>@​mvanhorn</code></a>
made their first contribution in <a
href="https://redirect.github.com/vercel/turborepo/pull/12948">vercel/turborepo#12948</a></li>
<li><a
href="https://github.com/christopherkindl"><code>@​christopherkindl</code></a>
made their first contribution in <a
href="https://redirect.github.com/vercel/turborepo/pull/12952">vercel/turborepo#12952</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/vercel/turborepo/compare/v2.9.15-canary.7...v2.9.16-canary.2">https://github.com/vercel/turborepo/compare/v2.9.15-canary.7...v2.9.16-canary.2</a></p>
<h2>Turborepo v2.9.15</h2>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/vercel/turborepo/commit/5e2d466c345604aa2011cd2314d176f401f650de"><code>5e2d466</code></a>
publish 2.9.16 to registry</li>
<li><a
href="https://github.com/vercel/turborepo/commit/b4aa626ee2316a61d070bcce4038ff26474180ee"><code>b4aa626</code></a>
fix: Don't delete existing <code>.git</code> when using
<code>--no-git</code> flag (<a
href="https://redirect.github.com/vercel/turborepo/issues/12968">#12968</a>)</li>
<li><a
href="https://github.com/vercel/turborepo/commit/7952b4627d04f1edd7ab9f2262a17c3e49cc1bc8"><code>7952b46</code></a>
fix: Preserve nested Bun dependency versions (<a
href="https://redirect.github.com/vercel/turborepo/issues/12965">#12965</a>)</li>
<li><a
href="https://github.com/vercel/turborepo/commit/5e5b248c188e679616c0d9e23bbe4ed8b46c9c36"><code>5e5b248</code></a>
release(turborepo): 2.9.16-canary.2 (<a
href="https://redirect.github.com/vercel/turborepo/issues/12961">#12961</a>)</li>
<li><a
href="https://github.com/vercel/turborepo/commit/3b1b6e9655ccafc73b80bca5f8cf815310cb2728"><code>3b1b6e9</code></a>
Revert &quot;fix: Preserve nested Bun dependency versions&quot; (<a
href="https://redirect.github.com/vercel/turborepo/issues/12964">#12964</a>)</li>
<li><a
href="https://github.com/vercel/turborepo/commit/8d4eaf81af296377e6c7533138b8f8c35b77bd7e"><code>8d4eaf8</code></a>
fix: Preserve nested Bun dependency versions (<a
href="https://redirect.github.com/vercel/turborepo/issues/12963">#12963</a>)</li>
<li><a
href="https://github.com/vercel/turborepo/commit/2284fa90a3492cd6800567ab2d4946dc5c853c91"><code>2284fa9</code></a>
release(turborepo): 2.9.16-canary.1 (<a
href="https://redirect.github.com/vercel/turborepo/issues/12960">#12960</a>)</li>
<li><a
href="https://github.com/vercel/turborepo/commit/5317f656c7d13c382eb97a6fac786ab8a807295a"><code>5317f65</code></a>
fix: Retry npm tlog publish failures (<a
href="https://redirect.github.com/vercel/turborepo/issues/12959">#12959</a>)</li>
<li><a
href="https://github.com/vercel/turborepo/commit/52e81bd93645e6d0b7fe44470cb93d4020c3dfd5"><code>52e81bd</code></a>
fix: Avoid hanging PTY shutdown (<a
href="https://redirect.github.com/vercel/turborepo/issues/12958">#12958</a>)</li>
<li><a
href="https://github.com/vercel/turborepo/commit/c85d4104bdc18df051334210d29c49353c46facf"><code>c85d410</code></a>
release(turborepo): 2.9.15 (<a
href="https://redirect.github.com/vercel/turborepo/issues/12955">#12955</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/vercel/turborepo/compare/v2.9.12...v2.9.16">compare
view</a></li>
</ul>
</details>
<br />

Updates `typescript-eslint` from 8.59.2 to 8.60.1
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/typescript-eslint/typescript-eslint/releases">typescript-eslint's
releases</a>.</em></p>
<blockquote>
<h2>v8.60.1</h2>
<h2>8.60.1 (2026-06-01)</h2>
<h3>🩹 Fixes</h3>
<ul>
<li><strong>eslint-plugin:</strong> respect ECMAScript line terminators
in ts-comment rules (<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12352">#12352</a>)</li>
<li><strong>eslint-plugin:</strong> [no-shadow] correct rule to match
ESLint v10 handling (<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12182">#12182</a>)</li>
</ul>
<h3>❤️ Thank You</h3>
<ul>
<li>lumir</li>
<li>Nevette Bailey <a
href="https://github.com/nevette-bailey"><code>@​nevette-bailey</code></a></li>
</ul>
<p>See <a
href="https://github.com/typescript-eslint/typescript-eslint/releases/tag/v8.60.1">GitHub
Releases</a> for more information.</p>
<p>You can read about our <a
href="https://typescript-eslint.io/users/versioning">versioning
strategy</a> and <a
href="https://typescript-eslint.io/users/releases">releases</a> on our
website.</p>
<h2>v8.60.0</h2>
<h2>8.60.0 (2026-05-25)</h2>
<h3>🚀 Features</h3>
<ul>
<li><strong>rule-tester:</strong> added updates of RuleTester from
upstream (<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12291">#12291</a>)</li>
</ul>
<h3>🩹 Fixes</h3>
<ul>
<li>playground TS version selector is not working (<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12326">#12326</a>,
<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/issues/12325">#12325</a>)</li>
</ul>
<h3>❤️ Thank You</h3>
<ul>
<li>Evyatar Daud <a
href="https://github.com/StyleShit"><code>@​StyleShit</code></a></li>
<li>Vinccool96</li>
</ul>
<p>See <a
href="https://github.com/typescript-eslint/typescript-eslint/releases/tag/v8.60.0">GitHub
Releases</a> for more information.</p>
<p>You can read about our <a
href="https://typescript-eslint.io/users/versioning">versioning
strategy</a> and <a
href="https://typescript-eslint.io/users/releases">releases</a> on our
website.</p>
<h2>v8.59.4</h2>
<h2>8.59.4 (2026-05-18)</h2>
<h3>🩹 Fixes</h3>
<ul>
<li><strong>eslint-plugin:</strong> [no-floating-promises] stack
overflow when using recursive types (<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12294">#12294</a>)</li>
<li><strong>project-service:</strong> throw error cause in
<code>getParsedConfigFileFromTSServer</code> (<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12321">#12321</a>)</li>
<li><strong>typescript-eslint:</strong> export Compatible* types from
typescript-eslint to resolve pnpm TS error (<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12340">#12340</a>)</li>
</ul>
<h3>❤️ Thank You</h3>
<ul>
<li>Evyatar Daud <a
href="https://github.com/StyleShit"><code>@​StyleShit</code></a></li>
<li>Kirk Waiblinger <a
href="https://github.com/kirkwaiblinger"><code>@​kirkwaiblinger</code></a></li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/typescript-eslint/CHANGELOG.md">typescript-eslint's
changelog</a>.</em></p>
<blockquote>
<h2>8.60.1 (2026-06-01)</h2>
<p>This was a version bump only for typescript-eslint to align it with
other projects, there were no code changes.</p>
<p>See <a
href="https://github.com/typescript-eslint/typescript-eslint/releases/tag/v8.60.1">GitHub
Releases</a> for more information.</p>
<p>You can read about our <a
href="https://typescript-eslint.io/users/versioning">versioning
strategy</a> and <a
href="https://typescript-eslint.io/users/releases">releases</a> on our
website.</p>
<h2>8.60.0 (2026-05-25)</h2>
<p>This was a version bump only for typescript-eslint to align it with
other projects, there were no code changes.</p>
<p>See <a
href="https://github.com/typescript-eslint/typescript-eslint/releases/tag/v8.60.0">GitHub
Releases</a> for more information.</p>
<p>You can read about our <a
href="https://typescript-eslint.io/users/versioning">versioning
strategy</a> and <a
href="https://typescript-eslint.io/users/releases">releases</a> on our
website.</p>
<h2>8.59.4 (2026-05-18)</h2>
<h3>🩹 Fixes</h3>
<ul>
<li><strong>typescript-eslint:</strong> export Compatible* types from
typescript-eslint to resolve pnpm TS error (<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12340">#12340</a>)</li>
</ul>
<h3>❤️ Thank You</h3>
<ul>
<li>Kirk Waiblinger <a
href="https://github.com/kirkwaiblinger"><code>@​kirkwaiblinger</code></a></li>
</ul>
<p>See <a
href="https://github.com/typescript-eslint/typescript-eslint/releases/tag/v8.59.4">GitHub
Releases</a> for more information.</p>
<p>You can read about our <a
href="https://typescript-eslint.io/users/versioning">versioning
strategy</a> and <a
href="https://typescript-eslint.io/users/releases">releases</a> on our
website.</p>
<h2>8.59.3 (2026-05-11)</h2>
<p>This was a version bump only for typescript-eslint to align it with
other projects, there were no code changes.</p>
<p>See <a
href="https://github.com/typescript-eslint/typescript-eslint/releases/tag/v8.59.3">GitHub
Releases</a> for more information.</p>
<p>You can read about our <a
href="https://typescript-eslint.io/users/versioning">versioning
strategy</a> and <a
href="https://typescript-eslint.io/users/releases">releases</a> on our
website.</p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/typescript-eslint/typescript-eslint/commit/4f84a697aedc436559c3ae09b5b357d98b448d68"><code>4f84a69</code></a>
chore(release): publish 8.60.1</li>
<li><a
href="https://github.com/typescript-eslint/typescript-eslint/commit/1849b530c254fb4f89d7270160f3a998e4acd964"><code>1849b53</code></a>
chore: typecheck using tsgo (<a
href="https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/typescript-eslint/issues/12139">#12139</a>)</li>
<li><a
href="https://github.com/typescript-eslint/typescript-eslint/commit/f891c29de5f3e23f3d8c59cc599d3196e54e9b58"><code>f891c29</code></a>
chore(release): publish 8.60.0</li>
<li><a
href="https://github.com/typescript-eslint/typescript-eslint/commit/ca6ca1431b6d18235297a7e29feb5d98f012dff2"><code>ca6ca14</code></a>
chore(release): publish 8.59.4</li>
<li><a
href="https://github.com/typescript-eslint/typescript-eslint/commit/4b927c607755b2648d5854b9e928c1dbb2b8e088"><code>4b927c6</code></a>
fix(typescript-eslint): export Compatible* types from typescript-eslint
to re...</li>
<li><a
href="https://github.com/typescript-eslint/typescript-eslint/commit/48e13c0261e3cb1bf4f4dfaa462cdb3a56ef7383"><code>48e13c0</code></a>
chore(release): publish 8.59.3</li>
<li><a
href="https://github.com/typescript-eslint/typescript-eslint/commit/44f9625336841a8ee3eb01a9e02e49b1d7b12648"><code>44f9625</code></a>
chore(deps): update vitest monorepo to v4.1.5 (<a
href="https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/typescript-eslint/issues/12307">#12307</a>)</li>
<li>See full diff in <a
href="https://github.com/typescript-eslint/typescript-eslint/commits/v8.60.1/packages/typescript-eslint">compare
view</a></li>
</ul>
</details>
<br />

Updates `@codemirror/autocomplete` from 6.20.2 to 6.20.3
<details>
<summary>Commits</summary>
<ul>
<li>See full diff in <a
href="https://github.com/codemirror/autocomplete/commits">compare
view</a></li>
</ul>
</details>
<br />

Updates `@codemirror/view` from 6.42.1 to 6.43.0
<details>
<summary>Commits</summary>
<ul>
<li>See full diff in <a
href="https://github.com/codemirror/view/commits">compare view</a></li>
</ul>
</details>
<br />

Updates `@tanstack/react-query` from 5.100.9 to 5.101.0
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/TanStack/query/releases">@​tanstack/react-query's
releases</a>.</em></p>
<blockquote>
<h2><code>@​tanstack/react-query-devtools</code><a
href="https://github.com/5"><code>@​5</code></a>.101.0</h2>
<h3>Patch Changes</h3>
<ul>
<li>Updated dependencies [<a
href="https://github.com/TanStack/query/commit/3042860e3c8731c94ca4dec0e277e415d0484fce"><code>3042860</code></a>,
<a
href="https://github.com/TanStack/query/commit/e631dc3fa17bff71f413246b7a770a730016d346"><code>e631dc3</code></a>]:
<ul>
<li><code>@​tanstack/query-devtools</code><a
href="https://github.com/5"><code>@​5</code></a>.101.0</li>
<li><code>@​tanstack/react-query</code><a
href="https://github.com/5"><code>@​5</code></a>.101.0</li>
</ul>
</li>
</ul>
<h2><code>@​tanstack/react-query-next-experimental</code><a
href="https://github.com/5"><code>@​5</code></a>.101.0</h2>
<h3>Patch Changes</h3>
<ul>
<li>
<p><a
href="https://redirect.github.com/TanStack/query/pull/10857">#10857</a>
<a
href="https://github.com/TanStack/query/commit/7cf5923308fb91f3eff0fe952d8c64676e2bdad7"><code>7cf5923</code></a>
- fix(react-query-next-experimental): replace deprecated 'isServer' with
'environmentManager.isServer()'</p>
</li>
<li>
<p>Updated dependencies []:</p>
<ul>
<li><code>@​tanstack/react-query</code><a
href="https://github.com/5"><code>@​5</code></a>.101.0</li>
</ul>
</li>
</ul>
<h2><code>@​tanstack/react-query-persist-client</code><a
href="https://github.com/5"><code>@​5</code></a>.101.0</h2>
<h3>Patch Changes</h3>
<ul>
<li>Updated dependencies []:
<ul>
<li><code>@​tanstack/query-persist-client-core</code><a
href="https://github.com/5"><code>@​5</code></a>.101.0</li>
<li><code>@​tanstack/react-query</code><a
href="https://github.com/5"><code>@​5</code></a>.101.0</li>
</ul>
</li>
</ul>
<h2><code>@​tanstack/react-query</code><a
href="https://github.com/5"><code>@​5</code></a>.101.0</h2>
<h3>Patch Changes</h3>
<ul>
<li>Updated dependencies []:
<ul>
<li><code>@​tanstack/query-core</code><a
href="https://github.com/5"><code>@​5</code></a>.101.0</li>
</ul>
</li>
</ul>
<h2><code>@​tanstack/react-query-devtools</code><a
href="https://github.com/5"><code>@​5</code></a>.100.14</h2>
<h3>Patch Changes</h3>
<ul>
<li>Updated dependencies [<a
href="https://github.com/TanStack/query/commit/ed20b6d7541c908033acfcad92b0cd112930d1c3"><code>ed20b6d</code></a>]:
<ul>
<li><code>@​tanstack/react-query</code><a
href="https://github.com/5"><code>@​5</code></a>.100.14</li>
<li><code>@​tanstack/query-devtools</code><a
href="https://github.com/5"><code>@​5</code></a>.100.14</li>
</ul>
</li>
</ul>
<h2><code>@​tanstack/react-query-next-experimental</code><a
href="https://github.com/5"><code>@​5</code></a>.100.14</h2>
<h3>Patch Changes</h3>
<ul>
<li>Updated dependencies [<a
href="https://github.com/TanStack/query/commit/ed20b6d7541c908033acfcad92b0cd112930d1c3"><code>ed20b6d</code></a>]:
<ul>
<li><code>@​tanstack/react-query</code><a
href="https://github.com/5"><code>@​5</code></a>.100.14</li>
</ul>
</li>
</ul>
<h2><code>@​tanstack/react-query-persist-client</code><a
href="https://github.com/5"><code>@​5</code></a>.100.14</h2>
<h3>Patch Changes</h3>
<ul>
<li>Updated dependencies [<a
href="https://github.com/TanStack/query/commit/ed20b6d7541c908033acfcad92b0cd112930d1c3"><code>ed20b6d</code></a>]:
<ul>
<li><code>@​tanstack/react-query</code><a
href="https://github.com/5"><code>@​5</code></a>.100.14</li>
<li><code>@​tanstack/query-persist-client-core</code><a
href="https://github.com/5"><code>@​5</code></a>.100.14</li>
</ul>
</li>
</ul>
<h2><code>@​tanstack/react-query</code><a
href="https://github.com/5"><code>@​5</code></a>.100.14</h2>
<h3>Patch Changes</h3>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/TanStack/query/blob/main/packages/react-query/CHANGELOG.md">@​tanstack/react-query's
changelog</a>.</em></p>
<blockquote>
<h2>5.101.0</h2>
<h3>Patch Changes</h3>
<ul>
<li>Updated dependencies []:
<ul>
<li><code>@​tanstack/query-core</code><a
href="https://github.com/5"><code>@​5</code></a>.101.0</li>
</ul>
</li>
</ul>
<h2>5.100.14</h2>
<h3>Patch Changes</h3>
<ul>
<li>
<p>fix(react-query): do not go into optimistic fetching state when not
subscribed (<a
href="https://redirect.github.com/TanStack/query/pull/10759">#10759</a>)</p>
</li>
<li>
<p>Updated dependencies []:</p>
<ul>
<li><code>@​tanstack/query-core</code><a
href="https://github.com/5"><code>@​5</code></a>.100.14</li>
</ul>
</li>
</ul>
<h2>5.100.13</h2>
<h3>Patch Changes</h3>
<ul>
<li>Updated dependencies [<a
href="https://github.com/TanStack/query/commit/d423168f6261a5cb3d353e53b27c8150cc271151"><code>d423168</code></a>]:
<ul>
<li><code>@​tanstack/query-core</code><a
href="https://github.com/5"><code>@​5</code></a>.100.13</li>
</ul>
</li>
</ul>
<h2>5.100.12</h2>
<h3>Patch Changes</h3>
<ul>
<li>Updated dependencies []:
<ul>
<li><code>@​tanstack/query-core</code><a
href="https://github.com/5"><code>@​5</code></a>.100.12</li>
</ul>
</li>
</ul>
<h2>5.100.11</h2>
<h3>Patch Changes</h3>
<ul>
<li>Updated dependencies []:
<ul>
<li><code>@​tanstack/query-core</code><a
href="https://github.com/5"><code>@​5</code></a>.100.11</li>
</ul>
</li>
</ul>
<h2>5.100.10</h2>
<h3>Patch Changes</h3>
<ul>
<li>Updated dependencies []:
<ul>
<li><code>@​tanstack/query-core</code><a
href="https://github.com/5"><code>@​5</code></a>.100.10</li>
</ul>
</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/TanStack/query/commit/f3d8d2abbf15bf81ff7575d3be9845d7b402f25a"><code>f3d8d2a</code></a>
ci: Version Packages (<a
href="https://github.com/TanStack/query/tree/HEAD/packages/react-query/issues/10774">#10774</a>)</li>
<li><a
href="https://github.com/TanStack/query/commit/532bb298fba15e945e69c6ee4edc0c759ff21324"><code>532bb29</code></a>
fix(tests): disable local coverage instrumentation (<a
href="https://github.com/TanStack/query/tree/HEAD/packages/react-query/issues/10776">#10776</a>)</li>
<li><a
href="https://github.com/TanStack/query/commit/ba6e7beebd50143408f01fcf5d9aee2ec1486f60"><code>ba6e7be</code></a>
ci: Version Packages (<a
href="https://github.com/TanStack/query/tree/HEAD/packages/react-query/issues/10767">#10767</a>)</li>
<li><a
href="https://github.com/TanStack/query/commit/ed20b6d7541c908033acfcad92b0cd112930d1c3"><code>ed20b6d</code></a>
fix(react): do not go into optimistic fetching state when not subscribed
(<a
href="https://github.com/TanStack/query/tree/HEAD/packages/react-query/issues/10">#10</a>...</li>
<li><a
href="https://github.com/TanStack/query/commit/05cf2bc0a4eae64959dc8a40152e2878190c971b"><code>05cf2bc</code></a>
ci: Version Packages (<a
href="https://github.com/TanStack/query/tree/HEAD/packages/react-query/issues/10758">#10758</a>)</li>
<li><a
href="https://github.com/TanStack/query/commit/d423168f6261a5cb3d353e53b27c8150cc271151"><code>d423168</code></a>
fix(query-core): use built-in NoInfer for generic indexed-access types
(<a
href="https://github.com/TanStack/query/tree/HEAD/packages/react-query/issues/10593">#10593</a>)</li>
<li><a
href="https://github.com/TanStack/query/commit/5ff4f6936bb66a64267eb4413430f956eecf7248"><code>5ff4f69</code></a>
ci: Version Packages (<a
href="https://github.com/TanStack/query/tree/HEAD/packages/react-query/issues/10755">#10755</a>)</li>
<li><a
href="https://github.com/TanStack/query/commit/3e85350749751eef055fffb65f6838dfafa74891"><code>3e85350</code></a>
ci: Version Packages (<a
href="https://github.com/TanStack/query/tree/HEAD/packages/react-query/issues/10706">#10706</a>)</li>
<li><a
href="https://github.com/TanStack/query/commit/9d2692cec4d538c2f96489027ba546f11638dfb1"><code>9d2692c</code></a>
ci: Version Packages (<a
href="https://github.com/TanStack/query/tree/HEAD/packages/react-query/issues/10695">#10695</a>)</li>
<li><a
href="https://github.com/TanStack/query/commit/74fa05eb1b16f40ea7068afd0e5e082687d22338"><code>74fa05e</code></a>
chore(tsconfig.json): narrow 'include' pattern to prevent TS6053 race
conditi...</li>
<li>See full diff in <a
href="https://github.com/TanStack/query/commits/@tanstack/react-query@5.101.0/packages/react-query">compare
view</a></li>
</ul>
</details>
<br />

Updates `better-sqlite3` from 12.9.0 to 12.10.0
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/WiseLibs/better-sqlite3/releases">better-sqlite3's
releases</a>.</em></p>
<blockquote>
<h2>v12.10.0</h2>
<h2>What's Changed</h2>
<ul>
<li>Update SQLite to version 3.53.1 by <a
href="https://github.com/JoshuaWise"><code>@​JoshuaWise</code></a> in <a
href="https://redirect.github.com/WiseLibs/better-sqlite3/pull/1467">WiseLibs/better-sqlite3#1467</a></li>
<li>Add support for Node.js v26 prebuilds and remove EOL builds (Node.js
v20, v23) by <a
href="https://github.com/m4heshd"><code>@​m4heshd</code></a> in <a
href="https://redirect.github.com/WiseLibs/better-sqlite3/pull/1468">WiseLibs/better-sqlite3#1468</a></li>
<li>Temporarily rollback support for Electron v42 prebuilds by <a
href="https://github.com/m4heshd"><code>@​m4heshd</code></a> in <a
href="https://redirect.github.com/WiseLibs/better-sqlite3/pull/1470">WiseLibs/better-sqlite3#1470</a></li>
<li>Enable percentile functions by <a
href="https://github.com/Maxime-J"><code>@​Maxime-J</code></a> in <a
href="https://redirect.github.com/WiseLibs/better-sqlite3/pull/1447">WiseLibs/better-sqlite3#1447</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/WiseLibs/better-sqlite3/compare/v12.9.1...v12.10.0">https://github.com/WiseLibs/better-sqlite3/compare/v12.9.1...v12.10.0</a></p>
<h2>v12.9.1</h2>
<h2>⚠️CAUTION: NOT A VIABLE RELEASE</h2>
<p>Electron v39+ prebuilds are not building successfully at the moment.
Stick to <a
href="https://github.com/WiseLibs/better-sqlite3/releases/tag/v12.9.0">v12.9.0</a>
for now.</p>
<h2>What's Changed</h2>
<ul>
<li>Enable percentile functions by <a
href="https://github.com/Maxime-J"><code>@​Maxime-J</code></a> in <a
href="https://redirect.github.com/WiseLibs/better-sqlite3/pull/1447">WiseLibs/better-sqlite3#1447</a></li>
<li>Add support for electron v42 prebuilds by <a
href="https://github.com/m4heshd"><code>@​m4heshd</code></a> in <a
href="https://redirect.github.com/WiseLibs/better-sqlite3/pull/1466">WiseLibs/better-sqlite3#1466</a></li>
</ul>
<h2>New Contributors</h2>
<ul>
<li><a href="https://github.com/Maxime-J"><code>@​Maxime-J</code></a>
made their first contribution in <a
href="https://redirect.github.com/WiseLibs/better-sqlite3/pull/1447">WiseLibs/better-sqlite3#1447</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/WiseLibs/better-sqlite3/compare/v12.9.0...v12.9.1">https://github.com/WiseLibs/better-sqlite3/compare/v12.9.0...v12.9.1</a></p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/WiseLibs/better-sqlite3/commit/d8885f900cb626596e28a0ecd1b9d35bf15c7a0b"><code>d8885f9</code></a>
12.10.0</li>
<li><a
href="https://github.com/WiseLibs/better-sqlite3/commit/3f8932492960b9119dbbe0317d86cbad8ced132f"><code>3f89324</code></a>
Temporarily rollback support for Electron v42 prebuilds (<a
href="https://redirect.github.com/WiseLibs/better-sqlite3/issues/1470">#1470</a>)</li>
<li><a
href="https://github.com/WiseLibs/better-sqlite3/commit/a6400281277a70b01a9401606d2b8bea667e7d8f"><code>a640028</code></a>
Add support for Node.js v26 prebuilds and remove EOL builds (<a
href="https://redirect.github.com/WiseLibs/better-sqlite3/issues/1468">#1468</a>)</li>
<li><a
href="https://github.com/WiseLibs/better-sqlite3/commit/a69f03c5906fabe8e49945ce05f93ad85d6254f3"><code>a69f03c</code></a>
Update SQLite to version 3.53.1 (<a
href="https://redirect.github.com/WiseLibs/better-sqlite3/issues/1467">#1467</a>)</li>
<li><a
href="https://github.com/WiseLibs/better-sqlite3/commit/d116f32c6f4a9bff3599b35ccdf92b0528747fd4"><code>d116f32</code></a>
12.9.1</li>
<li><a
href="https://github.com/WiseLibs/better-sqlite3/commit/04d9b655668345bdc3cdfe232747c9ac4c39c507"><code>04d9b65</code></a>
Add support for electron v42 prebuilds (<a
href="https://redirect.github.com/WiseLibs/better-sqlite3/issues/1466">#1466</a>)</li>
<li><a
href="https://github.com/WiseLibs/better-sqlite3/commit/ef7d9404bb2fcfd4b77d237ec3eaa8eee96a6fb1"><code>ef7d940</code></a>
Enable percentile functions (<a
href="https://redirect.github.com/WiseLibs/better-sqlite3/issues/1447">#1447</a>)</li>
<li>See full diff in <a
href="https://github.com/WiseLibs/better-sqlite3/compare/v12.9.0...v12.10.0">compare
view</a></li>
</ul>
</details>
<br />

Updates `electron-updater` from 6.8.3 to 6.8.9
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/electron-userland/electron-builder/releases">electron-updater's
releases</a>.</em></p>
<blockquote>
<h2>electron-updater@6.8.9</h2>
<h3>Patch Changes</h3>
<ul>
<li>Fix: holistic field detection for sha256 hash redaction <em><a
href="https://redirect.github.com/electron-userland/electron-builder/pull/9834"><code>[#9834](https://github.com/electron-userland/electron-builder/tree/HEAD/packages/electron-updater/issues/9834)</code></a>
<a
href="https://github.com/electron-userland/electron-builder/commit/22a7532bd01b9fb42cff7c58d599c7ad683569fe"><code>22a7532</code></a>
<a
href="https://github.com/mmaietta"><code>@​mmaietta</code></a></em></li>
</ul>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p><a
href="https://github.com/electron-userland/electron-builder/commit/198c10c9693d1244bac80cb11af6b75ad363e5a0"><code>198c10c</code></a>
<a
href="https://github.com/electron-userland/electron-builder/commit/22a7532bd01b9fb42cff7c58d599c7ad683569fe"><code>22a7532</code></a></p>
<!-- raw HTML omitted -->
<ul>
<li><code>builder-util-runtime@9.7.0</code></li>
</ul>
<!-- raw HTML omitted -->
<h2>electron-updater@6.8.8</h2>
<h3>Patch Changes</h3>
<ul>
<li>Fix(updater): ensure full changelog includes only release notes up
to the latest release <em><a
href="https://redirect.github.com/electron-userland/electron-builder/pull/9573"><code>[#9573](https://github.com/electron-userland/electron-builder/tree/HEAD/packages/electron-updater/issues/9573)</code></a>
<a
href="https://github.com/electron-userland/electron-builder/commit/ac450835015b18720c5bc5de0221b4c770d0fac2"><code>ac45083</code></a>
<a
href="https://github.com/AbdulrhmanGoni"><code>@​AbdulrhmanGoni</code></a></em></li>
<li>Fix: harden the auto-update flow relative paths in PATH, path
traversals, and environment variable intercepts <em><a
href="https://redirect.github.com/electron-userland/electron-builder/pull/9796"><code>[#9796](https://github.com/electron-userland/electron-builder/tree/HEAD/packages/electron-updater/issues/9796)</code></a>
<a
href="https://github.com/electron-userland/electron-builder/commit/2dc409f1e4ab1c82795ad731a50beb1296315730"><code>2dc409f</code></a>
<a
href="https://github.com/mmaietta"><code>@​mmaietta</code></a></em></li>
<li>Chore: extracting helper function to add coverage in MacUpdater test
suite <em><a
href="https://redirect.github.com/electron-userland/electron-builder/pull/9794"><code>[#9794](https://github.com/electron-userland/electron-builder/tree/HEAD/packages/electron-updater/issues/9794)</code></a>
<a
href="https://github.com/electron-userland/electron-builder/commit/d664ed0968e6c4010688eebe97babcfe5e43bd51"><code>d664ed0</code></a>
<a
href="https://github.com/mmaietta"><code>@​mmaietta</code></a></em></li>
</ul>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p><a
href="https://github.com/electron-userland/electron-builder/commit/59efef1a8b81ed1ead4e8004043726d2b49cf81f"><code>59efef1</code></a></p>
<!-- raw HTML omitted -->
<ul>
<li><code>builder-util-runtime@9.6.3</code></li>
</ul>
<!-- raw HTML omitted -->
<h2>electron-updater@6.8.7</h2>
<h3>Patch Changes</h3>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p><a
href="https://github.com/electron-userland/electron-builder/commit/d6a5aee821138449dc0c082606da6a1bf5ba0798"><code>d6a5aee</code></a>
<a
href="https://github.com/electron-userland/electron-builder/commit/4866737e4fe1f0cca210d318b9ce440f8e978a63"><code>4866737</code></a></p>
<!-- raw HTML omitted -->
<ul>
<li><code>builder-util-runtime@9.6.2</code></li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/electron-userland/electron-builder/blob/master/packages/electron-updater/CHANGELOG.md">electron-updater's
changelog</a>.</em></p>
<blockquote>
<h2>6.8.9</h2>
<h3>Patch Changes</h3>
<ul>
<li>Fix: holistic field detection for sha256 hash redaction <em><a
href="https://redirect.github.com/electron-userland/electron-builder/pull/9834"><code>[#9834](https://github.com/electron-userland/electron-builder/tree/HEAD/packages/electron-updater/issues/9834)</code></a>
<a
href="https://github.com/electron-userland/electron-builder/commit/22a7532bd01b9fb42cff7c58d599c7ad683569fe"><code>22a7532</code></a>
<a
href="https://github.com/mmaietta"><code>@​mmaietta</code></a></em></li>
</ul>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p><a
href="https://github.com/electron-userland/electron-builder/commit/198c10c9693d1244bac80cb11af6b75ad363e5a0"><code>198c10c</code></a>
<a
href="https://github.com/electron-userland/electron-builder/commit/22a7532bd01b9fb42cff7c58d599c7ad683569fe"><code>22a7532</code></a></p>
<!-- raw HTML omitted -->
<ul>
<li><code>builder-util-runtime@9.7.0</code></li>
</ul>
<!-- raw HTML omitted -->
<h2>6.8.8</h2>
<h3>Patch Changes</h3>
<ul>
<li>Fix(updater): ensure full changelog includes only release notes up
to the latest release <em><a
href="https://redirect.github.com/electron-userland/electron-builder/pull/9573"><code>[#9573](https://github.com/electron-userland/electron-builder/tree/HEAD/packages/electron-updater/issues/9573)</code></a>
<a
href="https://github.com/electron-userland/electron-builder/commit/ac450835015b18720c5bc5de0221b4c770d0fac2"><code>ac45083</code></a>
<a
href="https://github.com/AbdulrhmanGoni"><code>@​AbdulrhmanGoni</code></a></em></li>
<li>Fix: harden the auto-update flow relative paths in PATH, path
traversals, and environment variable intercepts <em><a
href="https://redirect.github.com/electron-userland/electron-builder/pull/9796"><code>[#9796](https://github.com/electron-userland/electron-builder/tree/HEAD/packages/electron-updater/issues/9796)</code></a>
<a
href="https://github.com/electron-userland/electron-builder/commit/2dc409f1e4ab1c82795ad731a50beb1296315730"><code>2dc409f</code></a>
<a
href="https://github.com/mmaietta"><code>@​mmaietta</code></a></em></li>
<li>Chore: extracting helper function to add coverage in MacUpdater test
suite <em><a
href="https://redirect.github.com/electron-userland/electron-builder/pull/9794"><code>[#9794](https://github.com/electron-userland/electron-builder/tree/HEAD/packages/electron-updater/issues/9794)</code></a>
<a
href="https://github.com/electron-userland/electron-builder/commit/d664ed0968e6c4010688eebe97babcfe5e43bd51"><code>d664ed0</code></a>
<a
href="https://github.com/mmaietta"><code>@​mmaietta</code></a></em></li>
</ul>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p><a
href="https://github.com/electron-userland/electron-builder/commit/59efef1a8b81ed1ead4e8004043726d2b49cf81f"><code>59efef1</code></a></p>
<!-- raw HTML omitted -->
<ul>
<li><code>builder-util-runtime@9.6.3</code></li>
</ul>
<!-- raw HTML omitted -->
<h2>6.8.7</h2>
<h3>Patch Changes</h3>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p><a
href="https://github.com/electron-userland/electron-builder/commit/d6a5aee821138449dc0c082606da6a1bf5ba0798"><code>d6a5aee</code></a>
<a
href="https://github.com/electron-userland/electron-builder/commit/4866737e4fe1f0cca210d318b9ce440f8e978a63"><code>4866737</code></a></p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/electron-userland/electron-builder/commit/bed3a9c421a8a05c49f36a2af5d7ae3598cb1b95"><code>bed3a9c</code></a>
chore(deploy): Release v26.15.0 (electron-updater@6.8.9) (<a
href="https://github.com/electron-userland/electron-builder/tree/HEAD/packages/electron-updater/issues/9825">#9825</a>)</li>
<li><a
href="https://github.com/electron-userland/electron-builder/commit/22a7532bd01b9fb42cff7c58d599c7ad683569fe"><code>22a7532</code></a>
fix: holistic field detection for <code>\&lt;text&gt; (sha256
hash)</code> redaction (<a
href="https://github.com/electron-userland/electron-builder/tree/HEAD/packages/electron-updater/issues/9834">#9834</a>)</li>
<li><a
href="https://github.com/electron-userland/electron-builder/commit/ffd11c79884a0fb4a5604be2302d4c0945a5ef4f"><code>ffd11c7</code></a>
chore(deploy): Release v26.13.0 (electron-updater@6.8.8) (<a
href="https://github.com/electron-userland/electron-builder/tree/HEAD/packages/electron-updater/issues/9793">#9793</a>)</li>
<li><a
href="https://github.com/electron-userland/electron-builder/commit/ac450835015b18720c5bc5de0221b4c770d0fac2"><code>ac45083</code…
## Why this PR

The audit stack (#266 through #284) was structured as 19 stacked PRs,
each one's base pointing at its predecessor in the chain. Each merged
into **its own parent branch**, not into \`develop\`. Net result:
\`develop\` only contains #265, and the other 19 PRs are stranded on
their branch tips.

This PR ships the head of the stack
(\`chore/set-subscription-public-key\`) into \`develop\` so the work
actually lands. It's a single PR with **21 commits** — the linear chain
of the stack — preserving each individual PR's conventional commit
message so semantic-release can categorise them for the next release.

## What's in this PR (in merge order)

| # | Commit | Title |
|---|---|---|
| 1 | \`3412e4e\` | fix(typecheck): unblock pnpm -r typecheck after TS
6.x bump (already merged as squash in develop — no-op overlap) |
| 2 | \`03da9cb\` | fix(editor): stop runtime crashes in MarkdownEditor
|
| 3 | \`07a76d6\` | chore(tooling): replace husky with lefthook, add
knip, tighten lint-staged |
| 4 | \`e27f1ba\` | refactor(stores): use named selectors instead of
destructuring full state |
| 5 | \`c519fc3\` | chore(test): add coverage baseline + smoke tests for
@readied/commands |
| 6 | \`5b1cc55\` | chore(mcp-server): migrate to registerTool API +
FTS5 for read_note |
| 7 | \`0eb49a5\` | fix(backup): integrity-check restored db and roll
back on failure |
| 8 | \`402e280\` | refactor(ipc): add typed IPC registry, migrate
aiKeyHandlers as proof |
| 9 | \`dd4823d\` | refactor(ipc): migrate light handlers to
defineIpcHandler |
| 10 | \`5607100\` | refactor(ipc): migrate heavy data handlers to
defineIpcHandler |
| 11 | \`c51c4d3\` | fix(aiKeyStorage): stop deleting encrypted keys on
transient decrypt errors |
| 12 | \`d5f33ef\` | feat(licensing): add Ed25519 subscription envelope
sign + verify |
| 13 | \`5ba96d4\` | feat(e2e): scaffold Playwright Electron suite + CI
job |
| 14 | \`2bd1396\` | refactor(main): extract FileLicenseStorage and
window state to services |
| 15 | \`fd9b809\` | chore(knip): delete verified-unused files (phase 1)
|
| 16 | \`a3d7c1b\` | chore(knip): remove unused dependencies (phase 2) |
| 17 | \`0ec48b3\` | feat(license): wire Ed25519 signed-envelope
verification at the storage layer |
| 18 | \`cca7e04\` | refactor(storage-sqlite): extract noteMapping
helpers from SQLiteNoteRepository |
| 19 | \`1a0df95\` | refactor(editor): extract theme + highlight from
MarkdownEditor |
| 20 | \`9034c71\` | chore(license): set real SUBSCRIPTION_PUBLIC_KEY |
| 21 | \`390503c\` | docs(api): document LICENSE_SIGNING_PRIVATE_KEY
secret requirement |

Each is already individually reviewed and merged on GitHub (#266#284).
They appear here as their original commits because the stack used
rebase-based stacking, not merge commits.

## Pre-merge verification (local, this branch)

- ✅ \`pnpm -r typecheck\` — green across 18 workspace projects
- ✅ \`pnpm test\` — 17/17 packages
- ✅ \`pnpm build\` — 6/6 packages

## After this PR merges

Per the release flow in \`CLAUDE.md\`:

1. Open \`develop → main\` PR
2. Click \"Run workflow\" on Release action — \`semantic-release\`
analyses these conventional commits and bumps the version
3. Tag push triggers Build workflow — mac/win/linux in parallel
4. All builds green → release un-drafts → electron-updater serves the
update

## Notable behaviour changes for users

- **Editor**: no more blank-window crash on notes with tables (#266) —
root cause was \`Decoration.replace\` over multi-line ranges from a
ViewPlugin instead of a StateField
- **AI keys**: no more silent deletion of keys when keychain is
temporarily locked after sleep/wake (#275)
- **Backups**: corrupt restored DB is now refused and rolled back to a
safety copy (#271)
- **Subscriptions**: client now verifies Ed25519 server signatures
(#281, #284); server-side signing rollout still needed for full effect
- **Tooling**: lefthook replaces husky, knip available for dead-code
audits (#267)
- **Infrastructure**: full IPC surface now validated with Zod at the
boundary (#272 + #273 + #274), Playwright scaffold in place (#277)

## Notable for reviewers

- The placeholder \`SUBSCRIPTION_PUBLIC_KEY\` in #281 was replaced with
a real key in #284. The matching private key is set in Cloudflare as
\`LICENSE_SIGNING_PRIVATE_KEY\` (prod + staging). This keypair was
generated in a Claude session and is dev/staging-grade — rotate before
serving real paid customers.
- 50% of audit findings were Knip false positives or already-fixed
(documented per PR). Stack reflects real debt, not the audit verbatim.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **New Features**
* Added end-to-end testing for the desktop application with
comprehensive smoke and notes testing.
* Implemented IPC handler validation using Zod schemas for improved type
safety.
* Added subscription envelope signing and verification using Ed25519
cryptography.

* **Bug Fixes**
  * Improved encryption error handling and recovery logic.

* **Tests**
* Established centralized test coverage configuration across all
packages.
* Expanded test suites for markdown commands and licensing
functionality.

* **Chores**
  * Transitioned from Husky to Lefthook for Git hooks management.
  * Refactored internal IPC architecture and service modules.
  * Updated build and deployment configurations.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
# Conflicts:
#	apps/desktop/package.json
#	apps/web/package.json
#	package.json
#	packages/ai-core/package.json
#	packages/api/package.json
#	packages/command-registry/package.json
#	packages/commands/package.json
#	packages/core/package.json
#	packages/embeds/package.json
#	packages/licensing/package.json
#	packages/plugin-api/package.json
#	packages/plugin-cli/package.json
#	packages/product-config/package.json
#	packages/storage-core/package.json
#	packages/storage-sqlite/package.json
#	packages/sync-core/package.json
#	packages/tasks/package.json
#	packages/wikilinks/package.json
#	pnpm-lock.yaml
## Summary

The Deploy API workflow has been failing since at least 2026-03-29
(every run since). Root cause: \`pnpm install\` in the Test + Deploy
jobs runs the postinstall scripts of EVERY workspace, including
\`apps/desktop\`'s \`electron-builder install-app-deps\` step that
rebuilds \`better-sqlite3\` against Electron headers via \`node-gyp\`.

That rebuild fails on the Linux + Node 22 runner due to a V8 API
mismatch in better-sqlite3 12.10.0 against the current Electron headers
(\`no matching function for call to 'v8::External::Value()'\` and
similar errors).

The API worker has **nothing to do with** better-sqlite3 or Electron. It
runs on Cloudflare Workers and only needs its own transitive deps.

## Change

\`\`\`diff
-      - run: pnpm install
+      - run: pnpm install --filter '@readied/api...' --ignore-scripts
\`\`\`

Applied in both the \`test\` and \`deploy\` jobs.

- \`--filter '@readied/api...'\` brings in \`@readied/api\` and
everything it depends on (transitive workspace + npm deps), nothing
else.
- \`--ignore-scripts\` is belt-and-suspenders so we don't run
\`install-app-deps\` even if some transitive dep declares a similar
postinstall later.

## Why this is release-blocking

The v0.15.0 release (PR #245) auto-deploys the API to production when it
merges (the workflow runs on \`push\` to main affecting
\`packages/api/**\`). The audit stack modifies
\`packages/api/wrangler.toml\` (documentation comment for
LICENSE_SIGNING_PRIVATE_KEY), which triggers the path filter. Without
this fix, that auto-deploy fails on merge.

## Verification

After this PR merges to develop and the release PR (#245) carries it to
main, the next manually-triggered deploy:
\`\`\`
gh workflow run deploy-api.yml -f environment=staging
\`\`\`
should succeed end-to-end (Test → Deploy → wrangler deploy --env
staging).

🤖 Generated with [Claude Code](https://claude.com/claude-code)

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **Chores**
* Optimized the API deployment workflow's dependency installation
process to use a filtered installation limited to API workspace
dependencies, reducing unnecessary build steps and improving deployment
reliability.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…hase 0 A2) (#291)

## Summary

Phase 0 A2. Restores the version-bump step semantic-release needs to
actually write the new version into the package.json files BEFORE the
git plugin commits them.

## What was broken

The v0.15.0 tag points at a commit where both \`package.json\` and
\`apps/desktop/package.json\` still read \`0.14.0\`:

\`\`\`
$ git show v0.15.0:package.json | jq -r .version
0.14.0
$ git show v0.15.0:apps/desktop/package.json | jq -r .version
0.14.0
\`\`\`

Symptom: electron-updater sees mismatched versions; any consumer reading
from package.json drifts from the tag; ship-it-and-forget-it release
becomes "wait, what version is this?".

### Why

semantic-release pipeline is a chain. Each plugin has a contract.

| Plugin | Contract |
|---|---|
| \`commit-analyzer\` | decides next version |
| \`release-notes-generator\` | writes release notes |
| \`changelog\` | mutates CHANGELOG.md |
| \`exec.prepareCmd\` | **mutates package.json (this step was missing)**
|
| \`git\` | commits the mutated files via \`assets:\` list |
| \`github\` | creates draft release |

The \`assets:\` list in \`@semantic-release/git\` ONLY commits files; it
doesn't create the diff. Without an explicit mutation step, the git
plugin sees no changes to package.json and commits an effectively empty
diff (just the CHANGELOG update).

The original \`scripts/bump-version.js\` performed that mutation, wired
via \`@semantic-release/exec\`. It was deleted in the knip cleanup
(#279) under the false assumption nothing referenced it — knip didn't
scan \`release.config.js\` as an entry point.

PR #289 patched \`release.config.js\` to remove the dangling
\`prepareCmd\`, which made the workflow stop crashing but left versions
stale.

## Fix

1. **\`scripts/bump-version.mjs\`** (new) — pure-ESM, zero dependencies,
updates ONLY the \`version\` field of exactly two files
(\`package.json\` and \`apps/desktop/package.json\`). Preserves existing
trailing-newline. Fails non-zero on missing version arg, unparseable
JSON, or absent version field.

2. **\`release.config.js\`** — re-wires the \`@semantic-release/exec\`
plugin (already a devDep) with \`prepareCmd: 'node
scripts/bump-version.mjs \${nextRelease.version}'\`. Comment block in
the file documents the history so the next maintainer doesn't repeat the
mistake.

Packages with independent release cycles (notably \`packages/api\` on
Cloudflare Workers, \`packages/mcp-server\`) are deliberately NOT in the
target list. If we ever need to bump them, that's a separate concern
with a separate script.

## Verification

\`\`\`
$ node scripts/bump-version.mjs 0.15.1
bump-version: package.json 0.14.0 -> 0.15.1
bump-version: apps/desktop/package.json 0.14.0 -> 0.15.1
bump-version: updated 2 of 2 target(s)
\`\`\`

Edge cases:
- \`node scripts/bump-version.mjs\` (no arg) → \`missing version
argument\`, exit 1
- \`node scripts/bump-version.mjs 0.14.0\` (already at version) →
\`already at 0.14.0, skipped\`, exit 0
- Same version on already-bumped files → idempotent, no diff

- ✅ \`pnpm -r typecheck\` — green
- ✅ \`pnpm test\` — 17/17 packages

## Stack context

Phase 0 A2 of the post-audit devops roadmap. Pairs with #290 (A1,
electron pin). Independent files, can land in any order.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…se 0 A4) (#293)

## Summary

Phase 0 A4. Two guardrails on \`release.yml\` to make a silent or
partial release impossible.

## Why

The v0.15.0 release pipeline failed silently twice:

1. **Silent no-op**: PR #245's squash-merge title (\`release: audit +
Ed25519 signed envelopes + lefthook (v0.15.0) (#245)\`) didn't match a
conventional commit type in \`releaseRules\`. semantic-release exited
cleanly with \"no release\" and the workflow ended green; the operator
only noticed because no tag appeared. We patched this with #289 by
adding a forcing \`feat:\` commit, but the trap will fire again on the
next big squash unless the workflow refuses to silently no-op.
2. **Stale version**: even when the release finally cut, both
\`package.json\` files still read \`0.14.0\` because the deleted
\`scripts/bump-version.js\` was never re-introduced (fixed in PR #291).
Tag points at one version, file content reads another — visible by
anyone running \`jq .version package.json\` against the tag.

## Guardrails

### Pre-flight (dry-run)

\`\`\`yaml
- name: Pre-flight (dry-run) check
  run: |
    npx semantic-release --dry-run 2>&1 | tee /tmp/sr-dry.log
    if grep -qE \"There are no relevant changes\" /tmp/sr-dry.log; then
echo \"::error::semantic-release dry-run: no release will be cut.\"
      exit 1
    fi
    if ! grep -qE \"next release version is\" /tmp/sr-dry.log; then
echo \"::error::semantic-release dry-run did not announce a next release
version.\"
      exit 1
    fi
\`\`\`

Stops the workflow loud and clear before \`--ci\` if commit-analyzer
would have returned \"no release\". Actionable error messages point at
\`release.config.js > releaseRules\` and the commit log.

### Post-flight (version assertion)

\`\`\`yaml
- name: Verify version bump applied
  run: |
expected=$(grep -oE \"next release version is [0-9]+\\.[0-9]+\\.[0-9]+\"
/tmp/sr-dry.log | tail -n 1 | awk '{print $NF}')
    root_v=$(jq -r .version package.json)
    desk_v=$(jq -r .version apps/desktop/package.json)
if [ \"$root_v\" != \"$expected\" ] || [ \"$desk_v\" != \"$expected\" ];
then
      echo \"::error::Version mismatch after semantic-release.\"
      exit 1
    fi
\`\`\`

Re-uses the captured dry-run log to know what version SHOULD have been
written. Catches a misconfigured or skipped \`scripts/bump-version.mjs\`
(PR #291) BEFORE the tag-triggered build downloads the stale
package.json.

## What gets caught

| Trap | Caught by |
|---|---|
| Non-conventional PR title (#245 trap) | Pre-flight: \"no relevant
changes\" |
| Wrong releaseRules / type filter | Pre-flight: \"did not announce next
release\" |
| \`prepareCmd\` missing or wrong path | Post-flight: version mismatch |
| \`bump-version.mjs\` only updated one file | Post-flight: per-file
diff |
| semantic-release crashed mid-cycle | Native exit code from \`Run
semantic-release\` step |

## Verification

I dry-ran the gate logic locally against the current main commit log;
the dry-run output contains the expected lines for both happy-path and
no-op cases. No way to test end-to-end without actually invoking the
workflow.

## Stack context

Phase 0 A4. Independent from A1 (#290), A2 (#291), B-bundle (#292).
Different files / steps; no overlapping changes.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
## Why

develop's lint job has been failing since **2026-04-24** (over a month).
Until this lands, **every Phase 0 PR (#290#294) is structurally
unmergeable** because branch protection requires \`lint\` to pass and
\`strict: true\` requires PRs to match develop's tip.

This is the unblock for the whole post-audit release stack.

## What

Two orthogonal fixes that together get \`pnpm lint\` to **0 errors**.

### 1. \`preserve-caught-error\` × 4 in \`encryptionService.ts\`

Four \`try/catch\` blocks re-throw a wrapped error without attaching the
caught one:

\`\`\`ts
} catch (error) {
  throw new Error(
\`Failed to encrypt content: \${error instanceof Error ? error.message :
'Unknown error'}\`,
+    { cause: error }  // ← lints clean and preserves the stack
  );
}
\`\`\`

Affected throw sites: \`initialize\` (114), \`encrypt\` (261),
\`decrypt\` (292), \`importKey\` (351). The \`{ cause }\` payload is the
standard ES2022 way to chain errors; runtime semantics unchanged.

### 2. mcp-server tsconfig refactor for ESLint projectService

\`packages/mcp-server/tsconfig.json\` was excluding \`src/__tests__\`.
ESLint uses \`@typescript-eslint/parser\` with \`projectService: true\`,
which delegates project discovery to the TypeScript LSP. The LSP walked
up from the test file, found mcp-server/tsconfig.json with the explicit
exclude, and rejected the test → **parsing error: \"was not found by the
project service\"**.

Fix: split build vs editor configs.

- **tsconfig.json** — single source of truth for editors/lint/test.
Includes everything under \`src\`. Adds \`vitest/globals\` to \`types\`.
- **tsconfig.build.json** — extends tsconfig.json, re-adds \`exclude:
[\"src/__tests__\"]\`. Used by the build script.
- **package.json** — \`\"build\": \"tsc\"\` → \`\"build\": \"tsc -p
tsconfig.build.json\"\`.

Confirmed locally:
- \`pnpm lint\` → 0 errors (39 warnings unchanged, all pre-existing
import-x/order).
- \`pnpm --filter @readied/mcp-server build\` succeeds;
\`dist/__tests__/\` does not exist.
- \`pnpm --filter @readied/mcp-server test\` → 5/5 pass.
- \`pnpm -r typecheck\` succeeds.

## Why a separate PR (not bundled with #290 / A1)

A1 is the Electron-pin commit. Mixing in a multi-file lint fix would
muddy what's a release-pipeline change vs a code-hygiene change. Keeping
this separate also means: this PR can go in first, then #290#294 can
rebase one by one and pass CI cleanly.

## Roadmap status

- [ ] **this PR** — lint baseline unblock
- [ ] #290 A1 (electron 41.7.1)
- [ ] #291 A2 (bump-version.mjs)
- [ ] #292 B (workflow surface)
- [ ] #293 A4 (release guardrails)
- [ ] #294 C1 (pr-title commitlint)
- [ ] C2 follow-up — add \`commitlint\` to required checks after #294
lands
- [ ] D — cut v0.15.1
## Why

Phase 0 **C1** of the DevOps cleanup roadmap. After v0.15.0 traced back
to PR #245's squash-merge producing a non-conventional commit message
(`release: audit...`) which semantic-release silently rejected, the
merge gate needs to block non-conventional PR titles **upstream of
merge** — not just whine in CI.

The check already existed as a step inside `ci.yml`'s `lint` job, but it
shipped as a sub-step of a multi-purpose job. Branch protection can only
require whole status checks, so requiring \`lint\` would also block on
ESLint/Prettier failures. Pulling commitlint into its own workflow gives
branch protection a clean, single-responsibility check name to require:
\`PR title / commitlint\`.

## What changes

- **New: \`.github/workflows/pr-title.yml\`** — runs commitlint against
\`github.event.pull_request.title\` on pull_request \`opened\`,
\`edited\`, \`reopened\`, \`synchronize\`.
- **\`ci.yml\`** — drops the duplicated step from the \`lint\` job and
leaves a one-line breadcrumb pointing at the new workflow.

## Security shape

The workflow follows the [GitHub command-injection
guidance](https://github.blog/security/vulnerability-research/how-to-catch-github-actions-workflow-injections-before-attackers-do/):

- \`github.event.pull_request.title\` is **never** interpolated directly
into a \`run:\` script. It passes through \`env:\` as \`PR_TITLE\` and
the shell reads \`\$PR_TITLE\` from the process environment.
- The script uses \`printf '%s' "\$PR_TITLE" | pnpm commitlint\` instead
of \`echo\` — a PR title beginning with \`-e\` or \`-n\` would otherwise
be treated as an echo flag in bash/sh.

## Verification

- \`pnpm commitlint --config commitlint.config.js\` on the local
checkout exits non-zero for \`release: foo\`, \`hotfix: foo\`, \`Add
feature\`; zero for \`feat: foo\`, \`fix(scope): foo\`, \`chore!: foo\`.
- Type enum used: \`feat | fix | refactor | docs | test | chore | style
| perf | ci | build | revert\` (sourced from \`commitlint.config.js\`).

## Follow-ups (Phase 0 C2)

Once this merges, **C2** sets \`PR title / commitlint\` as a required
status check on \`develop\` and \`main\` via \`gh api\` — that's the
step that actually blocks #245-style merges. C1 is the pre-req: required
checks must exist on the default branch before they can be required.

## Roadmap status

- [x] A1 #290 — electron 41.7.1 pin
- [x] A2 #291 — \`scripts/bump-version.mjs\` + release.config.js wire
- [x] B   #292 — workflow surface cleanup
- [x] A4 #293 — release dry-run + version-assertion guardrails
- [x] **C1 (this PR)** — PR-title commitlint standalone
- [ ] C2 — branch protection \`gh api\` (next)
- [ ] D  — cut v0.15.1
…postinstall in setup (#296)

## Why

Two distinct CI issues, both blocking every Phase 0 PR (#290, #292,
#294). Bundling them is OK because they're orthogonal-but-related: both
clear a "lint-or-setup says no, so I can't merge" path on develop.

### Issue 1: Prettier fails on \`CHANGELOG.md\`

semantic-release writes CHANGELOG entries without prettier formatting.
The root \`format:check\` script uses \`--ignore-path .gitignore\`,
which **overrides** Prettier's default \`.prettierignore\` lookup.
CHANGELOG.md correctly isn't gitignored (it's tracked), so it gets
linted, fails, kills lint.

### Issue 2: \`setup\` job fails when native deps don't match the host
Electron

\`setup\` runs \`pnpm install --frozen-lockfile\` (no
\`--ignore-scripts\`). That triggers apps/desktop's \`electron-builder
install-app-deps\` postinstall, which **rebuilds better-sqlite3 from
source against Electron's bundled Node headers**. When better-sqlite3
lags an Electron major (the v0.15.0 incident: Electron 42 +
better-sqlite3 12.10.0, V8 \`External::Value\` signature mismatch), the
rebuild fails and setup dies — taking lint/test/typecheck/build down
with it.

The same shape took down deploy-api.yml (#287) and release.yml (#288).
This brings ci.yml in line.

## What changes

- **\`.prettierignore\`** (new) — CHANGELOG.md + local build artefacts
(.next/, .source/, .astro/, .wrangler/, dist/, out/, release/,
coverage/, pnpm-lock.yaml).
- **\`package.json\`** — \`format\` and \`format:check\` now pass
\`--ignore-path .gitignore --ignore-path .prettierignore\` (Prettier 3.x
supports repeated \`--ignore-path\`).
- **\`.github/workflows/ci.yml\`** — \`setup\` job install:
\`--ignore-scripts\` added with explanatory comment.

## Verification

- \`pnpm format:check\` locally → "All matched files use Prettier code
style!"
- CI doesn't need a runtime-functional better-sqlite3: lint and
typecheck don't load native modules, and \`pnpm test\` excludes
storage-sqlite per CLAUDE.md.

## Order of operations

After this lands → rebase #290 / #292 / #294 → CI green → merge them in
order → cut v0.15.1.
…pat (Phase 0 A1) (#290)

## Summary

Phase 0 A1 of the post-audit devops roadmap. **Unblocks v0.15.x Build.**

The v0.15.0 Build workflow failed on all 3 platforms (run
[27184736470](https://github.com/tomymaritano/readide/actions/runs/27184736470))
because **better-sqlite3 12.10.0 explicitly removed Electron v42
prebuilds**
([WiseLibs/better-sqlite3#1470](WiseLibs/better-sqlite3#1470)).
Without a prebuild, \`electron-builder install-app-deps\` falls through
to a source build via \`@electron/rebuild\`, which then hits V8 13.x API
breakages:
- \`SetNativeDataProperty\` ambiguity (3 candidate overloads)
- \`External::Value()\` requires \`ExternalPointerTypeTag\` argument
- \`External::New()\` signature change

Same root cause on Linux/macOS (GCC/clang) and Windows (MSVC).

## Fix

Pin Electron to \`^41.7.1\` (latest 41.x as of 2026-05-26).
better-sqlite3 has prebuilts for it.

## Local validation

\`\`\`
apps/desktop postinstall: electronVersion=41.7.1 arch=arm64
apps/desktop postinstall: buildFromSource=false
apps/desktop postinstall: preparing       moduleName=better-sqlite3
apps/desktop postinstall: finished        moduleName=better-sqlite3
apps/desktop postinstall: completed installing native dependencies
\`\`\`

\`buildFromSource=false\` = the prebuilt was found and consumed; no V8
errors.

- ✅ \`pnpm install\` (with scripts) — succeeds
- ✅ \`pnpm -r typecheck\` — green
- ✅ \`pnpm test\` — 17/17 packages

## When to bump back to 42

Watch [WiseLibs/better-sqlite3
releases](https://github.com/WiseLibs/better-sqlite3/releases) for v42
prebuild restoration. As of 2026-06-09 there's no public ETA. When it
lands: bump electron to \`^42.x\` + better-sqlite3 to the version that
re-includes v42 prebuilds, in a single PR.

## Stack context

This is **A1** of Phase 0 (devops stabilization). A2-A4, B1-B5, C1-C2, D
follow in subsequent PRs against develop.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **Chores**
  * Updated the runtime dependency for the desktop application.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
## Summary

Phase 0 B-bundle of the post-audit roadmap. Six independent fixes
batched into one PR because they all touch the workflow YAML surface and
reviewing them together is faster than three ping-pong PRs that all
conflict on the same files.

## docs.yml

| Change | Why |
|---|---|
| \`pnpm install\` → \`pnpm install --filter '@readied/web...'
--ignore-scripts\` | Marketing-site install was the last workflow still
firing apps/desktop's \`electron-builder install-app-deps\` step that
fails on Linux + Node 22. Same shape as #287 (deploy-api) and #288
(release). |
| Added \`permissions: contents: read\` | Cloudflare Pages deploy
doesn't need anything beyond checkout |
| Build step moved into \`working-directory: apps/web\` | Was inline
\`cd apps/web && ...\` — explicit working-directory reads better |

## build.yml

| Change | Why |
|---|---|
| \`windows-latest\` → \`windows-2025-vs2026\` | GitHub announced
\`windows-latest\` migration to that image on **2026-06-15** (6 days
from this commit). Pinning ahead avoids a surprise toolchain swap
mid-release. |
| Removed \`FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true\` env | This was
the migration toggle for the Node 20→24 actions rollout. With all
actions now on @v5 (Node 24-native) it's no-op. |
| Artifact upload \`if-no-files-found: ignore\` → \`error\` | Silent
zero-asset releases are worse than a failed upload. If electron-builder
swallowed an error, signing failed, working-directory drifted, etc., we
want loud failure here, not a release un-drafted with no installers. |

## release.yml

| Change | Why |
|---|---|
| Removed \`HUSKY: '0'\` env | Leftover from the husky → lefthook
migration in #267. Lefthook only reads .git/hooks if those files exist;
on fresh CI clones they don't. |

## deploy-api.yml

| Change | Why |
|---|---|
| Added \`permissions: contents: read\` | Cloudflare deploy doesn't push
commits or create issues; minimum-privilege default. |

## Action versions sweep (all 8 workflows)

| From | To |
|---|---|
| \`actions/checkout@v4\` | \`@v5\` |
| \`actions/setup-node@v4\` | \`@v5\` |
| \`actions/cache@v4\` | \`@v5\` |
| \`actions/cache/save@v4\` | \`@v5\` |
| \`actions/cache/restore@v4\` | \`@v5\` |
| \`actions/upload-artifact@v4\` | \`@v5\` |

GitHub announced Node 20-based actions deprecation on **2026-06-16** (7
days from this commit). The \`@v5\` family runs on Node 24.

## Verification

- ✅ \`pnpm -r typecheck\` — green
- ✅ \`pnpm test\` — 17/17 (untouched)
- ✅ YAML parsed locally; no syntax errors

## Stack context

Phase 0 B-bundle. Pairs with #290 (A1 electron pin) and #291 (A2
bump-version). Independent files, can land in any order.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
## Why

v0.15.1 Build run (27212685957) failed on linux:

\`\`\`
⨯ failed to build AppImage error=executableName contains characters that
  cannot be safely used in file paths: @readieddesktop. Please use only
  letters, digits, hyphens, underscores, dots, and spaces.
\`\`\`

electron-builder defaults Linux's \`executableName\` to the package.json
\`name\` field, stripped of unsafe chars. \`@readied/desktop\` →
\`@readieddesktop\`, still leading with \`@\`, still invalid.

mac and win didn't fail because they use \`productName\` ("Readied") and
the \`appId\` (\`app.readied.desktop\`) respectively — Linux is the
strict one for the on-disk binary name.

## Fix

Add \`linux.executableName: "readied"\` to apps/desktop/package.json's
\`build\` config.

## Knock-on

v0.15.1 Build flow was:
1. linux job ⨯ fails at AppImage step
2. \`publish\` job (\`needs: build\`) skipped
3. \`sync-develop\` (\`needs: publish\`) skipped
4. Release left with no binary assets, no electron-updater feed

After this lands, the next Release will produce binaries for all 3
platforms.

## v0.15.1 cleanup

The published v0.15.1 GitHub Release will be marked as draft via gh api
so it doesn't surface to users with electron-updater. v0.15.2 will be
cut after this PR merges.
@vercel

vercel Bot commented Jun 9, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
readide Ready Ready Preview, Comment Jun 9, 2026 2:54pm

@github-actions github-actions Bot added dependencies Pull requests that update a dependency file ci app:desktop labels Jun 9, 2026
@github-actions
github-actions Bot enabled auto-merge (squash) June 9, 2026 14:46
@coderabbitai

coderabbitai Bot commented Jun 9, 2026

Copy link
Copy Markdown

Review Change Stack

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

Run ID: b065a837-032a-40bc-a311-f5f7a30f3879

📥 Commits

Reviewing files that changed from the base of the PR and between 2b5ea9e and 002a49e.

⛔ Files ignored due to path filters (1)
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
📒 Files selected for processing (17)
  • .github/workflows/build.yml
  • .github/workflows/ci.yml
  • .github/workflows/codeql.yml
  • .github/workflows/deploy-api.yml
  • .github/workflows/docs.yml
  • .github/workflows/pr-title.yml
  • .github/workflows/release.yml
  • .prettierignore
  • CHANGELOG.md
  • apps/desktop/package.json
  • apps/desktop/src/main/services/encryptionService.ts
  • package.json
  • packages/mcp-server/package.json
  • packages/mcp-server/tsconfig.build.json
  • packages/mcp-server/tsconfig.json
  • release.config.js
  • scripts/bump-version.mjs

📝 Walkthrough

Walkthrough

This PR consolidates DevOps improvements and version alignment for release v0.15.1. GitHub Actions workflows are upgraded to v5 with stricter failure modes and minimal permissions. PR title validation is extracted to a dedicated workflow. The release pipeline gains pre-flight and post-flight verification gates. Packages are versioned consistently, build tooling is reconfigured, and error handling in EncryptionService is enriched with cause chains.

Changes

CI/CD Pipeline Modernization

Layer / File(s) Summary
GitHub Actions version upgrades and hardening
.github/workflows/build.yml, .github/workflows/ci.yml, .github/workflows/codeql.yml, .github/workflows/deploy-api.yml, .github/workflows/docs.yml
All workflows upgraded from action v4 to v5. Windows runner pinned to windows-2025-vs2026. Artifact upload changed to if-no-files-found: error. Dependency installs skip postinstall scripts with --ignore-scripts. Permissions blocks added to deployment workflows.
PR title validation extraction
.github/workflows/pr-title.yml, .github/workflows/ci.yml
Commitlint PR title check moved from ci.yml lint job to new dedicated pr-title.yml workflow. PR-title workflow runs on open/edit/reopen/synchronize events with contents: read permissions and per-PR concurrency.
Release pipeline gates and version automation
.github/workflows/release.yml, release.config.js, scripts/bump-version.mjs
Semantic-release now runs dry-run pre-flight gate to validate a release would be cut. Post-flight step verifies both root and apps/desktop/package.json match the bumped version. New scripts/bump-version.mjs script syncs version fields across monorepo targets during release prepare.

Application Versioning and Configuration

Layer / File(s) Summary
Build tooling and formatting configuration
.prettierignore, packages/mcp-server/package.json, packages/mcp-server/tsconfig.build.json, packages/mcp-server/tsconfig.json
Prettier ignore configured for build artifacts, caches, and lock files. MCP server build script targets tsconfig.build.json that excludes tests. TypeScript includes Vitest global types.
Package versioning and formatting scripts
package.json, apps/desktop/package.json
Root and desktop package versions bumped from 0.14.0 to 0.15.1. Root format scripts expanded to include json and md files.
Desktop app dependencies and configuration
apps/desktop/package.json
Electron devDependency pinned to ^41.7.1 (from ^42.3.3). Linux packaging configuration updated with explicit artifactName format and executableName: "readied".
Code quality and release documentation
apps/desktop/src/main/services/encryptionService.ts, CHANGELOG.md
EncryptionService catch blocks now throw errors with original error attached as { cause: error } for better debugging. Changelog entry for v0.15.1 documents bug fixes from Phase 0 DevOps stabilization.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly related PRs

  • tomymaritano/readide#297: Makes overlapping concrete edits across release pipeline (release.config.js, scripts/bump-version.mjs) and CI guardrails (action versions, artifact error handling), plus matching EncryptionService cause-chain updates.
  • tomymaritano/readide#290: Both PRs pin the Electron dependency in apps/desktop/package.json from ^42.3.3 to ^41.7.1.
  • tomymaritano/readide#157: Both PRs modify semantic-release setup to run a version-bump script (scripts/bump-version.*) during the release prepare step.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch develop

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: c9acaa4c80

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread .github/workflows/ci.yml
# 12.10.0). Same pattern used in release.yml and deploy-api.yml.
- name: Install dependencies
run: pnpm install --frozen-lockfile
run: pnpm install --frozen-lockfile --ignore-scripts

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Rebuild native desktop deps before E2E

When the PR CI reaches the e2e job, it restores the node_modules cached by this setup step and then launches the Electron app (apps/desktop/e2e/fixtures.ts); startup calls initDatabase() and require('better-sqlite3') via @readied/storage-sqlite (apps/desktop/src/main/index.ts, packages/storage-sqlite/src/database.ts). Installing with --ignore-scripts skips both better-sqlite3's native install and the desktop electron-builder install-app-deps rebuild, so the Electron process will fail before the E2E assertions can run. Either rebuild/install the desktop native module in the E2E job or avoid sharing this ignored-scripts install there.

Useful? React with 👍 / 👎.

## Why

semantic-release's \`@semantic-release/git\` plugin pushed two commits
directly to main during the v0.15.1 release:
- CHANGELOG.md update for v0.15.1 release notes
- \`chore(release): v0.15.1 [skip ci]\` (package.json +
apps/desktop/package.json bumped to 0.15.1)

These need to come back to develop so develop stays a superset of main.
The \`sync-develop\` job in build.yml normally does this automatically,
but it was skipped on the v0.15.1 Build run because the \`publish\` job
was skipped (linux failed).

Doing it manually here so #299 (develop → main for v0.15.2) is
mergeable.

## What's in the merge

\`CHANGELOG.md\`, \`package.json\`, \`apps/desktop/package.json\`
(3-file delta). No conflicts.

## Note

After this merges, #299 (develop → main, cuts v0.15.2) will be
up-to-date and mergeable.

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
@tomymaritano

Copy link
Copy Markdown
Collaborator Author

Closing: #300 sync merged via squash lost main↔develop ancestry, so this PR is permanently BEHIND. Replacing with a direct cherry-pick to main.

auto-merge was automatically disabled June 9, 2026 14:55

Pull request was closed

github-actions Bot pushed a commit that referenced this pull request Jun 9, 2026
## Why

v0.15.1 Build (run 27212685957) failed on linux because electron-builder
rejected the AppImage build: \`executableName contains invalid chars:
@readieddesktop\`. publish job (\`needs: build\`) was skipped, no
binaries reached the GitHub Release, v0.15.1 has been marked draft.

This brings the linux fix from #298 (already on develop) into main as a
cherry-pick so semantic-release can cut v0.15.2.

## Why not the original develop → main PR (#299)

I created a sync PR (#300) earlier to bring main's release-cycle commits
(CHANGELOG + version bump) back to develop. Squash-merging that sync PR
collapsed the merge ancestry — develop has main's content but not main's
commit history, so #299 stayed permanently BEHIND.

Cherry-picking the linux fix straight to main sidesteps that. After this
lands and Release cuts v0.15.2, the auto sync-develop job in build.yml
will bring the v0.15.2 release commits back to develop with proper
ancestry.

## Diff

\`apps/desktop/package.json\`: \`"executableName": "readied"\` added to
\`build.linux\`. Single line. mac+win already build cleanly because they
use \`productName\` ("Readied") and \`appId\` (\`app.readied.desktop\`)
respectively.

## Expected Build flow

semantic-release reads main's commit log since v0.15.1:
- \`fix(desktop): set linux.executableName for AppImage build (#298)\` →
patch bump

→ v0.15.2 cut as draft → Build runs on mac/win/linux → all 3 publish to
draft → \`publish\` job undrafts → \`sync-develop\` PRs main → develop.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

app:desktop ci dependencies Pull requests that update a dependency file size/L

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant