{"record":{"id":"e30b7a66b19d4e26","repo":"stride3d/stride","slug":"system-packages-cannot-be-deleted","errorCode":null,"errorMessage":"System packages cannot be deleted.","messagePattern":"System packages cannot be deleted\\.","errorType":"exception","errorClass":"InvalidOperationException","httpStatus":null,"severity":"error","filePath":"sources/editor/Stride.Core.Assets.Editor/ViewModel/PackageViewModel.cs","lineNumber":380,"sourceCode":"        }\n\n        private static bool CheckDependsOnRecursively(PackageViewModel source, PackageViewModel target, List<PackageViewModel> visitedPackages)\n        {\n            visitedPackages.Add(source);\n            return source.Dependencies.Content.Any(x => x.Target == target) || source.Dependencies.Content.Select(x => x.Target).NotNull().Where(x => !visitedPackages.Contains(x)).Any(x => CheckDependsOnRecursively(x, target, visitedPackages));\n        }\n\n        public void MoveAsset(AssetViewModel asset, DirectoryBaseViewModel directory)\n        {\n            asset.MoveAsset(Package, directory);\n        }\n\n        public void Delete()\n        {\n            if (Package.IsReadOnly)\n            {\n                // Note: this should never happen (see comments in method SessionViewModel.DeleteSelectedSolutionItems)\n                throw new InvalidOperationException(\"System packages cannot be deleted.\");\n            }\n            using (var transaction = UndoRedoService.CreateTransaction())\n            {\n                string message = $\"Delete package '{Name}'\";\n                IsDeleted = true;\n                UndoRedoService.SetName(transaction, message);\n            }\n        }\n\n        public void CheckConsistency()\n        {\n            // Only compare referenceable assets: non-referenceable ones (e.g. scripts) are indexed\n            // differently and must be filtered on both sides, otherwise they always appear inconsistent.\n            static bool IsReferenceable(Asset asset) => asset.GetType().GetCustomAttribute<AssetDescriptionAttribute>()?.Referenceable ?? true;\n\n            var assetList = Package.Assets.Where(item => IsReferenceable(item.Asset)).ToDictionary(x => x.Location.FullPath);\n            var assetViewModels = Assets.Where(x => IsReferenceable(x.AssetItem.Asset)).ToList();\n            var logger = Session.AssetLog.GetLogger(LogKey.Get(\"Consistency\"));","sourceCodeStart":362,"sourceCodeEnd":398,"githubUrl":"https://github.com/stride3d/stride/blob/96fad776d210c221682aac1ccdf4c79dc046fc38/sources/editor/Stride.Core.Assets.Editor/ViewModel/PackageViewModel.cs#L362-L398","documentation":"PackageViewModel.Delete removes a package from the session, but system/read-only packages (Package.IsReadOnly) are protected. It throws InvalidOperationException because deleting such packages would break the loaded project's system dependencies.","triggerScenarios":"Calling Delete() on a PackageViewModel whose Package.IsReadOnly is true — e.g. a system package like Stride core assets.","commonSituations":"Selecting a system package in the solution explorer and deleting it; bulk-delete operations that include read-only packages.","solutions":["Check Package.IsReadOnly before calling Delete and skip read-only packages","Remove the package from user-editable selections","Only delete packages that are direct user dependencies"],"exampleFix":"// before\npackageViewModel.Delete();\n// after\nif (!packageViewModel.Package.IsReadOnly) packageViewModel.Delete();","handlingStrategy":"validation","validationCode":"if (packageViewModel.Package.IsReadOnly) throw new InvalidOperationException(\"System packages cannot be deleted\");","typeGuard":"bool CanDelete(PackageViewModel p) => !p.Package.IsReadOnly;","tryCatchPattern":"try { p.Delete(); } catch (InvalidOperationException) { /* read-only system package */ }","preventionTips":["Check IsReadOnly before deleting","Exclude system packages from selections","Handle read-only packages in bulk deletes"],"tags":["package","read-only","delete"],"backgroundTag":"permission-denied","analyzedSha":"96fad776d210c221682aac1ccdf4c79dc046fc38","analyzedAt":"2026-09-14T02:59:31.279Z","contentChangedAt":"2026-09-14T02:59:31.279Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}