Menu bar status item while IconCraft is open: Open IconCraft,
Keep Skins Applied live toggle (reads/writes the LaunchAgent via
the session API), plain-English keeper status, App Management
Settings, Support, Quit. Skins themselves live on disk; only the
repair keeper is background.
Keeper intent is now journalled (KeeperDesired/KeeperSet): the
toggle records it, and the app restores the agent at launch and on
each keeper pass if it went missing — observed live: an external
actor (CleanMyMac's agent manager is present on the dev Mac)
deleted the plist; IconCraft now self-heals and logs it.
JXA retention fix: status item, its delegate/menu, and the window
delegate are function-scoped (var) instead of block-scoped const —
the JS engine was collecting the wrappers, killing the status item
after a while and silently breaking window-close-quit. Both
verified live via CUA + System Events AX (menu contents, keeper
toggle off/on, plist sabotage -> restored, close -> clean quit).
Full suite green.
Co-authored-by: Cursor <cursoragent@cursor.com>