chore(deps): jsdom 30, knip 6, Kotlin 2.4.10 / Gradle 9.7.1 / commonmark 0.30 — with the code changes the bumps need - #377
Merged
Conversation
…s CSS through the CSSOM Supersedes dependabot #271, which was red on tests/dialog-shell.test.tsx. Why the test change: jsdom 30's cssstyle re-serializes math functions on the way in — `min(476px, calc(100vh - 6rem))` reads back as `min(476px, -6rem + 100vh)` (jsdom 29 echoed the source text). The two assertions compared the panel's inline style to the raw DIALOG_MAX_HEIGHTS constant, so they were pinning jsdom's spelling rather than the Dialog's behaviour. They now round-trip the constant through the same CSSOM and compare against that, with a non-empty guard so a jsdom that silently drops the value cannot pass as '' === ''. jsdom 30 also parses `height: min(...)` (29 dropped it), so the fill test reads `.style.height` directly instead of the attribute. Full desktop suite under jsdom 30: 606 files / 7790 tests passed. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017RfiCWxEQuKBW4vM7GWkhY
…30.0) — kotlinOptions → compilerOptions, createTempDir → createTempDirectory Supersedes dependabot #338 (4 updates: org.jetbrains.kotlin.android 2.1.0 → 2.4.10, org.jetbrains.kotlin.plugin.compose 2.1.0 → 2.4.10, gradle wrapper 9.6.1 → 9.7.1, org.commonmark:commonmark 0.29.0 → 0.30.0). The wrapper jar is the one from dependabot's branch. Why the accompanying changes: - app/build.gradle.kts: Kotlin 2.4 removed the `android { kotlinOptions {} }` DSL (deprecated since 2.0), so the build script itself no longer compiled. Replaced with the top-level `kotlin { compilerOptions { jvmTarget } }` DSL. - Three JVM unit tests used kotlin.io.createTempDir(), whose deprecation is a compile ERROR in Kotlin 2.4; migrated to kotlin.io.path.createTempDirectory, the same replacement PluginInstallerUpgradeTest already used. Verified in the worktree with `JAVA_HOME=java-21 ANDROID_HOME=~/.android-sdk ./gradlew test -x bundleWebUi`: BUILD SUCCESSFUL, 636 tests / 0 failures across debug, release, releaseTest. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017RfiCWxEQuKBW4vM7GWkhY
… three OS binaries it now detects Supersedes dependabot #270, which was red because `npm run knip` exited 1. What actually changed the exit code: knip 6 reads the command name out of child_process execFile/spawn calls and reports "unlisted binaries" (`ss`, `tasklist`, `rclone`) — a category whose rule defaults to error. Verified by running knip 6 with `--exclude binaries` on the same tree: exit 0. The 77 unused exports / 172 unused types are NOT new — they were already `warn` (knip 5 reported 81 / 379 on the same tree and exited 0), so no code was deleted. knip.jsonc changes, each per a knip 6 configuration hint: - $schema → knip@6; `classMembers` rule dropped (issue type removed in v6). - entry: main.ts / renderer/index.tsx / vite.config.ts removed — the vite and electron plugins derive them, and listing them is flagged as redundant. - ignore `dist/**` removed (redundant; never under `project`). - project now includes .css so CSS `@import`s are followed; that lets knip see `@import "tailwindcss"` in globals.css, so the tailwindcss ignoreDependencies entry is gone too. - ignoreBinaries: ss (Linux, engine-supervisor port owner lookup), tasklist (Windows, sync PID liveness), rclone (Drive sync transport, user-installed). `binaries` stays at error so a NEW unlisted binary still fails CI. Result: `npm run knip` exits 0 with zero configuration hints. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017RfiCWxEQuKBW4vM7GWkhY
This was referenced Sep 1, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Lands three dependabot bumps that were red because each needs a small accompanying change. Supersedes #271 (jsdom), #338 (gradle group), and #270 (knip) — those can be closed once this merges. Also unblocks the knip prerequisite for the TypeScript 7 bump (#242).
One commit per bump:
jsdom 29.1.1 → 30.0.1 (supersedes #271)
tests/dialog-shell.test.tsxfailed because jsdom 30's CSSOM re-serializes math functions on the way in:min(476px, calc(100vh - 6rem))reads back asmin(476px, -6rem + 100vh). The two assertions compared the panel's inline style to the rawDIALOG_MAX_HEIGHTSconstant, so they were pinning jsdom's spelling rather than the Dialog's behaviour. They now round-trip the constant through the same CSSOM and compare against that, with a non-empty guard so a jsdom that silently drops the value can't pass as'' === ''. jsdom 30 also parsesheight: min(...)(29 dropped it), so the fill test reads.style.heightdirectly.Gradle group: Kotlin 2.4.10, Gradle 9.7.1, commonmark 0.30.0 (supersedes #338)
Same four versions dependabot proposed (wrapper jar taken from its branch).
app/build.gradle.kts: Kotlin 2.4 removed theandroid { kotlinOptions {} }DSL, so the build script itself stopped compiling → migrated to top-levelkotlin { compilerOptions { jvmTarget.set(JvmTarget.JVM_17) } }.kotlin.io.createTempDir(), which Kotlin 2.4 makes a compile error → migrated tokotlin.io.path.createTempDirectory(the replacementPluginInstallerUpgradeTestalready used).knip 5.88.1 → 6.32.2 (supersedes #270)
What actually made
npm run knipexit 1 is one new category: knip 6 reads command names out ofexecFile/spawncalls and reports "unlisted binaries" (ss,tasklist,rclone), which defaults to error. Verified: knip 6 with--exclude binariesexits 0 on the same tree. The 77 unused exports / 172 unused types are not new — they were alreadywarn(knip 5 reports 81 / 379 on the same tree and exits 0), so no code was deleted.knip.jsoncchanges, each per a knip 6 configuration hint (all WHY-commented in the file):$schema→ knip@6;classMembersrule dropped (issue type removed in v6).entry:main.ts/renderer/index.tsx/vite.config.tsremoved — the vite and electron plugins derive them; listing them is flagged as redundant.ignore: ["dist/**"]removed (redundant).projectnow includes.cssso CSS@imports are followed; that lets knip see@import "tailwindcss"inglobals.css, so thetailwindcssignoreDependencies entry is gone too.ignoreBinaries:ss(Linux, engine-supervisor port-owner lookup),tasklist(Windows, sync PID liveness),rclone(Drive sync transport, user-installed).binariesstays at error so a new unlisted binary still fails CI.Result:
npm run knipexits 0 with zero configuration hints.Verification
bash scripts/verify.sh worktrees/deps-desktop→ OK — all checks passed (tsc, full vitest suite 606 files / 7790 tests, knip, eslint, ast-grep).JAVA_HOME=java-21 ANDROID_HOME=~/.android-sdk ./gradlew test -x bundleWebUi→ BUILD SUCCESSFUL, 636 tests / 0 failures across debug, release, releaseTest.For the reviewer
cssSerialized) is the one judgement call: it asserts "the panel carries exactly this cap as the CSSOM serializes it" rather than a literal string. The non-empty guard is what keeps it from being vacuous.🤖 Generated with Claude Code
https://claude.ai/code/session_017RfiCWxEQuKBW4vM7GWkhY