From b0d0146a45af4330e110d88da65a559702410b4e Mon Sep 17 00:00:00 2001
From: Jesse Plamondon-Willard <Pathoschild@users.noreply.github.com>
Date: Thu, 24 Jan 2019 14:49:12 -0500
Subject: update for Stardew Valley 1.3.35-beta support

SDV 1.3.35 changes the signature for a utility method related to text width checks. SMAPI just needs to be recompiled, but the build won't work with previous versions of the game.
---
 src/SMAPI.Mods.ConsoleCommands/manifest.json | 4 ++--
 src/SMAPI.Mods.SaveBackup/manifest.json      | 4 ++--
 src/SMAPI/Constants.cs                       | 6 +++---
 3 files changed, 7 insertions(+), 7 deletions(-)

(limited to 'src')

diff --git a/src/SMAPI.Mods.ConsoleCommands/manifest.json b/src/SMAPI.Mods.ConsoleCommands/manifest.json
index b5fd0424..afefd733 100644
--- a/src/SMAPI.Mods.ConsoleCommands/manifest.json
+++ b/src/SMAPI.Mods.ConsoleCommands/manifest.json
@@ -1,9 +1,9 @@
 {
   "Name": "Console Commands",
   "Author": "SMAPI",
-  "Version": "2.10.2",
+  "Version": "2.11.0",
   "Description": "Adds SMAPI console commands that let you manipulate the game.",
   "UniqueID": "SMAPI.ConsoleCommands",
   "EntryDll": "ConsoleCommands.dll",
-  "MinimumApiVersion": "2.10.2"
+  "MinimumApiVersion": "2.11.0"
 }
diff --git a/src/SMAPI.Mods.SaveBackup/manifest.json b/src/SMAPI.Mods.SaveBackup/manifest.json
index 7ac537ca..a5841a65 100644
--- a/src/SMAPI.Mods.SaveBackup/manifest.json
+++ b/src/SMAPI.Mods.SaveBackup/manifest.json
@@ -1,9 +1,9 @@
 {
   "Name": "Save Backup",
   "Author": "SMAPI",
-  "Version": "2.10.2",
+  "Version": "2.11.0",
   "Description": "Automatically backs up all your saves once per day into its folder.",
   "UniqueID": "SMAPI.SaveBackup",
   "EntryDll": "SaveBackup.dll",
-  "MinimumApiVersion": "2.10.2"
+  "MinimumApiVersion": "2.11.0"
 }
diff --git a/src/SMAPI/Constants.cs b/src/SMAPI/Constants.cs
index 51c15269..38e3e3db 100644
--- a/src/SMAPI/Constants.cs
+++ b/src/SMAPI/Constants.cs
@@ -20,13 +20,13 @@ namespace StardewModdingAPI
         ** Public
         ****/
         /// <summary>SMAPI's current semantic version.</summary>
-        public static ISemanticVersion ApiVersion { get; } = new Toolkit.SemanticVersion("2.10.2");
+        public static ISemanticVersion ApiVersion { get; } = new Toolkit.SemanticVersion("2.11.0-beta");
 
         /// <summary>The minimum supported version of Stardew Valley.</summary>
-        public static ISemanticVersion MinimumGameVersion { get; } = new GameVersion("1.3.32");
+        public static ISemanticVersion MinimumGameVersion { get; } = new GameVersion("1.3.35");
 
         /// <summary>The maximum supported version of Stardew Valley.</summary>
-        public static ISemanticVersion MaximumGameVersion { get; } = new GameVersion("1.3.33");
+        public static ISemanticVersion MaximumGameVersion { get; } = null;
 
         /// <summary>The target game platform.</summary>
         public static GamePlatform TargetPlatform => (GamePlatform)Constants.Platform;
-- 
cgit 


From 4221ad3668c59b1c0232bf351ec068212d56d392 Mon Sep 17 00:00:00 2001
From: Jesse Plamondon-Willard <Pathoschild@users.noreply.github.com>
Date: Fri, 25 Jan 2019 03:09:09 -0500
Subject: reorganise compatibility list, remove ancient entries

---
 .../wwwroot/StardewModdingAPI.metadata.json        | 305 ++++++++-------------
 1 file changed, 118 insertions(+), 187 deletions(-)

(limited to 'src')

diff --git a/src/SMAPI.Web/wwwroot/StardewModdingAPI.metadata.json b/src/SMAPI.Web/wwwroot/StardewModdingAPI.metadata.json
index 45a4959d..818ff9fe 100644
--- a/src/SMAPI.Web/wwwroot/StardewModdingAPI.metadata.json
+++ b/src/SMAPI.Web/wwwroot/StardewModdingAPI.metadata.json
@@ -115,22 +115,9 @@
       "Default | UpdateKey": "Nexus:1820"
     },
 
-    /*********
-    ** Content packs
-    *********/
-    "Canon-Friendly Dialogue Expansion": {
-      "ID": "gizzymo.canonfriendlyexpansion",
-      "~1.1.1 | Status": "AssumeBroken" // causes a save crash on certain dates
-    },
-
-    "Everytime Submarine": {
-      "ID": "MustafaDemirel.EverytimeSubmarine",
-      "~1.0.0 | Status": "AssumeBroken" // breaks player saves if their beach bridge is fixed
-    },
-
 
     /*********
-    ** Mods
+    ** Map versions
     *********/
     "Adjust Artisan Prices": {
       "ID": "ThatNorthernMonkey.AdjustArtisanPrices",
@@ -146,28 +133,6 @@
       }
     },
 
-    "Always Scroll Map": {
-      "ID": "bcmpinc.AlwaysScrollMap",
-      "~0.6 | Status": "AssumeBroken" // breaks newer versions of bcmpinc mods (per bcmpinc's request)
-    },
-
-    "Animal Mood Fix": {
-      "ID": "GPeters-AnimalMoodFix",
-      "~ | Status": "Obsolete",
-      "~ | StatusReasonPhrase": "the animal mood bugs were fixed in Stardew Valley 1.2."
-    },
-
-    "Arcade Pong": {
-      "ID": "Platonymous.ArcadePong",
-      "~1.0.2 | Status": "AssumeBroken" // broke in SMAPI 2.6-beta.16 due to reflection into SMAPI internals
-    },
-
-    "Automated Doors": {
-      "ID": "azah.automated-doors",
-      "FormerIDs": "1abcfa07-2cf4-4dc3-a6e9-6068b642112b", // changed in 1.4.1
-      "Default | UpdateKey": "GitHub:azah/AutomatedDoors" // added in 1.4.2
-    },
-
     "Basic Sprinklers Improved": {
       "ID": "lrsk_sdvm_bsi.0117171308",
       "MapRemoteVersions": { "1.0.2": "1.0.1-release" } // manifest not updated
@@ -184,11 +149,6 @@
       "MapRemoteVersions": { "1.3.1": "1.3" } // manifest not updated
     },
 
-    "BJS Night Sounds": {
-      "ID": "BunnyJumps.BJSNightSounds",
-      "~1.0.0 | Status": "AssumeBroken" // runtime errors with Harmony 1.2.0.1 in SMAPI 2.8+
-    },
-
     "Casks Anywhere": {
       "ID": "CasksAnywhere",
       "MapLocalVersions": { "1.1-alpha": "1.1" }
@@ -199,43 +159,21 @@
       "MapLocalVersions": { "1.3-1": "1.3" }
     },
 
-    "Chest Pooling": {
-      "ID": "mralbobo.ChestPooling",
-      "Default | UpdateKey": "GitHub:mralbobo/stardew-chest-pooling"
-    },
-
     "Cobalt": {
       "ID": "spacechase0.Cobalt",
       "MapRemoteVersions": { "1.1.3": "1.1.2" } // not updated in manifest
     },
 
-    "Colored Chests": {
-      "ID": "4befde5c-731c-4853-8e4b-c5cdf946805f",
-      "~ | Status": "Obsolete",
-      "~ | StatusReasonPhrase": "colored chests were added in Stardew Valley 1.1."
-    },
-
     "Configurable Machines": {
       "ID": "21da6619-dc03-4660-9794-8e5b498f5b97",
       "MapLocalVersions": { "1.2-beta": "1.2" }
     },
 
-    "Craft Counter": {
-      "ID": "bcmpinc.CraftCounter",
-      "~0.6 | Status": "AssumeBroken" // breaks newer versions of bcmpinc mods (per bcmpinc's request)
-    },
-
     "Crafting Counter": {
       "ID": "lolpcgaming.CraftingCounter",
       "MapRemoteVersions": { "1.1": "1.0" } // not updated in manifest
     },
 
-    "Custom Farming Automate Bridge": {
-      "ID": "Platonymous.CFAutomate",
-      "~1.0.1 | Status": "AssumeBroken", // no longer compatible with Automate
-      "~1.0.1 | AlternativeUrl": "https://www.nexusmods.com/stardewvalley/mods/991"
-    },
-
     "Customizable Cart Redux": {
       "ID": "KoihimeNakamura.CCR",
       "MapLocalVersions": { "1.1-20170917": "1.1" }
@@ -256,46 +194,6 @@
       "MapLocalVersions": { "1.1": "1.1.1" }
     },
 
-    "Enemy Health Bars": {
-      "ID": "Speeder.HealthBars",
-      "FormerIDs": "SPDHealthBar" // changed in 1.7.1-pathoschild-update
-    },
-
-    "Fall 28 Snow Day": {
-      "ID": "Omegasis.Fall28SnowDay",
-      "~1.4.1  | Status": "AssumeBroken" // broke in SMAPI 2.0, and update for SMAPI 2.0 doesn't do anything
-    },
-
-    "Fishing Adjust": {
-      "ID": "shuaiz.FishingAdjustMod",
-      "~2.0.1 | Status": "AssumeBroken" // Method not found: 'Void Harmony.HarmonyInstance.Patch(System.Reflection.MethodBase, Harmony.HarmonyMethod, Harmony.HarmonyMethod, Harmony.HarmonyMethod)'
-    },
-
-    "Fishing Automaton": {
-      "ID": "Drynwynn.FishingAutomaton",
-      "~1.1 | Status": "AssumeBroken" // runtime errors with Harmony 1.2.0.1 in SMAPI 2.8+
-    },
-
-    "Fix Animal Tools": {
-      "ID": "bcmpinc.FixAnimalTools",
-      "~0.6 | Status": "AssumeBroken" // breaks newer versions of bcmpinc mods (per bcmpinc's request)
-    },
-
-    "Fix Scythe Exp": {
-      "ID": "bcmpinc.FixScytheExp",
-      "~0.3 | Status": "AssumeBroken" // broke in 1.3: Exception from HarmonyInstance "bcmpinc.FixScytheExp" [...] Bad label content in ILGenerator.
-    },
-
-    "Gate Opener": {
-      "ID": "mralbobo.GateOpener",
-      "Default | UpdateKey": "GitHub:mralbobo/stardew-gate-opener"
-    },
-
-    "Grass Growth": {
-      "ID": "bcmpinc.GrassGrowth",
-      "~0.6 | Status": "AssumeBroken" // breaks newer versions of bcmpinc mods (per bcmpinc's request)
-    },
-
     "Hunger Mod (skn)": {
       "ID": "skn.HungerMod",
       "MapRemoteVersions": { "1.2.1": "1.0" } // manifest not updated
@@ -311,32 +209,11 @@
       "MapRemoteVersions": { "1.0.1": "1.0" } // manifest not updated
     },
 
-    "Modder Serialization Utility": {
-      "ID": "SerializerUtils-0-1",
-      "~ | Status": "Obsolete",
-      "~ | StatusReasonPhrase": "it's no longer maintained or used."
-    },
-
-    "More Rain": {
-      "ID": "Omegasis.MoreRain",
-      "~1.4    | Status": "AssumeBroken" // broke in SMAPI 2.0
-    },
-
-    "More Silo Storage": {
-      "ID": "OrneryWalrus.MoreSiloStorage",
-      "~1.0.1 | Status": "AssumeBroken" // broke in SDV 1.3
-    },
-
     "Move Faster": {
       "ID": "shuaiz.MoveFasterMod",
       "~1.0.1   | Status": "AssumeBroken" // doesn't do anything as of SDV 1.2.33 (bad Harmony patch?)
     },
 
-    "Movement Speed": {
-      "ID": "bcmpinc.MovementSpeed",
-      "~0.6 | Status": "AssumeBroken" // breaks newer versions of bcmpinc mods (per bcmpinc's request)
-    },
-
     "Multiple Sprites and Portraits On Rotation (File Loading)": {
       "ID": "FileLoading",
       "MapLocalVersions": { "1.1": "1.12" }
@@ -347,33 +224,11 @@
       "MapLocalVersions": { "2.1": "1.3" } // 1.3 had wrong version in manifest
     },
 
-    "No Added Flying Mine Monsters": {
-      "ID": "Drynwynn.NoAddedFlyingMineMonsters",
-      "~1.1 | Status": "AssumeBroken" // runtime errors with Harmony 1.2.0.1 in SMAPI 2.8+
-    },
-
-    "No Debug Mode": {
-      "ID": "NoDebugMode",
-      "~ | Status": "Obsolete",
-      "~ | StatusReasonPhrase": "debug mode was removed in SMAPI 1.0."
-    },
-
-    "OmniFarm": {
-      "ID": "PhthaloBlue.OmniFarm",
-      "FormerIDs": "BlueMod_OmniFarm", // changed in 2.0.2-pathoschild-update
-      "Default | UpdateKey": "GitHub:lambui/StardewValleyMod_OmniFarm"
-    },
-
     "Point-and-Plant": {
       "ID": "jwdred.PointAndPlant",
       "MapRemoteVersions": { "1.0.3": "1.0.2" } // manifest not updated
     },
 
-    "Prairie King Made Easy": {
-      "ID": "Mucchan.PrairieKingMadeEasy",
-      "~1.0    | Status": "AssumeBroken" // broke in SDV 1.2
-    },
-
     "Relationship Status": {
       "ID": "relationshipstatus",
       "MapRemoteVersions": { "1.0.5": "1.0.4" } // not updated in manifest
@@ -384,16 +239,6 @@
       "MapLocalVersions": { "1.1.2-release": "1.1.2" }
     },
 
-    "Save Backup": {
-      "ID": "Omegasis.SaveBackup",
-      "~1.2    | Status": "AssumeBroken" // broke in SMAPI 2.0
-    },
-
-    "Server Bookmarker": {
-      "ID": "Ilyaki.ServerBookmarker",
-      "~1.0.0 | Status": "AssumeBroken" // broke in Stardew Valley 1.3.29 (runtime errors)
-    },
-
     "Shop Expander": {
       "ID": "Entoarox.ShopExpander",
       "FormerIDs": "EntoaroxShopExpander", // changed in 1.5.2
@@ -411,6 +256,123 @@
       "MapLocalVersions": { "0.0": "1.4" }
     },
 
+    "Solar Eclipse Event": {
+      "ID": "KoihimeNakamura.SolarEclipseEvent",
+      "MapLocalVersions": { "1.3.1-20180131": "1.3.1" }
+    },
+
+    "Time Reminder": {
+      "ID": "KoihimeNakamura.TimeReminder",
+      "MapLocalVersions": { "1.0-20170314": "1.0.2" }
+    },
+
+
+    /*********
+    ** Obsolete
+    *********/
+    "Animal Mood Fix": {
+      "ID": "GPeters-AnimalMoodFix",
+      "~ | Status": "Obsolete",
+      "~ | StatusReasonPhrase": "the animal mood bugs were fixed in Stardew Valley 1.2."
+    },
+
+    "Colored Chests": {
+      "ID": "4befde5c-731c-4853-8e4b-c5cdf946805f",
+      "~ | Status": "Obsolete",
+      "~ | StatusReasonPhrase": "colored chests were added in Stardew Valley 1.1."
+    },
+
+    "Modder Serialization Utility": {
+      "ID": "SerializerUtils-0-1",
+      "~ | Status": "Obsolete",
+      "~ | StatusReasonPhrase": "it's no longer maintained or used."
+    },
+
+    "No Debug Mode": {
+      "ID": "NoDebugMode",
+      "~ | Status": "Obsolete",
+      "~ | StatusReasonPhrase": "debug mode was removed in SMAPI 1.0."
+    },
+
+
+    /*********
+    ** Broke circa SDV 1.3
+    *********/
+    "Canon-Friendly Dialogue Expansion": {
+      "ID": "gizzymo.canonfriendlyexpansion",
+      "~1.1.1 | Status": "AssumeBroken" // causes a save crash on certain dates
+    },
+
+    "Everytime Submarine": {
+      "ID": "MustafaDemirel.EverytimeSubmarine",
+      "~1.0.0 | Status": "AssumeBroken" // breaks player saves if their beach bridge is fixed
+    },
+
+    "Always Scroll Map": {
+      "ID": "bcmpinc.AlwaysScrollMap",
+      "~0.6 | Status": "AssumeBroken" // breaks newer versions of bcmpinc mods (per bcmpinc's request)
+    },
+
+    "Arcade Pong": {
+      "ID": "Platonymous.ArcadePong",
+      "~1.0.2 | Status": "AssumeBroken" // broke in SMAPI 2.6-beta.16 due to reflection into SMAPI internals
+    },
+
+    "BJS Night Sounds": {
+      "ID": "BunnyJumps.BJSNightSounds",
+      "~1.0.0 | Status": "AssumeBroken" // runtime errors with Harmony 1.2.0.1 in SMAPI 2.8+
+    },
+
+    "Craft Counter": {
+      "ID": "bcmpinc.CraftCounter",
+      "~0.6 | Status": "AssumeBroken" // breaks newer versions of bcmpinc mods (per bcmpinc's request)
+    },
+
+    "Fishing Adjust": {
+      "ID": "shuaiz.FishingAdjustMod",
+      "~2.0.1 | Status": "AssumeBroken" // Method not found: 'Void Harmony.HarmonyInstance.Patch(System.Reflection.MethodBase, Harmony.HarmonyMethod, Harmony.HarmonyMethod, Harmony.HarmonyMethod)'
+    },
+
+    "Fishing Automaton": {
+      "ID": "Drynwynn.FishingAutomaton",
+      "~1.1 | Status": "AssumeBroken" // runtime errors with Harmony 1.2.0.1 in SMAPI 2.8+
+    },
+
+    "Fix Animal Tools": {
+      "ID": "bcmpinc.FixAnimalTools",
+      "~0.6 | Status": "AssumeBroken" // breaks newer versions of bcmpinc mods (per bcmpinc's request)
+    },
+
+    "Fix Scythe Exp": {
+      "ID": "bcmpinc.FixScytheExp",
+      "~0.3 | Status": "AssumeBroken" // broke in 1.3: Exception from HarmonyInstance "bcmpinc.FixScytheExp" [...] Bad label content in ILGenerator.
+    },
+
+    "Grass Growth": {
+      "ID": "bcmpinc.GrassGrowth",
+      "~0.6 | Status": "AssumeBroken" // breaks newer versions of bcmpinc mods (per bcmpinc's request)
+    },
+
+    "More Silo Storage": {
+      "ID": "OrneryWalrus.MoreSiloStorage",
+      "~1.0.1 | Status": "AssumeBroken" // broke in SDV 1.3
+    },
+
+    "Movement Speed": {
+      "ID": "bcmpinc.MovementSpeed",
+      "~0.6 | Status": "AssumeBroken" // breaks newer versions of bcmpinc mods (per bcmpinc's request)
+    },
+
+    "No Added Flying Mine Monsters": {
+      "ID": "Drynwynn.NoAddedFlyingMineMonsters",
+      "~1.1 | Status": "AssumeBroken" // runtime errors with Harmony 1.2.0.1 in SMAPI 2.8+
+    },
+
+    "Server Bookmarker": {
+      "ID": "Ilyaki.ServerBookmarker",
+      "~1.0.0 | Status": "AssumeBroken" // broke in Stardew Valley 1.3.29 (runtime errors)
+    },
+
     "Skill Prestige: Cooking Adapter": {
       "ID": "Alphablackwolf.CookingSkillPrestigeAdapter",
       "FormerIDs": "20d6b8a3-b6e7-460b-a6e4-07c2b0cb6c63", // changed circa 1.1
@@ -423,11 +385,6 @@
       "1.3-beta | Status": "AssumeBroken" // doesn't work in multiplayer, no longer maintained
     },
 
-    "Solar Eclipse Event": {
-      "ID": "KoihimeNakamura.SolarEclipseEvent",
-      "MapLocalVersions": { "1.3.1-20180131": "1.3.1" }
-    },
-
     "Split Screen": {
       "ID": "Ilyaki.SplitScreen",
       "~3.0.1 | Status": "AssumeBroken" // broke in SMAPI 2.6-beta.16 due to reflection into SMAPI internals
@@ -438,11 +395,6 @@
       "~0.6 | Status": "AssumeBroken" // breaks newer versions of bcmpinc mods (per bcmpinc's request)
     },
 
-    "Stardew Notification": {
-      "ID": "stardewnotification",
-      "Default | UpdateKey": "GitHub:monopandora/StardewNotification"
-    },
-
     "Stephan's Lots of Crops": {
       "ID": "stephansstardewcrops",
       "MapRemoteVersions": { "1.41": "1.1" }, // manifest not updated
@@ -460,35 +412,14 @@
       "~0.6 | Status": "AssumeBroken" // breaks newer versions of bcmpinc mods (per bcmpinc's request)
     },
 
-    "Time Reminder": {
-      "ID": "KoihimeNakamura.TimeReminder",
-      "MapLocalVersions": { "1.0-20170314": "1.0.2" }
-    },
-
-    "Tool Charging": {
-      "ID": "mralbobo.ToolCharging",
-      "Default | UpdateKey": "GitHub:mralbobo/stardew-tool-charging"
-    },
-
     "Tree Spread": {
       "ID": "bcmpinc.TreeSpread",
       "~0.6 | Status": "AssumeBroken" // breaks newer versions of bcmpinc mods (per bcmpinc's request)
     },
 
-    "Variable Grass": {
-      "ID": "dantheman999.VariableGrass",
-      "Default | UpdateKey": "GitHub:dantheman999301/StardewMods"
-    },
-
     "Yet Another Harvest With Scythe Mod": {
       "ID": "bcmpinc.HarvestWithScythe",
       "~0.6 | Status": "AssumeBroken" // breaks newer versions of bcmpinc mods (per bcmpinc's request)
-    },
-
-    "Zoom Out Extreme": {
-      "ID": "RockinMods.ZoomMod",
-      "FormerIDs": "ZoomMod", // changed circa 1.2.1
-      "~0.1 | Status": "AssumeBroken" // broke in SDV 1.2
     }
   }
 }
-- 
cgit 


From 975ffe52e667cb4f1ed690cbf784fe9eae403326 Mon Sep 17 00:00:00 2001
From: Jesse Plamondon-Willard <Pathoschild@users.noreply.github.com>
Date: Fri, 25 Jan 2019 12:55:07 -0500
Subject: fix bundled mods not working in beta release

---
 src/SMAPI.Mods.ConsoleCommands/manifest.json | 4 ++--
 src/SMAPI.Mods.SaveBackup/manifest.json      | 4 ++--
 2 files changed, 4 insertions(+), 4 deletions(-)

(limited to 'src')

diff --git a/src/SMAPI.Mods.ConsoleCommands/manifest.json b/src/SMAPI.Mods.ConsoleCommands/manifest.json
index afefd733..2e4ec9cc 100644
--- a/src/SMAPI.Mods.ConsoleCommands/manifest.json
+++ b/src/SMAPI.Mods.ConsoleCommands/manifest.json
@@ -1,9 +1,9 @@
 {
   "Name": "Console Commands",
   "Author": "SMAPI",
-  "Version": "2.11.0",
+  "Version": "2.11.0-beta",
   "Description": "Adds SMAPI console commands that let you manipulate the game.",
   "UniqueID": "SMAPI.ConsoleCommands",
   "EntryDll": "ConsoleCommands.dll",
-  "MinimumApiVersion": "2.11.0"
+  "MinimumApiVersion": "2.11.0-beta"
 }
diff --git a/src/SMAPI.Mods.SaveBackup/manifest.json b/src/SMAPI.Mods.SaveBackup/manifest.json
index a5841a65..d21bcb5b 100644
--- a/src/SMAPI.Mods.SaveBackup/manifest.json
+++ b/src/SMAPI.Mods.SaveBackup/manifest.json
@@ -1,9 +1,9 @@
 {
   "Name": "Save Backup",
   "Author": "SMAPI",
-  "Version": "2.11.0",
+  "Version": "2.11.0-beta",
   "Description": "Automatically backs up all your saves once per day into its folder.",
   "UniqueID": "SMAPI.SaveBackup",
   "EntryDll": "SaveBackup.dll",
-  "MinimumApiVersion": "2.11.0"
+  "MinimumApiVersion": "2.11.0-beta"
 }
-- 
cgit 


From f5d1bd8984a423bf5949040416035f23a73e13dc Mon Sep 17 00:00:00 2001
From: Jesse Plamondon-Willard <Pathoschild@users.noreply.github.com>
Date: Fri, 8 Feb 2019 21:37:35 -0500
Subject: prepare for 2.11-beta.2 release

---
 src/SMAPI.Mods.ConsoleCommands/manifest.json | 4 ++--
 src/SMAPI.Mods.SaveBackup/manifest.json      | 4 ++--
 src/SMAPI/Constants.cs                       | 2 +-
 3 files changed, 5 insertions(+), 5 deletions(-)

(limited to 'src')

diff --git a/src/SMAPI.Mods.ConsoleCommands/manifest.json b/src/SMAPI.Mods.ConsoleCommands/manifest.json
index 2e4ec9cc..c3ecf242 100644
--- a/src/SMAPI.Mods.ConsoleCommands/manifest.json
+++ b/src/SMAPI.Mods.ConsoleCommands/manifest.json
@@ -1,9 +1,9 @@
 {
   "Name": "Console Commands",
   "Author": "SMAPI",
-  "Version": "2.11.0-beta",
+  "Version": "2.11.0-beta.2",
   "Description": "Adds SMAPI console commands that let you manipulate the game.",
   "UniqueID": "SMAPI.ConsoleCommands",
   "EntryDll": "ConsoleCommands.dll",
-  "MinimumApiVersion": "2.11.0-beta"
+  "MinimumApiVersion": "2.11.0-beta.2"
 }
diff --git a/src/SMAPI.Mods.SaveBackup/manifest.json b/src/SMAPI.Mods.SaveBackup/manifest.json
index d21bcb5b..b91986f2 100644
--- a/src/SMAPI.Mods.SaveBackup/manifest.json
+++ b/src/SMAPI.Mods.SaveBackup/manifest.json
@@ -1,9 +1,9 @@
 {
   "Name": "Save Backup",
   "Author": "SMAPI",
-  "Version": "2.11.0-beta",
+  "Version": "2.11.0-beta.2",
   "Description": "Automatically backs up all your saves once per day into its folder.",
   "UniqueID": "SMAPI.SaveBackup",
   "EntryDll": "SaveBackup.dll",
-  "MinimumApiVersion": "2.11.0-beta"
+  "MinimumApiVersion": "2.11.0-beta.2"
 }
diff --git a/src/SMAPI/Constants.cs b/src/SMAPI/Constants.cs
index 38e3e3db..e0684bf4 100644
--- a/src/SMAPI/Constants.cs
+++ b/src/SMAPI/Constants.cs
@@ -20,7 +20,7 @@ namespace StardewModdingAPI
         ** Public
         ****/
         /// <summary>SMAPI's current semantic version.</summary>
-        public static ISemanticVersion ApiVersion { get; } = new Toolkit.SemanticVersion("2.11.0-beta");
+        public static ISemanticVersion ApiVersion { get; } = new Toolkit.SemanticVersion("2.11.0-beta.2");
 
         /// <summary>The minimum supported version of Stardew Valley.</summary>
         public static ISemanticVersion MinimumGameVersion { get; } = new GameVersion("1.3.35");
-- 
cgit 


From 4baad0ec8d568217aa2708afc15ba9672b0a2daf Mon Sep 17 00:00:00 2001
From: Jesse Plamondon-Willard <Pathoschild@users.noreply.github.com>
Date: Sat, 9 Feb 2019 15:20:35 -0500
Subject: cross out mod links on compat page if outdated to prevent confusion

---
 docs/release-notes.md                      |  9 +++++++--
 src/SMAPI.Web/wwwroot/Content/css/mods.css | 10 ++++++----
 2 files changed, 13 insertions(+), 6 deletions(-)

(limited to 'src')

diff --git a/docs/release-notes.md b/docs/release-notes.md
index d61c7990..a4a037e8 100644
--- a/docs/release-notes.md
+++ b/docs/release-notes.md
@@ -1,10 +1,15 @@
 # Release notes
 ## 2.11-beta
+Currently in beta for Stardew Valley 1.3.35-beta only. **Not compatible with non-beta versions of the game.**
+
 * For players:
-  * Updated for Stardew Valley 1.3.35 beta. **Not compatible with non-beta versions of the game.**
+  * Updated for Stardew Valley 1.3.35 beta.
+
+* For the web UI:
+  * Mod compatibility page now crosses out mod links if they're outdated to prevent confusion.
 
 ## 2.10.2
-Released 08 January 2019 for Stardew Valley 1.3.32–33.
+Released 09 January 2019 for Stardew Valley 1.3.32–33.
 
 * For players:
   * SMAPI now keeps the first save backup created for the day, instead of the last one.
diff --git a/src/SMAPI.Web/wwwroot/Content/css/mods.css b/src/SMAPI.Web/wwwroot/Content/css/mods.css
index 730bfc2e..f42800da 100644
--- a/src/SMAPI.Web/wwwroot/Content/css/mods.css
+++ b/src/SMAPI.Web/wwwroot/Content/css/mods.css
@@ -128,8 +128,10 @@ table.wikitable > caption {
     opacity: 0.7;
 }
 
-#mod-list .mod-closed-source {
-    color: red;
-    font-size: 0.8em;
-    opacity: 0.5;
+#mod-list tr[data-status="abandoned"] .mod-page-links,
+#mod-list tr[data-status="broken"] .mod-page-links,
+#mod-list tr[data-status="obsolete"] .mod-page-links,
+#mod-list tr[data-status="unofficial"] .mod-page-links,
+#mod-list tr[data-status="workaround"] .mod-page-links {
+    text-decoration: line-through;
 }
-- 
cgit 


From a23261106ea454ab2e264007f27ca11ddbb7e44b Mon Sep 17 00:00:00 2001
From: danvolchek <volchek2@illinois.edu>
Date: Sun, 17 Feb 2019 20:39:36 -0600
Subject: add update info in suggested fixes section

---
 src/SMAPI.Web/Framework/LogParsing/LogParser.cs    | 49 +++++++++++++++--
 .../Framework/LogParsing/Models/LogModInfo.cs      | 39 ++++++++++++++
 .../Framework/LogParsing/Models/ModInfo.cs         | 27 ----------
 src/SMAPI.Web/Views/LogParser/Index.cshtml         | 61 ++++++++++++++++++++--
 src/SMAPI.Web/wwwroot/Content/css/log-parser.css   | 33 +++++++++---
 5 files changed, 165 insertions(+), 44 deletions(-)
 create mode 100644 src/SMAPI.Web/Framework/LogParsing/Models/LogModInfo.cs
 delete mode 100644 src/SMAPI.Web/Framework/LogParsing/Models/ModInfo.cs

(limited to 'src')

diff --git a/src/SMAPI.Web/Framework/LogParsing/LogParser.cs b/src/SMAPI.Web/Framework/LogParsing/LogParser.cs
index 6f848469..5cdc501f 100644
--- a/src/SMAPI.Web/Framework/LogParsing/LogParser.cs
+++ b/src/SMAPI.Web/Framework/LogParsing/LogParser.cs
@@ -39,6 +39,15 @@ namespace StardewModdingAPI.Web.Framework.LogParsing
         /// <summary>A regex pattern matching an entry in SMAPI's content pack list.</summary>
         private readonly Regex ContentPackListEntryPattern = new Regex(@"^   (?<name>.+) (?<version>.+) by (?<author>.+) \| for (?<for>.+?)(?: \| (?<description>.+))?$", RegexOptions.Compiled | RegexOptions.IgnoreCase);
 
+        /// <summary>A regex pattern matching the start of SMAPI's mod update list.</summary>
+        private readonly Regex ModUpdateListStartPattern = new Regex(@"^You can update \d+ mods?:$", RegexOptions.Compiled | RegexOptions.IgnoreCase);
+
+        /// <summary>A regex pattern matching an entry in SMAPI's mod update list.</summary>
+        private readonly Regex ModUpdateListEntryPattern = new Regex(@"^   (?<name>.+?) (?<version>" + SemanticVersion.UnboundedVersionPattern + @"): (?<link>.+)$", RegexOptions.Compiled | RegexOptions.IgnoreCase);
+
+        /// <summary>A regex pattern matching SMAPI's update line.</summary>
+        private readonly Regex SMAPIUpdatePattern = new Regex(@"^You can update SMAPI to (?<version>" + SemanticVersion.UnboundedVersionPattern + @"): (?<link>.+)$", RegexOptions.Compiled | RegexOptions.IgnoreCase);
+
 
         /*********
         ** Public methods
@@ -69,11 +78,12 @@ namespace StardewModdingAPI.Web.Framework.LogParsing
                 };
 
                 // parse log messages
-                LogModInfo smapiMod = new LogModInfo { Name = "SMAPI", Author = "Pathoschild", Description = "" };
-                LogModInfo gameMod = new LogModInfo { Name = "game", Author = "", Description = "" };
+                LogModInfo smapiMod = new LogModInfo { Name = "SMAPI", Author = "Pathoschild", Description = "", Loaded = true};
+                LogModInfo gameMod = new LogModInfo { Name = "game", Author = "", Description = "", Loaded = true };
                 IDictionary<string, LogModInfo> mods = new Dictionary<string, LogModInfo>();
                 bool inModList = false;
                 bool inContentPackList = false;
+                bool inModUpdateList = false;
                 foreach (LogMessage message in log.Messages)
                 {
                     // collect stats
@@ -106,6 +116,8 @@ namespace StardewModdingAPI.Web.Framework.LogParsing
                             inModList = false;
                         if (inContentPackList && !this.ContentPackListEntryPattern.IsMatch(message.Text))
                             inContentPackList = false;
+                        if (inModUpdateList && !this.ModUpdateListEntryPattern.IsMatch(message.Text))
+                            inModUpdateList = false;
 
                         // mod list
                         if (!inModList && message.Level == LogLevel.Info && this.ModListStartPattern.IsMatch(message.Text))
@@ -117,7 +129,7 @@ namespace StardewModdingAPI.Web.Framework.LogParsing
                             string version = match.Groups["version"].Value;
                             string author = match.Groups["author"].Value;
                             string description = match.Groups["description"].Value;
-                            mods[name] = new LogModInfo { Name = name, Author = author, Version = version, Description = description };
+                            mods[name] = new LogModInfo { Name = name, Author = author, Version = version, Description = description, Loaded = true };
                         }
 
                         // content pack list
@@ -131,7 +143,36 @@ namespace StardewModdingAPI.Web.Framework.LogParsing
                             string author = match.Groups["author"].Value;
                             string description = match.Groups["description"].Value;
                             string forMod = match.Groups["for"].Value;
-                            mods[name] = new LogModInfo { Name = name, Author = author, Version = version, Description = description, ContentPackFor = forMod };
+                            mods[name] = new LogModInfo { Name = name, Author = author, Version = version, Description = description, ContentPackFor = forMod, Loaded = true };
+                        }
+
+                        // mod update list
+                        else if (!inModUpdateList && message.Level == LogLevel.Alert && this.ModUpdateListStartPattern.IsMatch(message.Text))
+                            inModUpdateList = true;
+                        else if (inModUpdateList)
+                        {
+                            Match match = this.ModUpdateListEntryPattern.Match(message.Text);
+                            string name = match.Groups["name"].Value;
+                            string version = match.Groups["version"].Value;
+                            string link = match.Groups["link"].Value;
+                            if (mods.ContainsKey(name))
+                            {
+                                mods[name].UpdateLink = link;
+                                mods[name].UpdateVersion = version;
+                            }
+                            else
+                            {
+                                mods[name] = new LogModInfo {Name = name, UpdateVersion = version, UpdateLink = link, Loaded = false};
+                            }
+                        }
+
+                        else if(message.Level == LogLevel.Alert && this.SMAPIUpdatePattern.IsMatch(message.Text))
+                        {
+                            Match match = this.SMAPIUpdatePattern.Match(message.Text);
+                            string version = match.Groups["version"].Value;
+                            string link = match.Groups["link"].Value;
+                            smapiMod.UpdateVersion = version;
+                            smapiMod.UpdateLink = link;
                         }
 
                         // platform info line
diff --git a/src/SMAPI.Web/Framework/LogParsing/Models/LogModInfo.cs b/src/SMAPI.Web/Framework/LogParsing/Models/LogModInfo.cs
new file mode 100644
index 00000000..067e4df4
--- /dev/null
+++ b/src/SMAPI.Web/Framework/LogParsing/Models/LogModInfo.cs
@@ -0,0 +1,39 @@
+namespace StardewModdingAPI.Web.Framework.LogParsing.Models
+{
+    /// <summary>Metadata about a mod or content pack in the log.</summary>
+    public class LogModInfo
+    {
+        /*********
+        ** Accessors
+        *********/
+        /// <summary>The mod name.</summary>
+        public string Name { get; set; }
+
+        /// <summary>The mod author.</summary>
+        public string Author { get; set; }
+
+        /// <summary>The update version.</summary>
+        public string UpdateVersion { get; set; }
+
+        /// <summary>The update link.</summary>
+        public string UpdateLink { get; set; }
+
+        /// <summary>The mod version.</summary>
+        public string Version { get; set; }
+
+        /// <summary>The mod description.</summary>
+        public string Description { get; set; }
+
+        /// <summary>The name of the mod for which this is a content pack (if applicable).</summary>
+        public string ContentPackFor { get; set; }
+
+        /// <summary>The number of errors logged by this mod.</summary>
+        public int Errors { get; set; }
+
+        /// <summary>Whether the mod was loaded into the game.</summary>
+        public bool Loaded { get; set; }
+
+        /// <summary>Whether the mod has an update available.</summary>
+        public bool HasUpdate => this.UpdateVersion != null && this.Version != this.UpdateVersion;
+    }
+}
diff --git a/src/SMAPI.Web/Framework/LogParsing/Models/ModInfo.cs b/src/SMAPI.Web/Framework/LogParsing/Models/ModInfo.cs
deleted file mode 100644
index 8c84ab38..00000000
--- a/src/SMAPI.Web/Framework/LogParsing/Models/ModInfo.cs
+++ /dev/null
@@ -1,27 +0,0 @@
-namespace StardewModdingAPI.Web.Framework.LogParsing.Models
-{
-    /// <summary>Metadata about a mod or content pack in the log.</summary>
-    public class LogModInfo
-    {
-        /*********
-        ** Accessors
-        *********/
-        /// <summary>The mod name.</summary>
-        public string Name { get; set; }
-
-        /// <summary>The mod author.</summary>
-        public string Author { get; set; }
-
-        /// <summary>The mod version.</summary>
-        public string Version { get; set; }
-
-        /// <summary>The mod description.</summary>
-        public string Description { get; set; }
-
-        /// <summary>The name of the mod for which this is a content pack (if applicable).</summary>
-        public string ContentPackFor { get; set; }
-
-        /// <summary>The number of errors logged by this mod.</summary>
-        public int Errors { get; set; }
-    }
-}
diff --git a/src/SMAPI.Web/Views/LogParser/Index.cshtml b/src/SMAPI.Web/Views/LogParser/Index.cshtml
index 58830d64..07b413b1 100644
--- a/src/SMAPI.Web/Views/LogParser/Index.cshtml
+++ b/src/SMAPI.Web/Views/LogParser/Index.cshtml
@@ -117,9 +117,60 @@ else if (Model.ParsedLog?.IsValid == true)
 @* parsed log *@
 @if (Model.ParsedLog?.IsValid == true)
 {
-    <h2>Log info</h2>
     <div id="output">
-        <table id="metadata">
+        @if (Model.ParsedLog.Mods.Any(mod => mod.HasUpdate))
+        {
+            <h2>Suggested fixes</h2>
+
+            <p>You have some mods that aren't fully up to date. Updating them can fix problems.</p>
+            <table id="updates" class="table">
+                <caption>
+                    Updates Available:
+                </caption>
+                @foreach (LogModInfo mod in Model.ParsedLog.Mods.Where(mod => (mod.HasUpdate && mod.ContentPackFor == null) || (contentPacks != null && contentPacks.TryGetValue(mod.Name, out LogModInfo[] contentPackList) && contentPackList.Any(pack => pack.HasUpdate))))
+                {
+                <tr class="mod-entry">
+                    <td>
+                        <strong class=@(!mod.HasUpdate ? "hidden": "")>@mod.Name</strong>
+                        @if (contentPacks != null && contentPacks.TryGetValue(mod.Name, out LogModInfo[] contentPackList))
+                        {
+                            <div class="content-packs">
+                                @foreach (LogModInfo contentPack in contentPackList.Where(pack => pack.HasUpdate))
+                                {
+                                    <text>+ @contentPack.Name</text><br />
+                                }
+                            </div>
+                        }
+                    </td>
+                    <td>
+                        @if (mod.HasUpdate)
+                        {
+                        <a href="@mod.UpdateLink" target="_blank">
+                            @(mod.Version == null ? @mod.UpdateVersion : $"{mod.Version} → {mod.UpdateVersion}")
+                            </a>
+                        }
+                        else
+                        {
+                            <span class="invisible">Okay</span>
+                        }
+
+                        @if (contentPacks != null && contentPacks.TryGetValue(mod.Name, out contentPackList))
+                        {
+                            <div>
+                                @foreach (LogModInfo contentPack in contentPackList.Where(pack => pack.HasUpdate))
+                                {
+                                    <a href="@contentPack.UpdateLink" target="_blank">@contentPack.Version → @contentPack.UpdateVersion</a><br />
+                                }
+                            </div>
+                        }
+                    </td>
+                </tr>
+                }
+            </table>
+        }
+
+        <h2>Log info</h2>
+        <table id="metadata" class="table">
             <caption>Game info:</caption>
             <tr>
                 <th>Stardew Valley:</th>
@@ -138,8 +189,8 @@ else if (Model.ParsedLog?.IsValid == true)
                 <td>@Model.ParsedLog.Timestamp.UtcDateTime.ToString("yyyy-MM-dd HH:mm") UTC ({{localTimeStarted}} your time)</td>
             </tr>
         </table>
-        <br />
-        <table id="mods" class="@(Model.ShowRaw ? "filters-disabled" : null)">
+        <br/>
+        <table id="mods" class="@(Model.ShowRaw ? "filters-disabled" : null) table">
             <caption>
                 Installed mods:
                 @if (!Model.ShowRaw)
@@ -149,7 +200,7 @@ else if (Model.ParsedLog?.IsValid == true)
                     <span class="notice btn txt" v-on:click="hideAllMods" v-bind:class="{ invisible: !anyModsShown || !anyModsHidden }">hide all</span>
                 }
             </caption>
-            @foreach (var mod in Model.ParsedLog.Mods.Where(p => p.ContentPackFor == null))
+            @foreach (var mod in Model.ParsedLog.Mods.Where(p => p.Loaded && p.ContentPackFor == null))
             {
                 <tr v-on:click="toggleMod('@Model.GetSlug(mod.Name)')" class="mod-entry" v-bind:class="{ hidden: !showMods['@Model.GetSlug(mod.Name)'] }">
                     <td><input type="checkbox" v-bind:checked="showMods['@Model.GetSlug(mod.Name)']" v-bind:class="{ invisible: !anyModsHidden }" /></td>
diff --git a/src/SMAPI.Web/wwwroot/Content/css/log-parser.css b/src/SMAPI.Web/wwwroot/Content/css/log-parser.css
index 2f3dd0a1..5e7ccb79 100644
--- a/src/SMAPI.Web/wwwroot/Content/css/log-parser.css
+++ b/src/SMAPI.Web/wwwroot/Content/css/log-parser.css
@@ -13,6 +13,13 @@ caption {
 #output {
     padding: 10px;
     overflow: auto;
+}
+
+#output h2 {
+    margin: -10px 0 10px -10px;
+}
+
+#output table {
     font-family: monospace;
 }
 
@@ -43,7 +50,7 @@ table caption {
 /*********
 ** Log metadata & filters
 *********/
-#metadata, #mods, #filters {
+.table, #filters {
     border-bottom: 1px dashed #888888;
     margin-bottom: 5px;
 }
@@ -53,7 +60,7 @@ table caption {
     padding-right: 0.7em;
 }
 
-table#metadata, table#mods {
+.table {
     border: 1px solid #000000;
     background: #ffffff;
     border-radius: 5px;
@@ -63,6 +70,18 @@ table#metadata, table#mods {
     box-shadow: 1px 1px 1px 1px #dddddd;
 }
 
+.mod-entry {
+    height: 1.8em;
+}
+
+.table > caption {
+    min-height: 1.3em;
+}
+
+#updates {
+    min-width: 10em;
+}
+
 .invisible {
     visibility: hidden;
 }
@@ -87,8 +106,7 @@ table#metadata, table#mods {
     cursor: default;
 }
 
-#metadata tr,
-#mods tr {
+.table tr {
     background: #eee
 }
 
@@ -114,11 +132,11 @@ table#metadata, table#mods {
     display: inline-block;
 }
 
-#mods .mod-entry.hidden {
+.table .hidden {
     opacity: 0.5;
 }
 
-#mods .content-packs {
+.table .content-packs {
     margin-left: 1em;
     font-size: 0.9em;
     font-style: italic;
@@ -128,8 +146,7 @@ table#metadata, table#mods {
     padding-right: 5px;
 }
 
-#metadata tr:nth-child(even),
-#mods tr:nth-child(even) {
+.table tr:nth-child(even) {
     background: #fff
 }
 
-- 
cgit 


From f676e0fe6d04f31d1614a4f533e20e7d8d499495 Mon Sep 17 00:00:00 2001
From: danvolchek <volchek2@illinois.edu>
Date: Sun, 17 Feb 2019 21:14:00 -0600
Subject: add removed space

---
 src/SMAPI.Web/Views/LogParser/Index.cshtml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

(limited to 'src')

diff --git a/src/SMAPI.Web/Views/LogParser/Index.cshtml b/src/SMAPI.Web/Views/LogParser/Index.cshtml
index 07b413b1..3c842aed 100644
--- a/src/SMAPI.Web/Views/LogParser/Index.cshtml
+++ b/src/SMAPI.Web/Views/LogParser/Index.cshtml
@@ -189,7 +189,7 @@ else if (Model.ParsedLog?.IsValid == true)
                 <td>@Model.ParsedLog.Timestamp.UtcDateTime.ToString("yyyy-MM-dd HH:mm") UTC ({{localTimeStarted}} your time)</td>
             </tr>
         </table>
-        <br/>
+        <br />
         <table id="mods" class="@(Model.ShowRaw ? "filters-disabled" : null) table">
             <caption>
                 Installed mods:
-- 
cgit 


From bbb33c96f1cf698eee1dd398526d9ea853c2fb2f Mon Sep 17 00:00:00 2001
From: danvolchek <volchek2@illinois.edu>
Date: Sun, 17 Feb 2019 21:31:07 -0600
Subject: fix availablity caption case

---
 src/SMAPI.Web/Views/LogParser/Index.cshtml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

(limited to 'src')

diff --git a/src/SMAPI.Web/Views/LogParser/Index.cshtml b/src/SMAPI.Web/Views/LogParser/Index.cshtml
index 3c842aed..bf70f2d7 100644
--- a/src/SMAPI.Web/Views/LogParser/Index.cshtml
+++ b/src/SMAPI.Web/Views/LogParser/Index.cshtml
@@ -125,7 +125,7 @@ else if (Model.ParsedLog?.IsValid == true)
             <p>You have some mods that aren't fully up to date. Updating them can fix problems.</p>
             <table id="updates" class="table">
                 <caption>
-                    Updates Available:
+                    Updates available:
                 </caption>
                 @foreach (LogModInfo mod in Model.ParsedLog.Mods.Where(mod => (mod.HasUpdate && mod.ContentPackFor == null) || (contentPacks != null && contentPacks.TryGetValue(mod.Name, out LogModInfo[] contentPackList) && contentPackList.Any(pack => pack.HasUpdate))))
                 {
-- 
cgit 


From fa3fa400fff0b97cbdca267295f8fbebbab17b61 Mon Sep 17 00:00:00 2001
From: Jesse Plamondon-Willard <Pathoschild@users.noreply.github.com>
Date: Thu, 21 Feb 2019 20:13:05 -0500
Subject: minor tweaks to new log parser UI (#619)

---
 src/SMAPI.Web/Framework/LogParsing/LogParser.cs  |  8 +--
 src/SMAPI.Web/Views/LogParser/Index.cshtml       | 89 ++++++++++++------------
 src/SMAPI.Web/wwwroot/Content/css/log-parser.css |  8 +--
 3 files changed, 52 insertions(+), 53 deletions(-)

(limited to 'src')

diff --git a/src/SMAPI.Web/Framework/LogParsing/LogParser.cs b/src/SMAPI.Web/Framework/LogParsing/LogParser.cs
index 5cdc501f..fdc19404 100644
--- a/src/SMAPI.Web/Framework/LogParsing/LogParser.cs
+++ b/src/SMAPI.Web/Framework/LogParsing/LogParser.cs
@@ -78,7 +78,7 @@ namespace StardewModdingAPI.Web.Framework.LogParsing
                 };
 
                 // parse log messages
-                LogModInfo smapiMod = new LogModInfo { Name = "SMAPI", Author = "Pathoschild", Description = "", Loaded = true};
+                LogModInfo smapiMod = new LogModInfo { Name = "SMAPI", Author = "Pathoschild", Description = "", Loaded = true };
                 LogModInfo gameMod = new LogModInfo { Name = "game", Author = "", Description = "", Loaded = true };
                 IDictionary<string, LogModInfo> mods = new Dictionary<string, LogModInfo>();
                 bool inModList = false;
@@ -100,11 +100,9 @@ namespace StardewModdingAPI.Web.Framework.LogParsing
                                 break;
 
                             default:
-                            {
                                 if (mods.ContainsKey(message.Mod))
                                     mods[message.Mod].Errors++;
                                 break;
-                            }
                         }
                     }
 
@@ -162,11 +160,11 @@ namespace StardewModdingAPI.Web.Framework.LogParsing
                             }
                             else
                             {
-                                mods[name] = new LogModInfo {Name = name, UpdateVersion = version, UpdateLink = link, Loaded = false};
+                                mods[name] = new LogModInfo { Name = name, UpdateVersion = version, UpdateLink = link, Loaded = false };
                             }
                         }
 
-                        else if(message.Level == LogLevel.Alert && this.SMAPIUpdatePattern.IsMatch(message.Text))
+                        else if (message.Level == LogLevel.Alert && this.SMAPIUpdatePattern.IsMatch(message.Text))
                         {
                             Match match = this.SMAPIUpdatePattern.Match(message.Text);
                             string version = match.Groups["version"].Value;
diff --git a/src/SMAPI.Web/Views/LogParser/Index.cshtml b/src/SMAPI.Web/Views/LogParser/Index.cshtml
index bf70f2d7..21adf35b 100644
--- a/src/SMAPI.Web/Views/LogParser/Index.cshtml
+++ b/src/SMAPI.Web/Views/LogParser/Index.cshtml
@@ -17,10 +17,10 @@
     {
         <meta name="robots" content="noindex" />
     }
-    <link rel="stylesheet" href="~/Content/css/log-parser.css?r=20180627" />
+    <link rel="stylesheet" href="~/Content/css/log-parser.css?r=20190221" />
     <script src="https://cdn.jsdelivr.net/npm/vue@2.5.17/dist/vue.min.js" crossorigin="anonymous"></script>
     <script src="https://cdn.jsdelivr.net/npm/jquery@3.3.1/dist/jquery.min.js" crossorigin="anonymous"></script>
-    <script src="~/Content/js/log-parser.js?r=20180627"></script>
+    <script src="~/Content/js/log-parser.js?r=20190221"></script>
     <script>
         $(function() {
             smapi.logParser({
@@ -121,52 +121,53 @@ else if (Model.ParsedLog?.IsValid == true)
         @if (Model.ParsedLog.Mods.Any(mod => mod.HasUpdate))
         {
             <h2>Suggested fixes</h2>
+            <ul id="fix-list">
+                <li>
+                    Consider updating these mods to fix problems:
 
-            <p>You have some mods that aren't fully up to date. Updating them can fix problems.</p>
-            <table id="updates" class="table">
-                <caption>
-                    Updates available:
-                </caption>
-                @foreach (LogModInfo mod in Model.ParsedLog.Mods.Where(mod => (mod.HasUpdate && mod.ContentPackFor == null) || (contentPacks != null && contentPacks.TryGetValue(mod.Name, out LogModInfo[] contentPackList) && contentPackList.Any(pack => pack.HasUpdate))))
-                {
-                <tr class="mod-entry">
-                    <td>
-                        <strong class=@(!mod.HasUpdate ? "hidden": "")>@mod.Name</strong>
-                        @if (contentPacks != null && contentPacks.TryGetValue(mod.Name, out LogModInfo[] contentPackList))
-                        {
-                            <div class="content-packs">
-                                @foreach (LogModInfo contentPack in contentPackList.Where(pack => pack.HasUpdate))
-                                {
-                                    <text>+ @contentPack.Name</text><br />
-                                }
-                            </div>
-                        }
-                    </td>
-                    <td>
-                        @if (mod.HasUpdate)
-                        {
-                        <a href="@mod.UpdateLink" target="_blank">
-                            @(mod.Version == null ? @mod.UpdateVersion : $"{mod.Version} → {mod.UpdateVersion}")
-                            </a>
-                        }
-                        else
+                    <table id="updates" class="table">
+                        @foreach (LogModInfo mod in Model.ParsedLog.Mods.Where(mod => (mod.HasUpdate && mod.ContentPackFor == null) || (contentPacks != null && contentPacks.TryGetValue(mod.Name, out LogModInfo[] contentPackList) && contentPackList.Any(pack => pack.HasUpdate))))
                         {
-                            <span class="invisible">Okay</span>
-                        }
+                            <tr class="mod-entry">
+                                <td>
+                                    <strong class=@(!mod.HasUpdate ? "hidden" : "")>@mod.Name</strong>
+                                    @if (contentPacks != null && contentPacks.TryGetValue(mod.Name, out LogModInfo[] contentPackList))
+                                    {
+                                        <div class="content-packs">
+                                            @foreach (LogModInfo contentPack in contentPackList.Where(pack => pack.HasUpdate))
+                                            {
+                                                <text>+ @contentPack.Name</text><br/>
+                                            }
+                                        </div>
+                                    }
+                                </td>
+                                <td>
+                                    @if (mod.HasUpdate)
+                                    {
+                                        <a href="@mod.UpdateLink" target="_blank">
+                                            @(mod.Version == null ? @mod.UpdateVersion : $"{mod.Version} → {mod.UpdateVersion}")
+                                        </a>
+                                    }
+                                    else
+                                    {
+                                        <text>&nbsp;</text>
+                                    }
 
-                        @if (contentPacks != null && contentPacks.TryGetValue(mod.Name, out contentPackList))
-                        {
-                            <div>
-                                @foreach (LogModInfo contentPack in contentPackList.Where(pack => pack.HasUpdate))
-                                {
-                                    <a href="@contentPack.UpdateLink" target="_blank">@contentPack.Version → @contentPack.UpdateVersion</a><br />
-                                }
-                            </div>
+                                    @if (contentPacks != null && contentPacks.TryGetValue(mod.Name, out contentPackList))
+                                    {
+                                        <div>
+                                            @foreach (LogModInfo contentPack in contentPackList.Where(pack => pack.HasUpdate))
+                                            {
+                                                <a href="@contentPack.UpdateLink" target="_blank">@contentPack.Version → @contentPack.UpdateVersion</a><br/>
+                                            }
+                                        </div>
+                                    }
+                                </td>
+                            </tr>
                         }
-                    </td>
-                </tr>
-                }
-            </table>
+                    </table>
+                </li>
+            </ul>
         }
 
         <h2>Log info</h2>
diff --git a/src/SMAPI.Web/wwwroot/Content/css/log-parser.css b/src/SMAPI.Web/wwwroot/Content/css/log-parser.css
index 5e7ccb79..ea28cd7d 100644
--- a/src/SMAPI.Web/wwwroot/Content/css/log-parser.css
+++ b/src/SMAPI.Web/wwwroot/Content/css/log-parser.css
@@ -78,12 +78,12 @@ table caption {
     min-height: 1.3em;
 }
 
-#updates {
-    min-width: 10em;
+#fix-list {
+    margin-bottom: 2em;
 }
 
-.invisible {
-    visibility: hidden;
+#updates {
+    min-width: 10em;
 }
 
 #mods {
-- 
cgit 


From a743d461ce9efc2b60470a15a3a89fbdb456ac27 Mon Sep 17 00:00:00 2001
From: Jesse Plamondon-Willard <Pathoschild@users.noreply.github.com>
Date: Fri, 22 Feb 2019 21:17:52 -0500
Subject: bump deprecation levels for upcoming SMAPI 3.0 release (#606)

---
 docs/release-notes.md                                 | 3 +++
 src/SMAPI/Framework/Content/AssetDataForDictionary.cs | 6 +++---
 src/SMAPI/Framework/DeprecationManager.cs             | 2 +-
 src/SMAPI/Framework/ModHelpers/ModHelper.cs           | 2 +-
 src/SMAPI/Framework/ModLoading/ModResolver.cs         | 2 +-
 src/SMAPI/Framework/SCore.cs                          | 2 +-
 src/SMAPI/SemanticVersion.cs                          | 2 +-
 7 files changed, 11 insertions(+), 8 deletions(-)

(limited to 'src')

diff --git a/docs/release-notes.md b/docs/release-notes.md
index 92aa6d64..72477df1 100644
--- a/docs/release-notes.md
+++ b/docs/release-notes.md
@@ -5,6 +5,9 @@ Currently in beta for Stardew Valley 1.3.35-beta only. **Not compatible with non
 * For players:
   * Updated for Stardew Valley 1.3.35 beta.
 
+* For modders:
+  * Bumped all deprecation levels to _pending removal_.
+
 * For the web UI:
   * The log parser now displays available updates in a section at the top.
   * Mod compatibility page now crosses out mod links if they're outdated to prevent confusion.
diff --git a/src/SMAPI/Framework/Content/AssetDataForDictionary.cs b/src/SMAPI/Framework/Content/AssetDataForDictionary.cs
index fd3edd5d..11a2564c 100644
--- a/src/SMAPI/Framework/Content/AssetDataForDictionary.cs
+++ b/src/SMAPI/Framework/Content/AssetDataForDictionary.cs
@@ -26,7 +26,7 @@ namespace StardewModdingAPI.Framework.Content
         [Obsolete("Access " + nameof(AssetData<IDictionary<TKey, TValue>>.Data) + "field directly.")]
         public void Set(TKey key, TValue value)
         {
-            SCore.DeprecationManager.Warn($"AssetDataForDictionary.{nameof(Set)}", "2.10", DeprecationLevel.Info);
+            SCore.DeprecationManager.Warn($"AssetDataForDictionary.{nameof(Set)}", "2.10", DeprecationLevel.PendingRemoval);
             this.Data[key] = value;
         }
 
@@ -36,7 +36,7 @@ namespace StardewModdingAPI.Framework.Content
         [Obsolete("Access " + nameof(AssetData<IDictionary<TKey, TValue>>.Data) + "field directly.")]
         public void Set(TKey key, Func<TValue, TValue> value)
         {
-            SCore.DeprecationManager.Warn($"AssetDataForDictionary.{nameof(Set)}", "2.10", DeprecationLevel.Info);
+            SCore.DeprecationManager.Warn($"AssetDataForDictionary.{nameof(Set)}", "2.10", DeprecationLevel.PendingRemoval);
             this.Data[key] = value(this.Data[key]);
         }
 
@@ -45,7 +45,7 @@ namespace StardewModdingAPI.Framework.Content
         [Obsolete("Access " + nameof(AssetData<IDictionary<TKey, TValue>>.Data) + "field directly.")]
         public void Set(Func<TKey, TValue, TValue> replacer)
         {
-            SCore.DeprecationManager.Warn($"AssetDataForDictionary.{nameof(Set)}", "2.10", DeprecationLevel.Info);
+            SCore.DeprecationManager.Warn($"AssetDataForDictionary.{nameof(Set)}", "2.10", DeprecationLevel.PendingRemoval);
             foreach (var pair in this.Data.ToArray())
                 this.Data[pair.Key] = replacer(pair.Key, pair.Value);
         }
diff --git a/src/SMAPI/Framework/DeprecationManager.cs b/src/SMAPI/Framework/DeprecationManager.cs
index fcdf722e..78cf62c2 100644
--- a/src/SMAPI/Framework/DeprecationManager.cs
+++ b/src/SMAPI/Framework/DeprecationManager.cs
@@ -38,7 +38,7 @@ namespace StardewModdingAPI.Framework
         /// <summary>Log a deprecation warning for the old-style events.</summary>
         public void WarnForOldEvents()
         {
-            this.Warn("legacy events", "2.9", DeprecationLevel.Info);
+            this.Warn("legacy events", "2.9", DeprecationLevel.PendingRemoval);
         }
 
         /// <summary>Log a deprecation warning.</summary>
diff --git a/src/SMAPI/Framework/ModHelpers/ModHelper.cs b/src/SMAPI/Framework/ModHelpers/ModHelper.cs
index 18040a78..6c9838c9 100644
--- a/src/SMAPI/Framework/ModHelpers/ModHelper.cs
+++ b/src/SMAPI/Framework/ModHelpers/ModHelper.cs
@@ -166,7 +166,7 @@ namespace StardewModdingAPI.Framework.ModHelpers
         [Obsolete("Use " + nameof(IModHelper) + "." + nameof(IModHelper.ContentPacks) + "." + nameof(IContentPackHelper.CreateTemporary) + " instead")]
         public IContentPack CreateTransitionalContentPack(string directoryPath, string id, string name, string description, string author, ISemanticVersion version)
         {
-            SCore.DeprecationManager.Warn($"{nameof(IModHelper)}.{nameof(IModHelper.CreateTransitionalContentPack)}", "2.5", DeprecationLevel.Info);
+            SCore.DeprecationManager.Warn($"{nameof(IModHelper)}.{nameof(IModHelper.CreateTransitionalContentPack)}", "2.5", DeprecationLevel.PendingRemoval);
             return this.ContentPacks.CreateTemporary(directoryPath, id, name, description, author, version);
         }
 
diff --git a/src/SMAPI/Framework/ModLoading/ModResolver.cs b/src/SMAPI/Framework/ModLoading/ModResolver.cs
index a8564524..75d3849d 100644
--- a/src/SMAPI/Framework/ModLoading/ModResolver.cs
+++ b/src/SMAPI/Framework/ModLoading/ModResolver.cs
@@ -151,7 +151,7 @@ namespace StardewModdingAPI.Framework.ModLoading
                             mod.SetStatus(ModMetadataStatus.Failed, $"its {nameof(IManifest.EntryDll)} value '{mod.Manifest.EntryDll}' doesn't match the actual file capitalisation '{actualFilename}'. The capitalisation must match for crossplatform compatibility.");
                             continue;
 #else
-                            SCore.DeprecationManager.Warn(mod.DisplayName, $"{nameof(IManifest.EntryDll)} value with case-insensitive capitalisation", "2.11", DeprecationLevel.Info);
+                            SCore.DeprecationManager.Warn(mod.DisplayName, $"{nameof(IManifest.EntryDll)} value with case-insensitive capitalisation", "2.11", DeprecationLevel.PendingRemoval);
 #endif
                         }
                     }
diff --git a/src/SMAPI/Framework/SCore.cs b/src/SMAPI/Framework/SCore.cs
index ec3e9f72..e0347eb2 100644
--- a/src/SMAPI/Framework/SCore.cs
+++ b/src/SMAPI/Framework/SCore.cs
@@ -929,7 +929,7 @@ namespace StardewModdingAPI.Framework
             // add deprecation warning for old version format
             {
                 if (mod.Manifest?.Version is Toolkit.SemanticVersion version && version.IsLegacyFormat)
-                    SCore.DeprecationManager.Warn(mod.DisplayName, "non-string manifest version", "2.8", DeprecationLevel.Info);
+                    SCore.DeprecationManager.Warn(mod.DisplayName, "non-string manifest version", "2.8", DeprecationLevel.PendingRemoval);
             }
 #endif
 
diff --git a/src/SMAPI/SemanticVersion.cs b/src/SMAPI/SemanticVersion.cs
index e8e5dfa4..ec2d9e40 100644
--- a/src/SMAPI/SemanticVersion.cs
+++ b/src/SMAPI/SemanticVersion.cs
@@ -33,7 +33,7 @@ namespace StardewModdingAPI
         {
             get
             {
-                SCore.DeprecationManager?.Warn($"{nameof(ISemanticVersion)}.{nameof(ISemanticVersion.Build)}", "2.8", DeprecationLevel.Info);
+                SCore.DeprecationManager?.Warn($"{nameof(ISemanticVersion)}.{nameof(ISemanticVersion.Build)}", "2.8", DeprecationLevel.PendingRemoval);
                 return this.Version.PrereleaseTag;
             }
         }
-- 
cgit 


From c24946c3993c0680153bbf9e536593cc80fc16f0 Mon Sep 17 00:00:00 2001
From: Jesse Plamondon-Willard <Pathoschild@users.noreply.github.com>
Date: Fri, 22 Feb 2019 21:50:09 -0500
Subject: make it clear that mods will break in SMAPI 3.0 (#606)

---
 src/SMAPI/Framework/DeprecationManager.cs | 29 ++++++++++++++++++++++++++---
 1 file changed, 26 insertions(+), 3 deletions(-)

(limited to 'src')

diff --git a/src/SMAPI/Framework/DeprecationManager.cs b/src/SMAPI/Framework/DeprecationManager.cs
index 78cf62c2..3153bbb4 100644
--- a/src/SMAPI/Framework/DeprecationManager.cs
+++ b/src/SMAPI/Framework/DeprecationManager.cs
@@ -14,7 +14,11 @@ namespace StardewModdingAPI.Framework
         private readonly HashSet<string> LoggedDeprecations = new HashSet<string>(StringComparer.InvariantCultureIgnoreCase);
 
         /// <summary>Encapsulates monitoring and logging for a given module.</summary>
+#if !SMAPI_3_0_STRICT
+        private readonly Monitor Monitor;
+#else
         private readonly IMonitor Monitor;
+#endif
 
         /// <summary>Tracks the installed mods.</summary>
         private readonly ModRegistry ModRegistry;
@@ -22,6 +26,11 @@ namespace StardewModdingAPI.Framework
         /// <summary>The queued deprecation warnings to display.</summary>
         private readonly IList<DeprecationWarning> QueuedWarnings = new List<DeprecationWarning>();
 
+#if !SMAPI_3_0_STRICT
+        /// <summary>Whether the one-time deprecation message has been shown.</summary>
+        private bool DeprecationHeaderShown = false;
+#endif
+
 
         /*********
         ** Public methods
@@ -29,7 +38,11 @@ namespace StardewModdingAPI.Framework
         /// <summary>Construct an instance.</summary>
         /// <param name="monitor">Encapsulates monitoring and logging for a given module.</param>
         /// <param name="modRegistry">Tracks the installed mods.</param>
+#if !SMAPI_3_0_STRICT
+        public DeprecationManager(Monitor monitor, ModRegistry modRegistry)
+#else
         public DeprecationManager(IMonitor monitor, ModRegistry modRegistry)
+#endif
         {
             this.Monitor = monitor;
             this.ModRegistry = modRegistry;
@@ -68,15 +81,25 @@ namespace StardewModdingAPI.Framework
         /// <summary>Print any queued messages.</summary>
         public void PrintQueued()
         {
+#if !SMAPI_3_0_STRICT
+            if (!this.DeprecationHeaderShown && this.QueuedWarnings.Any())
+            {
+                this.Monitor.Newline();
+                this.Monitor.Log("Some of your mods will break in the upcoming SMAPI 3.0. Please update your mods now, or notify the author if no update is available. See https://mods.smapi.io for links to the latest versions.", LogLevel.Warn);
+                this.Monitor.Newline();
+                this.DeprecationHeaderShown = true;
+            }
+#endif
+
             foreach (DeprecationWarning warning in this.QueuedWarnings.OrderBy(p => p.ModName).ThenBy(p => p.NounPhrase))
             {
                 // build message
 #if SMAPI_3_0_STRICT
-                string message = $"{warning.ModName ?? "An unknown mod"} uses deprecated code ({warning.NounPhrase} is deprecated since SMAPI {warning.Version}).";
+                string message = $"{warning.ModName} uses deprecated code ({warning.NounPhrase} is deprecated since SMAPI {warning.Version}).";
 #else
                 string message = warning.NounPhrase == "legacy events"
-                    ? $"{warning.ModName ?? "An unknown mod"} uses deprecated code (legacy events are deprecated since SMAPI {warning.Version})."
-                    : $"{warning.ModName ?? "An unknown mod"} uses deprecated code ({warning.NounPhrase} is deprecated since SMAPI {warning.Version}).";
+                    ? $"{warning.ModName ?? "An unknown mod"} will break in the upcoming SMAPI 3.0 (legacy events are deprecated since SMAPI {warning.Version})."
+                    : $"{warning.ModName ?? "An unknown mod"} will break in the upcoming SMAPI 3.0 ({warning.NounPhrase} is deprecated since SMAPI {warning.Version}).";
 #endif
 
                 // get log level
-- 
cgit 


From c7cb7ebb8112f848c3f66f7ae98c9ec0139935aa Mon Sep 17 00:00:00 2001
From: Jesse Plamondon-Willard <Pathoschild@users.noreply.github.com>
Date: Sun, 24 Feb 2019 16:29:50 -0500
Subject: fix smapi.io linking to an archived download in rare cases

---
 docs/release-notes.md                        | 1 +
 src/SMAPI.Web/Controllers/IndexController.cs | 3 +++
 2 files changed, 4 insertions(+)

(limited to 'src')

diff --git a/docs/release-notes.md b/docs/release-notes.md
index 72477df1..dce1e715 100644
--- a/docs/release-notes.md
+++ b/docs/release-notes.md
@@ -11,6 +11,7 @@ Currently in beta for Stardew Valley 1.3.35-beta only. **Not compatible with non
 * For the web UI:
   * The log parser now displays available updates in a section at the top.
   * Mod compatibility page now crosses out mod links if they're outdated to prevent confusion.
+  * Fixed smapi.io linking to an archived download in rare cases.
 
 ## 2.10.2
 Released 09 January 2019 for Stardew Valley 1.3.32–33.
diff --git a/src/SMAPI.Web/Controllers/IndexController.cs b/src/SMAPI.Web/Controllers/IndexController.cs
index 7b3b3e80..ea1a52b2 100644
--- a/src/SMAPI.Web/Controllers/IndexController.cs
+++ b/src/SMAPI.Web/Controllers/IndexController.cs
@@ -141,6 +141,9 @@ namespace StardewModdingAPI.Web.Controllers
 
             foreach (GitAsset asset in release.Assets)
             {
+                if (asset.FileName.StartsWith("Z_OLD"))
+                    continue;
+
                 Match match = Regex.Match(asset.FileName, @"SMAPI-(?<version>[\d\.]+(?:-.+)?)-installer(?<forDevs>-for-developers)?.zip");
                 if (!match.Success || !SemanticVersion.TryParse(match.Groups["version"].Value, out ISemanticVersion version))
                     continue;
-- 
cgit 


From 460b440c2ef4f8c7e2015375fa603095146d1f11 Mon Sep 17 00:00:00 2001
From: Jesse Plamondon-Willard <Pathoschild@users.noreply.github.com>
Date: Fri, 1 Mar 2019 14:10:29 -0500
Subject: prepare for 2.11 release

---
 docs/release-notes.md                        | 10 +++++-----
 src/SMAPI.Mods.ConsoleCommands/manifest.json |  4 ++--
 src/SMAPI.Mods.SaveBackup/manifest.json      |  4 ++--
 src/SMAPI/Constants.cs                       |  4 ++--
 4 files changed, 11 insertions(+), 11 deletions(-)

(limited to 'src')

diff --git a/docs/release-notes.md b/docs/release-notes.md
index dce1e715..fec8f9ac 100644
--- a/docs/release-notes.md
+++ b/docs/release-notes.md
@@ -1,16 +1,16 @@
 # Release notes
-## 2.11-beta
-Currently in beta for Stardew Valley 1.3.35-beta only. **Not compatible with non-beta versions of the game.**
+## 2.11
+Released 01 March 2019 for Stardew Valley 1.3.36.
 
 * For players:
-  * Updated for Stardew Valley 1.3.35 beta.
+  * Updated for Stardew Valley 1.3.36.
 
 * For modders:
   * Bumped all deprecation levels to _pending removal_.
 
 * For the web UI:
-  * The log parser now displays available updates in a section at the top.
-  * Mod compatibility page now crosses out mod links if they're outdated to prevent confusion.
+  * The log parser now shows available updates in a section at the top.
+  * The mod compatibility page now crosses out mod links if they're outdated to avoid confusion.
   * Fixed smapi.io linking to an archived download in rare cases.
 
 ## 2.10.2
diff --git a/src/SMAPI.Mods.ConsoleCommands/manifest.json b/src/SMAPI.Mods.ConsoleCommands/manifest.json
index c3ecf242..afefd733 100644
--- a/src/SMAPI.Mods.ConsoleCommands/manifest.json
+++ b/src/SMAPI.Mods.ConsoleCommands/manifest.json
@@ -1,9 +1,9 @@
 {
   "Name": "Console Commands",
   "Author": "SMAPI",
-  "Version": "2.11.0-beta.2",
+  "Version": "2.11.0",
   "Description": "Adds SMAPI console commands that let you manipulate the game.",
   "UniqueID": "SMAPI.ConsoleCommands",
   "EntryDll": "ConsoleCommands.dll",
-  "MinimumApiVersion": "2.11.0-beta.2"
+  "MinimumApiVersion": "2.11.0"
 }
diff --git a/src/SMAPI.Mods.SaveBackup/manifest.json b/src/SMAPI.Mods.SaveBackup/manifest.json
index b91986f2..a5841a65 100644
--- a/src/SMAPI.Mods.SaveBackup/manifest.json
+++ b/src/SMAPI.Mods.SaveBackup/manifest.json
@@ -1,9 +1,9 @@
 {
   "Name": "Save Backup",
   "Author": "SMAPI",
-  "Version": "2.11.0-beta.2",
+  "Version": "2.11.0",
   "Description": "Automatically backs up all your saves once per day into its folder.",
   "UniqueID": "SMAPI.SaveBackup",
   "EntryDll": "SaveBackup.dll",
-  "MinimumApiVersion": "2.11.0-beta.2"
+  "MinimumApiVersion": "2.11.0"
 }
diff --git a/src/SMAPI/Constants.cs b/src/SMAPI/Constants.cs
index e0684bf4..d90eecf7 100644
--- a/src/SMAPI/Constants.cs
+++ b/src/SMAPI/Constants.cs
@@ -20,10 +20,10 @@ namespace StardewModdingAPI
         ** Public
         ****/
         /// <summary>SMAPI's current semantic version.</summary>
-        public static ISemanticVersion ApiVersion { get; } = new Toolkit.SemanticVersion("2.11.0-beta.2");
+        public static ISemanticVersion ApiVersion { get; } = new Toolkit.SemanticVersion("2.11.0");
 
         /// <summary>The minimum supported version of Stardew Valley.</summary>
-        public static ISemanticVersion MinimumGameVersion { get; } = new GameVersion("1.3.35");
+        public static ISemanticVersion MinimumGameVersion { get; } = new GameVersion("1.3.36");
 
         /// <summary>The maximum supported version of Stardew Valley.</summary>
         public static ISemanticVersion MaximumGameVersion { get; } = null;
-- 
cgit