TunaKit 1.13.0
-
Breaking: catalogs are now two sibling kinds.
Catalogvendsobjectsand
is a source: it feeds subject and target search, carries a search priority,
and is listed in Sources. The newActionCatalogvends
actions: [CatalogAction]and is none of those things. It is not a refinement
ofCatalog, so a catalog that mixes items and actions can no longer be
written. See ADR 0006. -
Breaking:
ExtensionDeclarationgainsactionCatalogs: [ActionCatalogDeclaration].
Action catalogs must be declared there, never incatalogs.catalogsnow
defaults to[], so an extension may contribute only actions. Both kinds share
one identifier namespace. -
Breaking:
appActionEnrichmentsanddefaultActionRankingsmust reference
action catalogs. Naming a source catalog is a declaration error. -
Breaking: app action enrichment is purely additive. Naming an action
catalog for an app no longer removes it from anywhere else — it only orders it
for that app. Where an action applies is decided solely by
supportedSubjectTypesandsubjectPredicate. Extensions that mirrored their
actions through a search catalog to work around the old behavior should delete
the mirroring. -
Action catalogs have no scan lifecycle: no
scan(), noreportScanFinished(),
no retained-state release. They are built from anActionCatalogDefinition,
which carries only an identifier and a name — no enablement, advanced flag, or
settings. A setting that configures a verb belongs in the extension's own
settings. -
Added
ActionAvailabilityProviding, for an action that cannot run under
current conditions — its app is not installed, a permission was refused, it has
nothing to operate on. Unavailable actions are filtered wherever actions are
matched to a subject. This replaces the scan-to-empty signal that action
catalogs no longer have. It is read during search, so keep it cheap. -
Added
MainWindow.playTransition(_:duration:animations:finalState:completion:)
andMainWindow.AnimationDirection. Themes that need their own show/hide
animations can now add them to the content layer while TunaKit keeps owning
the transition lifecycle: superseding an in-flight transition, the
animationsEnabledbypass, and ordering the window out after a hide.
playShowAnimationsandplayHideAnimationsare wrappers over it and keep
their signatures;playHideAnimationsnow orders the window out itself when
the hide completes, so themes no longer have to.