{"record":{"id":"e456e927ed2236d3","repo":"Devolutions/UniGetUI","slug":"expectedname-maintenance-actions-can-only-run-ag","errorCode":null,"errorMessage":"{expectedName} maintenance actions can only run against the {expectedName} manager.","messagePattern":"(.+?) maintenance actions can only run against the (.+?) manager\\.","errorType":"validation","errorClass":"InvalidOperationException","httpStatus":null,"severity":"error","filePath":"src/UniGetUI.Interface.IpcApi/IpcManagerMaintenanceApi.cs","lineNumber":356,"sourceCode":"            );\n        }\n    }\n\n    private static void EnsureConfirmed(IpcManagerMaintenanceRequest request, string action)\n    {\n        if (!request.Confirm)\n        {\n            throw new InvalidOperationException(\n                $\"The manager action \\\"{action}\\\" requires confirm=true.\"\n            );\n        }\n    }\n\n    private static void EnsureManager(IPackageManager manager, string expectedName)\n    {\n        if (!manager.Name.Equals(expectedName, StringComparison.OrdinalIgnoreCase))\n        {\n            throw new InvalidOperationException(\n                $\"{expectedName} maintenance actions can only run against the {expectedName} manager.\"\n            );\n        }\n    }\n\n    private static void EnsureWindowsOnly(string action)\n    {\n        if (!OperatingSystem.IsWindows())\n        {\n            throw new InvalidOperationException(\n                $\"The manager action \\\"{action}\\\" is only supported on Windows.\"\n            );\n        }\n    }\n\n    private static IpcManagerMaintenanceActionResult Success(\n        string command,\n        IPackageManager manager,","sourceCodeStart":338,"sourceCodeEnd":374,"githubUrl":"https://github.com/Devolutions/UniGetUI/blob/9b1d7d0eab91620fc15c86b36676532095936ae3/src/UniGetUI.Interface.IpcApi/IpcManagerMaintenanceApi.cs#L338-L374","documentation":"Thrown by EnsureManager when the resolved IPackageManager's Name property does not match the expected manager name (case-insensitive). This guard prevents cross-manager damage, e.g., running the Scoop uninstall script against the WinGet manager instance. The check compares manager.Name, not manager.Id or DisplayName.","triggerScenarios":"Calling RunActionAsync with a manager name that resolves to a different manager than the action expects. For example, passing ManagerName that ResolveManager maps to the WinGet manager but Action is 'install-scoop' (which calls EnsureManager(manager, \"Scoop\")).","commonSituations":"Manager name alias collision — the caller passes a manager name that ResolveManager matches to a different manager. Copy-paste error where the action string and manager name don't align. The manager resolution uses only Id for exact matching (MatchesManagerId checks Id only), so a mismatched ID silently resolves to the wrong manager.","solutions":["Match the action to the correct manager: 'repair-winget' requires ManagerName resolving to WinGet; 'install-scoop'/'uninstall-scoop'/'cleanup-scoop' require Scoop.","Call GetMaintenanceInfo(managerName).SupportedActions first to verify which actions are valid for that manager.","Verify the manager's Id matches what you expect — ResolveManager matches by Id, not Name."],"exampleFix":"// before — action and manager mismatch\nawait IpcManagerMaintenanceApi.RunActionAsync(new IpcManagerMaintenanceRequest {\n    ManagerName = \"winget\", Action = \"install-scoop\", Confirm = true\n});\n// after\nawait IpcManagerMaintenanceApi.RunActionAsync(new IpcManagerMaintenanceRequest {\n    ManagerName = \"scoop\", Action = \"install-scoop\", Confirm = true\n});","handlingStrategy":"validation","validationCode":"static readonly Dictionary<string, string> ActionToManager = new()\n{\n    [\"repair-winget\"] = \"WinGet\",\n    [\"install-scoop\"] = \"Scoop\",\n    [\"uninstall-scoop\"] = \"Scoop\",\n    [\"cleanup-scoop\"] = \"Scoop\",\n};\n\nif (ActionToManager.TryGetValue(request.Action!, out var expected))\n{\n    var info = IpcManagerMaintenanceApi.GetMaintenanceInfo(request.ManagerName);\n    if (!info.Manager.Equals(expected, StringComparison.OrdinalIgnoreCase))\n        throw new ArgumentException($\"Action {request.Action} requires {expected}.\");\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Match the action string to the correct manager name before calling.","Use GetMaintenanceInfo().SupportedActions to validate action availability for a manager.","Note that EnsureManager checks manager.Name, not manager.Id or DisplayName."],"tags":["maintenance","ipc","validation","package-manager"],"backgroundTag":null,"analyzedSha":"9b1d7d0eab91620fc15c86b36676532095936ae3","analyzedAt":"2026-08-13T12:19:18.278Z","schemaVersion":2},"datasetVersion":"2026-08-13T14:17:21.547Z"}