FoldingText 3.0.21 Release Notes
Extensions: plugin-to-plugin dependency resolution (`requires`); bump to 3.0.21
Release Notes
[3.0.21] — 2026-06-29
New
- Add an optional
requires map to plugin manifests (identifier → version
Other
- requirement, same comparator format as
engines). Installing a plugin
- (sidebar or deep link) now downloads, installs, and enables each declared
- dependency first — recursively, so transitive deps resolve — before the
- requesting plugin.
- Manifest:
requires field (forward-compatible; older builds ignore the
- unknown key),
requiredPlugins, version(_:satisfies:), and a pure
- authoring-time
detectDependencyCycle(in:). versionComparator made static.
- ExtensionManager:
installExtensionWithDependencies(from:for:inFlight:) —
- recursive install with an in-flight ancestor set that guarantees termination
- on self-references and cycles. Already-satisfied deps are reused/re-enabled,
- not re-downloaded. Best-effort: the parent installs even if a dep can't be
- satisfied, with warnings.
- Surface failures via
.extensionDependencyWarning, shown by the app scene
- ("Required Plugin Not Installed"). Wired into both install entry points
- (deep link in FoldingTextApp, sidebar ActionButton).
- Tests: ManifestDependencyTests (decoding, version satisfaction, cycle
- detection); mock conformance + lint touch-ups in Bridge/PluginLoading tests.
- Docs: distribution.md + foldingtext-plugin skill manifest reference.
- filter.ftplugin now declares
requires jkpanel (0.5.4 → 0.5.5); jmkpanel
- lint cleanup (@ts-ignore → @ts-expect-error).
- App version 3.0.19 → 3.0.21.
← Back to Releases