22-Oct-2026
- Reviewed MOFA community-script pull requests #26-#41 (merged 21-Oct-2026) against the unified workflow
- ⚠️ Breaking Change: ⚠️
reset_onenote(and thereforereset_factory) no longer deletes the OneNote container (~/Library/Containers/com.microsoft.onenote.mac), which holds the local sync cache, including notes not yet synced to the cloud; MOFA and the package-era workflow both keep it. Addremove_onenote_data, which requires destructive confirmation in interactive modes, to any policy that relied on the old behavior - Reset operations (
reset_word,reset_excel,reset_outlook,reset_onenote,reset_onedrive,reset_teams,reset_teams_force,reset_autoupdate) now ask apps to quit (SIGTERM), wait 2 seconds only when something was running, then force-quit (SIGKILL) anything left;reset_factorydoes the same for all Microsoft apps with one 3-second wait.reset_powerpoint,remove_*operations, andremove_acrobat_addinstill force-quit immediately, matching MOFA reset_license/reset_credentialswait 2 seconds after signaling running Office apps, and only when one was running, before removing licensing and keychain itemsreset_credentialsnow removes everyOneAuthAccountkeychain item instead of only the first- Repeated keychain deletions stop after 50 items per label, service, or creator and log a
WARNING, so a delete that reports success but leaves the item cannot loop forever remove_officenow also removes/Applications/Microsoft AutoUpdate.appand~/Library/Application Support/OneDriveremove_outlook_datanow also removes the legacy Outlook 2016 data folder (~/Library/Application Support/Microsoft/Outlook) and Outlook caches, WebKit data, saved state, and cookiesremove_skypeforbusinessnow also removes Skype for Business application support data, caches, saved state, and cookiesremove_webexptnow removes/Library/LaunchAgents/com.webex.pluginagent.plist(previously left in place, so the agent reloaded at the next login) and two more WebEx preference files, stops WebEx Productivity Tools processes by install path, and runs the native uninstaller only when presentremove_zoompluginnow targets the paths Zoom'sZoomMacOutlookPlugin.pkginstalls: plugin preferences, the per-user install folder, the pre-5.x scripting addition, and the system log; stops the plugin agent and launcher; and runs the native uninstaller only when present. It no longer deletes~/Library/Preferences/ZoomChat.plist, which belongs to the Zoom app rather than the Outlook pluginremove_office,remove_outlook_data,remove_skypeforbusiness,remove_webexpt, andremove_zoompluginnow flush cached preferences (console user androotonly) before deleting preference files, socfprefsdcannot write them back- Auto-repair runs the deep code-signature check once per app instead of twice when a bundle fails verification
- Auto-repair now logs a
WARNINGwhen a package's download size cannot be verified (noContent-Length); the Microsoft signature check still decides whether the package installs - GHSA-gw3c-6fvh-7gqm (root-private download staging, Teams backgrounds handled as the user) was already addressed in
2.0.1; no further change
- ⚠️ Breaking Change: ⚠️
- Addressed findings from a pre-release review
reset_factorynow requires the destructive-action confirmation in interactive modes (silentis unchanged), because it deletes the Office group container (~/Library/Group Containers/UBF8T346G9.Office), including local Outlook data, Office templates, and custom dictionaries; its picker description no longer says it will not remove personal documentsreset_factorynow archives classic Teams backgrounds to~/Teams_Old_Backgroundsbefore its cleanup deletes~/Library/Application Support/Microsoft; previously they were deleted beforereset_teamscould archive them. If the archive fails,reset_factorystops before cleanup and fails (exit20)remove_defender,remove_zoomplugin, andremove_webexptrun a vendor uninstaller only when it and every parent directory are root-owned and not writable by non-admin users (admin-group write is allowed); otherwise the uninstaller is skipped with a log entry and files are removed directly, andremove_defenderfails (exit20)- Repeated keychain deletions now fail the operation (exit
20) when matching items remain, whether the 50-item limit was reached or a delete failed; previously the operation could report success remove_webexptnow also stopswebexmtaby exact process name, matching MOFA- The login-keychain search-list check no longer writes
securityoutput to the client log ordebugtraces
- Reliability fixes
- Keychain cleanup now reaches the console user's login keychain when root's
HOMEis not the console user's home folder (for example, a root shell opened from an admin account, or a management agent running withHOME=/var/root). macOSsudokeeps the caller'sHOME, sosecuritysearched only the System keychain, every lookup reported "not found", andreset_credentials,reset_license,reset_outlook,reset_onedrive,reset_teams,reset_teams_force, andremove_skypeforbusinesssilently left sign-in items in place. Console-user commands now run withsudo -H, and aWARNINGis logged if the login keychain is still missing from the user's keychain search list
- Keychain cleanup now reaches the console user's login keychain when root's
- Documented intentional divergences from current MOFA behavior
remove_zoompluginandremove_skypeforbusinessdo not remove Dock entries (MOFA uses a bundleddockutil; this repo adds no third-party dependency)remove_webexptstops WebEx Productivity Tools processes by install path instead of MOFA's barepluginagentpattern, so other vendors' plugin agents keep running- Auto-repair warns instead of failing when the server reports no
Content-Length; MOFA fails the repair. A reported size that does not match the download still fails the repair
- Internal
AGENTS.mdand.githubinstructions:runAsUsermust keepsudo -Hso console-user commands see the console user'sHOMEscripts/mofa-consult.zshadds aMOFA Last Changedcolumn and anUpstream Changes Since Local Scriptsection, which list mapped MOFA scripts committed after the last commit ofMicrosoft-365-Reset.zshfor semantic review; wiring checks alone missed the 21-Oct-2026 MOFA changes. The comparison is skipped with a warning when git history is unavailablescripts/mofa-consult.zshadds intentional-divergence notes forremove_zoomplugin,remove_skypeforbusiness, andremove_webexpt, and notes thatreset_onenotekeeps the OneNote containerSECURITY.mdnow states that the auto-repair content-length check applies only when the server reports a sizeAGENTS.md,SECURITY.md, and.githubinstructions:reset_factoryjoins the destructive-confirmation list; exit20includes keychain items an operation could not removescripts/mofa-consult.zshclassifiesreset_word,reset_excel,reset_outlook,reset_onenote, andreset_onedriveas intentional divergences (they leave/Library/Managed Preferencesto MDM; MOFA removes the app's managed preference files), adds the same note toreset_teams, and updates thereset_factoryandremove_webexptnotesscripts/mofa-consult.zsh --report-onlynow warns and skips the upstream change comparison when the MOFA path has no git history of its own, and notes uncommitted MOFA script changes that it cannot compare
What's Changed
- 3.0.0 by @dan-snelson in #27
Full Changelog: v2.0.1...v3.0.0