Lossless Changelog
fleet

The whole plugin family gets current in one day — ten repos, three passes, every build green

A researched dependency campaign swept nine plugin modules plus the umbrella: TypeScript 6 and ESLint 10 everywhere, twenty-two dead dependencies removed, a GPL relicense dodged, two marketplace blockers fixed — and the umbrella's build went from 3,910 errors to zero.

Michael StatonMusic Editoraugmented with Claude Code on Claude Fable 5

Why Care?

Dependency drift is the tax every plugin family pays quietly until the bill arrives all at once — a forced migration at the worst moment, a security alert about code you forgot you shipped, a marketplace rejection over a version string. Today we paid the tax deliberately instead: a three-pass campaign (patch/minor sweep → researched majors → forks), defined durably in context-v/loops/ and inventoried in context-v/plans/, executed across every Lossless-original plugin in one sitting. Every module was proven green — typecheck, lint where configured, production bundle — before its commit landed.

What's New?

  • TypeScript 5.8 → 6.0.3 and ESLint 9 → 10.7 everywhere. Every tsconfig migrated properly off the options TypeScript 7 will remove (moduleResolution: "node" → "bundler", baseUrl/paths dropped) — no ignoreDeprecations escape hatches. The family is now clean-on-6, which Microsoft guarantees compiles identically on the 10×-faster native TypeScript 7 when we choose to jump.

  • Twenty-two dead dependency declarations removed across six repos. The starter template's never-imported fastify / @modelcontextprotocol/sdk / zod trio (plus an accidental package literally named dev, an unused open, and two deprecated @types/* stubs) had been inherited by module after module. Purged everywhere — including in filestarter itself, so future scaffolds start clean.

  • A GPL relicense dodged by deletion: typed.js v3 went MIT → GPL-3.0; metafetch rebuilt the typing animation in ~100 lines of its own TypeScript and dropped the dependency. Bundle −18%.

  • @types/node pinned to reality: Obsidian ships Electron 39 = Node 22, so every module now pins ^22 — several moved down from 24/25, whose types describe APIs the runtime doesn't have.

  • The big API deps crossed on research, not luck: googleapis 158 → 173 and @anthropic-ai/sdk 0.92 → 0.115 both landed with zero code changes (the release notes told us why that was safe before we moved); marked 9 → 18 needed exactly one line.

  • Marketplace blockers fixed: the umbrella and image-wrangler both carried 4-digit 0.0.0.1 versions (and minAppVersion set to themselves) — now strict 3-digit semver across manifest/package/versions.

  • The umbrella build resurrected: its typecheck had been failing with 3,910 errors (it was sweeping splash/ and every submodule into its own compile). Scoped excludes + five genuine bug fixes in main.ts — including two citation commands and the Freepik key-update path that would have thrown at runtime — took it to zero.

Under the Hood

The repeating TS 6 mechanics, for anyone crossing the same bridge: the types: [] default flip silently removes Node globals (crypto, child_process) until you declare "types": ["node"]; bundler resolution starts type-checking side-effect CSS imports (one ambient *.css declaration fixes it); and noUncheckedIndexedAccess catches real out-of-range indexing — it flagged two spots in metafetch's new typewriter before the code ever ran.

Per-module stories live in each repo's own changelog/2026-07-24_01.md: cite-wide, image-gin, metafetch, perplexed, plunk-it, lmstud-yo, filestarter, file-transporter, and image-wrangler (its first-ever entry).

What's Not Done

  • Pass C (forks): obsidian-git awaits explicit sign-off — its CLAUDE.md still says "do not modify," and the right move is likely an upstream sync, not independent bumps.

  • Deferred with reasons: TypeScript 7 (next campaign, from the paid-up 6.x position) and typed.js 3 (resolved by removal instead).

  • grab-reference sat the campaign out — it turned out to be a citation-manager web stack, not an Obsidian plugin; its fate is an open question in context-v/issues/What-To-Do-With-Grab-Reference.md.

  • Human rung: the plugins deserve a sandbox-vault smoke test — metafetch's rebuilt animation and the umbrella's revived commands most of all.

Tracking: content-farm#7