From a64a60e82bfa2feb8e69bf38170b81ed2d364b23 Mon Sep 17 00:00:00 2001 From: GitHub Actions Bot Date: Mon, 16 Sep 2024 11:08:11 +0000 Subject: [PATCH 1/5] Update contributor and language data --- _data/external/github-data.json | 476 +++++++++++++++++--------------- 1 file changed, 252 insertions(+), 224 deletions(-) diff --git a/_data/external/github-data.json b/_data/external/github-data.json index a1a5f14149..e08a886cca 100644 --- a/_data/external/github-data.json +++ b/_data/external/github-data.json @@ -1,5 +1,5 @@ [ - "Sun Sep 15 2024 11:04:43 GMT+0000 (Coordinated Universal Time)", + "Mon Sep 16 2024 11:05:03 GMT+0000 (Coordinated Universal Time)", { "id": 76137532, "name": "webapp", @@ -1764,7 +1764,7 @@ "github_url": "https://github.com/HackforLABot", "avatar_url": "https://avatars.githubusercontent.com/u/64623632?v=4", "gravatar_id": "", - "contributions": 2634 + "contributions": 2635 }, { "id": 37763229, @@ -4974,14 +4974,14 @@ "github_url": "https://github.com/apps/github-actions", "avatar_url": "https://avatars.githubusercontent.com/in/15368?v=4", "gravatar_id": "", - "contributions": 17680 + "contributions": 17692 }, { "id": 37763229, "github_url": "https://github.com/ExperimentsInHonesty", "avatar_url": "https://avatars.githubusercontent.com/u/37763229?v=4", "gravatar_id": "", - "contributions": 3916 + "contributions": 3925 }, { "id": 31293603, @@ -4995,14 +4995,14 @@ "github_url": "https://github.com/roslynwythe", "avatar_url": "https://avatars.githubusercontent.com/u/5314153?v=4", "gravatar_id": "", - "contributions": 1979 + "contributions": 1981 }, { "id": 40799239, "github_url": "https://github.com/t-will-gillis", "avatar_url": "https://avatars.githubusercontent.com/u/40799239?v=4", "gravatar_id": "", - "contributions": 973 + "contributions": 976 }, { "id": 843538, @@ -5016,7 +5016,7 @@ "github_url": "https://github.com/HackforLABot", "avatar_url": "https://avatars.githubusercontent.com/u/64623632?v=4", "gravatar_id": "", - "contributions": 831 + "contributions": 843 }, { "id": 88953806, @@ -5170,7 +5170,7 @@ "github_url": "https://github.com/tamara-snyder", "avatar_url": "https://avatars.githubusercontent.com/u/57715733?v=4", "gravatar_id": "", - "contributions": 149 + "contributions": 150 }, { "id": 134206855, @@ -5445,6 +5445,13 @@ "gravatar_id": "", "contributions": 64 }, + { + "id": 162255980, + "github_url": "https://github.com/codyyjxn", + "avatar_url": "https://avatars.githubusercontent.com/u/162255980?v=4", + "gravatar_id": "", + "contributions": 64 + }, { "id": 34320199, "github_url": "https://github.com/iancooperman", @@ -5459,13 +5466,6 @@ "gravatar_id": "", "contributions": 63 }, - { - "id": 162255980, - "github_url": "https://github.com/codyyjxn", - "avatar_url": "https://avatars.githubusercontent.com/u/162255980?v=4", - "gravatar_id": "", - "contributions": 63 - }, { "id": 40401149, "github_url": "https://github.com/arghmatey", @@ -5628,18 +5628,18 @@ "contributions": 50 }, { - "id": 110741503, - "github_url": "https://github.com/njackman-2344", - "avatar_url": "https://avatars.githubusercontent.com/u/110741503?v=4", + "id": 76607726, + "github_url": "https://github.com/vorleakyek", + "avatar_url": "https://avatars.githubusercontent.com/u/76607726?v=4", "gravatar_id": "", "contributions": 50 }, { - "id": 76607726, - "github_url": "https://github.com/vorleakyek", - "avatar_url": "https://avatars.githubusercontent.com/u/76607726?v=4", + "id": 110741503, + "github_url": "https://github.com/njackman-2344", + "avatar_url": "https://avatars.githubusercontent.com/u/110741503?v=4", "gravatar_id": "", - "contributions": 49 + "contributions": 50 }, { "id": 52610573, @@ -5676,6 +5676,13 @@ "gravatar_id": "", "contributions": 47 }, + { + "id": 5404705, + "github_url": "https://github.com/dcotelessa", + "avatar_url": "https://avatars.githubusercontent.com/u/5404705?v=4", + "gravatar_id": "", + "contributions": 46 + }, { "id": 22040592, "github_url": "https://github.com/Adaakal", @@ -5704,13 +5711,6 @@ "gravatar_id": "", "contributions": 46 }, - { - "id": 5404705, - "github_url": "https://github.com/dcotelessa", - "avatar_url": "https://avatars.githubusercontent.com/u/5404705?v=4", - "gravatar_id": "", - "contributions": 45 - }, { "id": 49097867, "github_url": "https://github.com/robertnjenga", @@ -6145,6 +6145,13 @@ "gravatar_id": "", "contributions": 29 }, + { + "id": 6422574, + "github_url": "https://github.com/bexux", + "avatar_url": "https://avatars.githubusercontent.com/u/6422574?v=4", + "gravatar_id": "", + "contributions": 28 + }, { "id": 42919318, "github_url": "https://github.com/sena-ji", @@ -6173,6 +6180,13 @@ "gravatar_id": "", "contributions": 28 }, + { + "id": 85697744, + "github_url": "https://github.com/vanessasinam", + "avatar_url": "https://avatars.githubusercontent.com/u/85697744?v=4", + "gravatar_id": "", + "contributions": 28 + }, { "id": 89051599, "github_url": "https://github.com/LukeLowrey2", @@ -6201,6 +6215,13 @@ "gravatar_id": "", "contributions": 27 }, + { + "id": 38481415, + "github_url": "https://github.com/kgold2018", + "avatar_url": "https://avatars.githubusercontent.com/u/38481415?v=4", + "gravatar_id": "", + "contributions": 27 + }, { "id": 67685634, "github_url": "https://github.com/Hritik1503", @@ -6257,13 +6278,6 @@ "gravatar_id": "", "contributions": 27 }, - { - "id": 6422574, - "github_url": "https://github.com/bexux", - "avatar_url": "https://avatars.githubusercontent.com/u/6422574?v=4", - "gravatar_id": "", - "contributions": 26 - }, { "id": 20477610, "github_url": "https://github.com/pearlescence-m", @@ -6432,13 +6446,6 @@ "gravatar_id": "", "contributions": 25 }, - { - "id": 85697744, - "github_url": "https://github.com/vanessasinam", - "avatar_url": "https://avatars.githubusercontent.com/u/85697744?v=4", - "gravatar_id": "", - "contributions": 25 - }, { "id": 105458204, "github_url": "https://github.com/graycodesnu", @@ -6523,13 +6530,6 @@ "gravatar_id": "", "contributions": 23 }, - { - "id": 38481415, - "github_url": "https://github.com/kgold2018", - "avatar_url": "https://avatars.githubusercontent.com/u/38481415?v=4", - "gravatar_id": "", - "contributions": 23 - }, { "id": 65210047, "github_url": "https://github.com/daniellen00", @@ -6586,6 +6586,13 @@ "gravatar_id": "", "contributions": 22 }, + { + "id": 19900334, + "github_url": "https://github.com/yujioshiro", + "avatar_url": "https://avatars.githubusercontent.com/u/19900334?v=4", + "gravatar_id": "", + "contributions": 22 + }, { "id": 20999589, "github_url": "https://github.com/johnr54321", @@ -6621,6 +6628,13 @@ "gravatar_id": "", "contributions": 22 }, + { + "id": 79749200, + "github_url": "https://github.com/buneeIsSlo", + "avatar_url": "https://avatars.githubusercontent.com/u/79749200?v=4", + "gravatar_id": "", + "contributions": 22 + }, { "id": 83323065, "github_url": "https://github.com/SaashaG", @@ -6670,13 +6684,6 @@ "gravatar_id": "", "contributions": 21 }, - { - "id": 19900334, - "github_url": "https://github.com/yujioshiro", - "avatar_url": "https://avatars.githubusercontent.com/u/19900334?v=4", - "gravatar_id": "", - "contributions": 21 - }, { "id": 43166263, "github_url": "https://github.com/anthonypz", @@ -6762,16 +6769,16 @@ "contributions": 20 }, { - "id": 54752231, - "github_url": "https://github.com/hannahlivnat", - "avatar_url": "https://avatars2.githubusercontent.com/u/54752231?v=4", + "id": 33110962, + "github_url": "https://github.com/FamousHero", + "avatar_url": "https://avatars.githubusercontent.com/u/33110962?v=4", "gravatar_id": "", "contributions": 20 }, { - "id": 79749200, - "github_url": "https://github.com/buneeIsSlo", - "avatar_url": "https://avatars.githubusercontent.com/u/79749200?v=4", + "id": 54752231, + "github_url": "https://github.com/hannahlivnat", + "avatar_url": "https://avatars2.githubusercontent.com/u/54752231?v=4", "gravatar_id": "", "contributions": 20 }, @@ -6817,6 +6824,13 @@ "gravatar_id": "", "contributions": 20 }, + { + "id": 135287156, + "github_url": "https://github.com/mSharifHub", + "avatar_url": "https://avatars.githubusercontent.com/u/135287156?v=4", + "gravatar_id": "", + "contributions": 20 + }, { "id": 21295363, "github_url": "https://github.com/giroz", @@ -6880,13 +6894,6 @@ "gravatar_id": "", "contributions": 19 }, - { - "id": 135287156, - "github_url": "https://github.com/mSharifHub", - "avatar_url": "https://avatars.githubusercontent.com/u/135287156?v=4", - "gravatar_id": "", - "contributions": 19 - }, { "id": 138083707, "github_url": "https://github.com/ihop-56", @@ -6908,13 +6915,6 @@ "gravatar_id": "", "contributions": 18 }, - { - "id": 33110962, - "github_url": "https://github.com/FamousHero", - "avatar_url": "https://avatars.githubusercontent.com/u/33110962?v=4", - "gravatar_id": "", - "contributions": 18 - }, { "id": 40847248, "github_url": "https://github.com/Lol-Whut", @@ -8084,6 +8084,13 @@ "gravatar_id": "", "contributions": 8 }, + { + "id": 22222266, + "github_url": "https://github.com/mayankt153", + "avatar_url": "https://avatars.githubusercontent.com/u/22222266?v=4", + "gravatar_id": "", + "contributions": 8 + }, { "id": 28853379, "github_url": "https://github.com/geedtd", @@ -8112,6 +8119,13 @@ "gravatar_id": "", "contributions": 8 }, + { + "id": 62929026, + "github_url": "https://github.com/maadeshsivakumar", + "avatar_url": "https://avatars.githubusercontent.com/u/62929026?v=4", + "gravatar_id": "", + "contributions": 8 + }, { "id": 63172733, "github_url": "https://github.com/scorbz9", @@ -8287,13 +8301,6 @@ "gravatar_id": "", "contributions": 7 }, - { - "id": 22222266, - "github_url": "https://github.com/mayankt153", - "avatar_url": "https://avatars.githubusercontent.com/u/22222266?v=4", - "gravatar_id": "", - "contributions": 7 - }, { "id": 25230575, "github_url": "https://github.com/sanya301", @@ -8497,6 +8504,13 @@ "gravatar_id": "", "contributions": 7 }, + { + "id": 177593508, + "github_url": "https://github.com/Samhitha444", + "avatar_url": "https://avatars.githubusercontent.com/u/177593508?v=4", + "gravatar_id": "", + "contributions": 7 + }, { "id": 801206, "github_url": "https://github.com/jjandoc", @@ -8602,13 +8616,6 @@ "gravatar_id": "", "contributions": 6 }, - { - "id": 62929026, - "github_url": "https://github.com/maadeshsivakumar", - "avatar_url": "https://avatars.githubusercontent.com/u/62929026?v=4", - "gravatar_id": "", - "contributions": 6 - }, { "id": 65536532, "github_url": "https://github.com/PamelaLi36", @@ -9043,13 +9050,6 @@ "gravatar_id": "", "contributions": 5 }, - { - "id": 177593508, - "github_url": "https://github.com/Samhitha444", - "avatar_url": "https://avatars.githubusercontent.com/u/177593508?v=4", - "gravatar_id": "", - "contributions": 5 - }, { "id": 6236085, "github_url": "https://github.com/Hanastevenson", @@ -11283,6 +11283,20 @@ "gravatar_id": "", "contributions": 1 }, + { + "id": 116132806, + "github_url": "https://github.com/anurajdhillon", + "avatar_url": "https://avatars.githubusercontent.com/u/116132806?v=4", + "gravatar_id": "", + "contributions": 1 + }, + { + "id": 118405499, + "github_url": "https://github.com/cbutcher318", + "avatar_url": "https://avatars.githubusercontent.com/u/118405499?v=4", + "gravatar_id": "", + "contributions": 1 + }, { "id": 119059108, "github_url": "https://github.com/tuhinaww", @@ -11397,21 +11411,21 @@ "github_url": "https://github.com/apps/github-actions", "avatar_url": "https://avatars.githubusercontent.com/in/15368?v=4", "gravatar_id": "", - "contributions": 17680 + "contributions": 17692 }, { "id": 37763229, "github_url": "https://github.com/ExperimentsInHonesty", "avatar_url": "https://avatars.githubusercontent.com/u/37763229?v=4", "gravatar_id": "", - "contributions": 4053 + "contributions": 4062 }, { "id": 64623632, "github_url": "https://github.com/HackforLABot", "avatar_url": "https://avatars.githubusercontent.com/u/64623632?v=4", "gravatar_id": "", - "contributions": 3465 + "contributions": 3478 }, { "id": 31293603, @@ -11425,14 +11439,14 @@ "github_url": "https://github.com/roslynwythe", "avatar_url": "https://avatars.githubusercontent.com/u/5314153?v=4", "gravatar_id": "", - "contributions": 1992 + "contributions": 1994 }, { "id": 40799239, "github_url": "https://github.com/t-will-gillis", "avatar_url": "https://avatars.githubusercontent.com/u/40799239?v=4", "gravatar_id": "", - "contributions": 1031 + "contributions": 1034 }, { "id": 843538, @@ -11600,7 +11614,7 @@ "github_url": "https://github.com/tamara-snyder", "avatar_url": "https://avatars.githubusercontent.com/u/57715733?v=4", "gravatar_id": "", - "contributions": 154 + "contributions": 155 }, { "id": 76500899, @@ -11889,18 +11903,18 @@ "gravatar_id": "", "contributions": 67 }, - { - "id": 19783179, - "github_url": "https://github.com/ajb176", - "avatar_url": "https://avatars.githubusercontent.com/u/19783179?v=4", - "gravatar_id": "", - "contributions": 66 - }, { "id": 162255980, "github_url": "https://github.com/codyyjxn", "avatar_url": "https://avatars.githubusercontent.com/u/162255980?v=4", "gravatar_id": "", + "contributions": 67 + }, + { + "id": 19783179, + "github_url": "https://github.com/ajb176", + "avatar_url": "https://avatars.githubusercontent.com/u/19783179?v=4", + "gravatar_id": "", "contributions": 66 }, { @@ -12090,20 +12104,20 @@ "github_url": "https://github.com/dcotelessa", "avatar_url": "https://avatars.githubusercontent.com/u/5404705?v=4", "gravatar_id": "", - "contributions": 51 - }, - { - "id": 31682285, - "github_url": "https://github.com/anthonysim", - "avatar_url": "https://avatars.githubusercontent.com/u/31682285?v=4", - "gravatar_id": "", - "contributions": 51 + "contributions": 52 }, { "id": 76607726, "github_url": "https://github.com/vorleakyek", "avatar_url": "https://avatars.githubusercontent.com/u/76607726?v=4", "gravatar_id": "", + "contributions": 52 + }, + { + "id": 31682285, + "github_url": "https://github.com/anthonysim", + "avatar_url": "https://avatars.githubusercontent.com/u/31682285?v=4", + "gravatar_id": "", "contributions": 51 }, { @@ -12624,6 +12638,13 @@ "gravatar_id": "", "contributions": 32 }, + { + "id": 85697744, + "github_url": "https://github.com/vanessasinam", + "avatar_url": "https://avatars.githubusercontent.com/u/85697744?v=4", + "gravatar_id": "", + "contributions": 32 + }, { "id": 95264760, "github_url": "https://github.com/ShrutiMukherjee", @@ -12694,6 +12715,13 @@ "gravatar_id": "", "contributions": 31 }, + { + "id": 6422574, + "github_url": "https://github.com/bexux", + "avatar_url": "https://avatars.githubusercontent.com/u/6422574?v=4", + "gravatar_id": "", + "contributions": 30 + }, { "id": 13112628, "github_url": "https://github.com/yulia-kh", @@ -12799,6 +12827,13 @@ "gravatar_id": "", "contributions": 29 }, + { + "id": 38481415, + "github_url": "https://github.com/kgold2018", + "avatar_url": "https://avatars.githubusercontent.com/u/38481415?v=4", + "gravatar_id": "", + "contributions": 29 + }, { "id": 53095957, "github_url": "https://github.com/santisecco", @@ -12813,13 +12848,6 @@ "gravatar_id": "", "contributions": 29 }, - { - "id": 85697744, - "github_url": "https://github.com/vanessasinam", - "avatar_url": "https://avatars.githubusercontent.com/u/85697744?v=4", - "gravatar_id": "", - "contributions": 29 - }, { "id": 99231462, "github_url": "https://github.com/pluto-bell", @@ -12862,13 +12890,6 @@ "gravatar_id": "", "contributions": 29 }, - { - "id": 6422574, - "github_url": "https://github.com/bexux", - "avatar_url": "https://avatars.githubusercontent.com/u/6422574?v=4", - "gravatar_id": "", - "contributions": 28 - }, { "id": 24577323, "github_url": "https://github.com/partapparam", @@ -12946,6 +12967,13 @@ "gravatar_id": "", "contributions": 27 }, + { + "id": 79749200, + "github_url": "https://github.com/buneeIsSlo", + "avatar_url": "https://avatars.githubusercontent.com/u/79749200?v=4", + "gravatar_id": "", + "contributions": 27 + }, { "id": 85914721, "github_url": "https://github.com/ahoang94", @@ -13065,13 +13093,6 @@ "gravatar_id": "", "contributions": 26 }, - { - "id": 38481415, - "github_url": "https://github.com/kgold2018", - "avatar_url": "https://avatars.githubusercontent.com/u/38481415?v=4", - "gravatar_id": "", - "contributions": 25 - }, { "id": 41170744, "github_url": "https://github.com/poorvi4", @@ -13107,13 +13128,6 @@ "gravatar_id": "", "contributions": 25 }, - { - "id": 79749200, - "github_url": "https://github.com/buneeIsSlo", - "avatar_url": "https://avatars.githubusercontent.com/u/79749200?v=4", - "gravatar_id": "", - "contributions": 25 - }, { "id": 100053673, "github_url": "https://github.com/carolemlago", @@ -13121,6 +13135,13 @@ "gravatar_id": "", "contributions": 25 }, + { + "id": 19900334, + "github_url": "https://github.com/yujioshiro", + "avatar_url": "https://avatars.githubusercontent.com/u/19900334?v=4", + "gravatar_id": "", + "contributions": 24 + }, { "id": 21321101, "github_url": "https://github.com/davidwiese", @@ -13206,16 +13227,16 @@ "contributions": 23 }, { - "id": 19900334, - "github_url": "https://github.com/yujioshiro", - "avatar_url": "https://avatars.githubusercontent.com/u/19900334?v=4", + "id": 31785367, + "github_url": "https://github.com/Tomomi-K1", + "avatar_url": "https://avatars.githubusercontent.com/u/31785367?v=4", "gravatar_id": "", "contributions": 23 }, { - "id": 31785367, - "github_url": "https://github.com/Tomomi-K1", - "avatar_url": "https://avatars.githubusercontent.com/u/31785367?v=4", + "id": 33110962, + "github_url": "https://github.com/FamousHero", + "avatar_url": "https://avatars.githubusercontent.com/u/33110962?v=4", "gravatar_id": "", "contributions": 23 }, @@ -13366,13 +13387,6 @@ "gravatar_id": "", "contributions": 21 }, - { - "id": 33110962, - "github_url": "https://github.com/FamousHero", - "avatar_url": "https://avatars.githubusercontent.com/u/33110962?v=4", - "gravatar_id": "", - "contributions": 21 - }, { "id": 42814942, "github_url": "https://github.com/JasonY188", @@ -13464,6 +13478,13 @@ "gravatar_id": "", "contributions": 20 }, + { + "id": 135287156, + "github_url": "https://github.com/mSharifHub", + "avatar_url": "https://avatars.githubusercontent.com/u/135287156?v=4", + "gravatar_id": "", + "contributions": 20 + }, { "id": 7707247, "github_url": "https://github.com/frankstepanski", @@ -13583,13 +13604,6 @@ "gravatar_id": "", "contributions": 19 }, - { - "id": 135287156, - "github_url": "https://github.com/mSharifHub", - "avatar_url": "https://avatars.githubusercontent.com/u/135287156?v=4", - "gravatar_id": "", - "contributions": 19 - }, { "id": 12601182, "github_url": "https://github.com/klei0229", @@ -14507,6 +14521,13 @@ "gravatar_id": "", "contributions": 10 }, + { + "id": 62929026, + "github_url": "https://github.com/maadeshsivakumar", + "avatar_url": "https://avatars.githubusercontent.com/u/62929026?v=4", + "gravatar_id": "", + "contributions": 10 + }, { "id": 63476477, "github_url": "https://github.com/imvan2", @@ -14829,6 +14850,13 @@ "gravatar_id": "", "contributions": 8 }, + { + "id": 22222266, + "github_url": "https://github.com/mayankt153", + "avatar_url": "https://avatars.githubusercontent.com/u/22222266?v=4", + "gravatar_id": "", + "contributions": 8 + }, { "id": 32211826, "github_url": "https://github.com/ctsexton", @@ -14878,13 +14906,6 @@ "gravatar_id": "", "contributions": 8 }, - { - "id": 62929026, - "github_url": "https://github.com/maadeshsivakumar", - "avatar_url": "https://avatars.githubusercontent.com/u/62929026?v=4", - "gravatar_id": "", - "contributions": 8 - }, { "id": 64881557, "github_url": "https://github.com/chelseybeck", @@ -15004,13 +15025,6 @@ "gravatar_id": "", "contributions": 7 }, - { - "id": 22222266, - "github_url": "https://github.com/mayankt153", - "avatar_url": "https://avatars.githubusercontent.com/u/22222266?v=4", - "gravatar_id": "", - "contributions": 7 - }, { "id": 25230575, "github_url": "https://github.com/sanya301", @@ -15214,6 +15228,13 @@ "gravatar_id": "", "contributions": 7 }, + { + "id": 177593508, + "github_url": "https://github.com/Samhitha444", + "avatar_url": "https://avatars.githubusercontent.com/u/177593508?v=4", + "gravatar_id": "", + "contributions": 7 + }, { "id": 801206, "github_url": "https://github.com/jjandoc", @@ -15683,13 +15704,6 @@ "gravatar_id": "", "contributions": 5 }, - { - "id": 177593508, - "github_url": "https://github.com/Samhitha444", - "avatar_url": "https://avatars.githubusercontent.com/u/177593508?v=4", - "gravatar_id": "", - "contributions": 5 - }, { "id": 4373031, "github_url": "https://github.com/breyell", @@ -17741,6 +17755,20 @@ "gravatar_id": "", "contributions": 1 }, + { + "id": 116132806, + "github_url": "https://github.com/anurajdhillon", + "avatar_url": "https://avatars.githubusercontent.com/u/116132806?v=4", + "gravatar_id": "", + "contributions": 1 + }, + { + "id": 118405499, + "github_url": "https://github.com/cbutcher318", + "avatar_url": "https://avatars.githubusercontent.com/u/118405499?v=4", + "gravatar_id": "", + "contributions": 1 + }, { "id": 119059108, "github_url": "https://github.com/tuhinaww", @@ -21415,7 +21443,7 @@ "github_url": "https://github.com/cottonchristopher", "avatar_url": "https://avatars.githubusercontent.com/u/142280921?v=4", "gravatar_id": "", - "contributions": 98 + "contributions": 99 }, { "id": 9143823, @@ -22280,7 +22308,7 @@ "github_url": "https://github.com/cottonchristopher", "avatar_url": "https://avatars.githubusercontent.com/u/142280921?v=4", "gravatar_id": "", - "contributions": 98 + "contributions": 99 }, { "id": 2508797, @@ -24003,6 +24031,13 @@ "gravatar_id": "", "contributions": 2 }, + { + "id": 23167934, + "github_url": "https://github.com/dipitvasdev", + "avatar_url": "https://avatars.githubusercontent.com/u/23167934?v=4", + "gravatar_id": "", + "contributions": 2 + }, { "id": 33485657, "github_url": "https://github.com/akinevans", @@ -24087,13 +24122,6 @@ "gravatar_id": "", "contributions": 1 }, - { - "id": 23167934, - "github_url": "https://github.com/dipitvasdev", - "avatar_url": "https://avatars.githubusercontent.com/u/23167934?v=4", - "gravatar_id": "", - "contributions": 1 - }, { "id": 25173636, "github_url": "https://github.com/nelsonuprety1", @@ -24756,6 +24784,13 @@ "gravatar_id": "", "contributions": 5 }, + { + "id": 23167934, + "github_url": "https://github.com/dipitvasdev", + "avatar_url": "https://avatars.githubusercontent.com/u/23167934?v=4", + "gravatar_id": "", + "contributions": 4 + }, { "id": 63771558, "github_url": "https://github.com/R-Tomas-Gonzalez", @@ -24798,13 +24833,6 @@ "gravatar_id": "", "contributions": 4 }, - { - "id": 23167934, - "github_url": "https://github.com/dipitvasdev", - "avatar_url": "https://avatars.githubusercontent.com/u/23167934?v=4", - "gravatar_id": "", - "contributions": 3 - }, { "id": 31785367, "github_url": "https://github.com/Tomomi-K1", @@ -26119,6 +26147,13 @@ "gravatar_id": "", "contributions": 9 }, + { + "id": 135684929, + "github_url": "https://github.com/Shienny1", + "avatar_url": "https://avatars.githubusercontent.com/u/135684929?v=4", + "gravatar_id": "", + "contributions": 9 + }, { "id": 2889477, "github_url": "https://github.com/sameergautam", @@ -26182,13 +26217,6 @@ "gravatar_id": "", "contributions": 6 }, - { - "id": 135684929, - "github_url": "https://github.com/Shienny1", - "avatar_url": "https://avatars.githubusercontent.com/u/135684929?v=4", - "gravatar_id": "", - "contributions": 6 - }, { "id": 2693687, "github_url": "https://github.com/sthapa", @@ -27215,6 +27243,13 @@ "gravatar_id": "", "contributions": 9 }, + { + "id": 135684929, + "github_url": "https://github.com/Shienny1", + "avatar_url": "https://avatars.githubusercontent.com/u/135684929?v=4", + "gravatar_id": "", + "contributions": 9 + }, { "id": 2889477, "github_url": "https://github.com/sameergautam", @@ -27292,13 +27327,6 @@ "gravatar_id": "", "contributions": 6 }, - { - "id": 135684929, - "github_url": "https://github.com/Shienny1", - "avatar_url": "https://avatars.githubusercontent.com/u/135684929?v=4", - "gravatar_id": "", - "contributions": 6 - }, { "id": 22056864, "github_url": "https://github.com/temrb", @@ -29215,7 +29243,7 @@ "github_url": "https://github.com/apps/github-actions", "avatar_url": "https://avatars.githubusercontent.com/in/15368?v=4", "gravatar_id": "", - "contributions": 622 + "contributions": 623 }, { "id": 87077650, @@ -29460,7 +29488,7 @@ "github_url": "https://github.com/hasham-qaiser", "avatar_url": "https://avatars.githubusercontent.com/u/117246204?v=4", "gravatar_id": "", - "contributions": 16 + "contributions": 17 }, { "id": 83653014, @@ -29835,7 +29863,7 @@ "github_url": "https://github.com/apps/github-actions", "avatar_url": "https://avatars.githubusercontent.com/in/15368?v=4", "gravatar_id": "", - "contributions": 622 + "contributions": 623 }, { "id": 75542938, @@ -29940,7 +29968,7 @@ "github_url": "https://github.com/hasham-qaiser", "avatar_url": "https://avatars.githubusercontent.com/u/117246204?v=4", "gravatar_id": "", - "contributions": 65 + "contributions": 66 }, { "id": 140572103, @@ -32586,7 +32614,7 @@ "github_url": "https://github.com/JackHaeg", "avatar_url": "https://avatars.githubusercontent.com/u/134463646?v=4", "gravatar_id": "", - "contributions": 529 + "contributions": 530 }, { "id": 68244054, @@ -33458,7 +33486,7 @@ "github_url": "https://github.com/JackHaeg", "avatar_url": "https://avatars.githubusercontent.com/u/134463646?v=4", "gravatar_id": "", - "contributions": 532 + "contributions": 533 }, { "id": 11681030, From 751432e72b6412047f3913a8f7e1d3d42ad15f69 Mon Sep 17 00:00:00 2001 From: GitHub Actions Bot Date: Mon, 16 Sep 2024 16:27:47 +0000 Subject: [PATCH 2/5] Update label directory --- github-actions/utils/_data/label-directory.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/github-actions/utils/_data/label-directory.json b/github-actions/utils/_data/label-directory.json index 0dcdbd86c5..0a1e76d3d1 100644 --- a/github-actions/utils/_data/label-directory.json +++ b/github-actions/utils/_data/label-directory.json @@ -794,5 +794,9 @@ "NEW-labelForTestingPart2": [ "Label for TESTING part 2", 9999999999 + ], + "NEW-featureRoadmap": [ + "feature: Roadmap", + 7472857782 ] } \ No newline at end of file From c2de0853ce063e2c9924f59583a5d37045801bd1 Mon Sep 17 00:00:00 2001 From: Jacques Pham Date: Mon, 16 Sep 2024 09:39:58 -0700 Subject: [PATCH 3/5] Check Developer's Complexity Allowance for Issue Assignments (#6853) * Add personal access token * Create developer-complexity-reminder.md file * Add script file to check complexity eligibility * Update preliminary-update-comment.js - Refactor makeComment function - Add check complexity eligibility condition * Update to work with array of replacements * Update check-complexity-eligibility.js * Revert makeComment function * Update commentObject propertie * Update columnName exception * Update developer-complexity-reminder * Update developer-complexity-reminder * Update commentObject properties * Update secret token for testing * Update checkComplexityEligibility function * Add exception for ER and epic issues * Update exception logic * Clean up code and replace secret tokens * Remove extra space * Update complexity eligibility check for Projects V2 * Update tokens and IDs for testing * Add mock team membership for testing * Fix fetchProjectItemInfo query * Update fetchProjectItemInfo for consistency * Fix UpdateItemStatus * Add delay before moving Prework issue * Clean up code and replace secret tokens * Fix typo * Refactor to use mutateIssueStatus, queryIssueInfo, and statusFieldIds utils * Revert formatComment util * Revert commentObject * Remove formatComment util import * Add formatComment function * Update issueComplexityPermitted * Update postComment arguments order --- .../check-complexity-eligibility.js | 449 ++++++++++++++++++ .../developer-complexity-reminder.md | 12 + .../preliminary-update-comment.js | 16 +- 3 files changed, 476 insertions(+), 1 deletion(-) create mode 100644 github-actions/trigger-issue/add-preliminary-comment/check-complexity-eligibility.js create mode 100644 github-actions/trigger-issue/add-preliminary-comment/developer-complexity-reminder.md diff --git a/github-actions/trigger-issue/add-preliminary-comment/check-complexity-eligibility.js b/github-actions/trigger-issue/add-preliminary-comment/check-complexity-eligibility.js new file mode 100644 index 0000000000..7f0c19b63e --- /dev/null +++ b/github-actions/trigger-issue/add-preliminary-comment/check-complexity-eligibility.js @@ -0,0 +1,449 @@ +const fs = require('fs'); +const mutateIssueStatus = require('../../utils/mutate-issue-status'); +const postComment = require('../../utils/post-issue-comment'); +const queryIssueInfo = require('../../utils/query-issue-info'); +const statusFieldIds = require('../../utils/_data/status-field-ids'); +const { setTimeout } = require('timers/promises'); + +/** +* Checks if an assignee is eligible to be assigned an issue based on their +* previous assignments and the complexity of the current issue. +* @param {Object} github - The GitHub API client. +* @param {Object} context - The GitHub webhook event context. +* @param {boolean} isAdminOrMerge - Whether the assignee is an admin or merge team member. +* @returns {Promise} A promise that resolves to true if the assignee +* is eligible, false otherwise. +*/ + +async function checkComplexityEligibility( + github, + context, + isAdminOrMerge +) { + // If assignee is an admin or merge team member, skip complexity check + if (isAdminOrMerge) { + return true; + } + + const currentIssue = formatCurrentIssue( + context.payload.issue, + context.payload.sender + ); + + // Fetch the current issue's project item ID and status name + const { id: projectItemId, statusName } = await queryIssueInfo( + github, + context, + currentIssue.issueNum + ); + + // If issue's status is New Issue Approval, skip complexity check + if (statusName === 'New Issue Approval') { + return true; + } + + // If issue created by assignee or not self-assigned, skip complexity check + if (currentIssue.assigneeId === currentIssue.creatorId || + currentIssue.assigneeId !== currentIssue.assignerId) { + return true; + } + + const hasAnyLabel = (labels, referenceLabels) => + labels.some(label => referenceLabels.includes(label)); + + const exceptionLabels = [ + 'ER', + 'epic' + ]; + const requiredRoleLabels = [ + 'role: front end', + 'role: back end/devOps' + ]; + const requiredComplexityLabels = [ + 'good first issue', + 'Complexity: Small', + 'Complexity: Medium' + ]; + + // If issue has any exception labels, skip complexity check + if (hasAnyLabel(currentIssue.labels, exceptionLabels)) { + return true; + } + + // If issue doesn't have required labels, skip complexity check + if (!hasAnyLabel(currentIssue.labels, requiredRoleLabels) || + !hasAnyLabel(currentIssue.labels, requiredComplexityLabels)) { + return true; + } + + const assignedIssues = await fetchIssuesByAssignee( + github, + context, + currentIssue.assigneeUsername + ); + const previousIssues = assignedIssues.filter( + issue => issue.issueNum !== currentIssue.issueNum + ); + + const preWorkIssue = extractPreWorkIssueFromIssues(assignedIssues); + const assigneeRole = extractRoleFromPreWorkIssue(preWorkIssue); + + const issueComplexityPermitted = isEligibleForIssue( + currentIssue, + previousIssues, + assigneeRole + ); + + if (!issueComplexityPermitted) { + const { id: preWorkIssueProjectItemId } = + await queryIssueInfo( + github, + context, + preWorkIssue.issueNum + ); + await handleIssueComplexityNotPermitted( + github, + context, + currentIssue.issueNum, + currentIssue.assigneeUsername, + projectItemId, + preWorkIssue, + preWorkIssueProjectItemId + ); + } + + return issueComplexityPermitted; +} + +/** +* Fetches all issues assigned to a given user. +* @param {Object} github - The GitHub API client. +* @param {Object} context - The GitHub webhook event context. +* @param {string} username - The GitHub username of the assignee. +* @returns {Promise} A promise that resolves to an array of assigned +* issues. +*/ + +async function fetchIssuesByAssignee(github, context, username) { + try { + const { owner, repo } = context.repo; + const response = await github.rest.issues.listForRepo({ + owner, + repo, + assignee: username, + state: 'all', + per_page: 100, + }); + + const issues = response.data; + + if (issues.length === 0) { + return []; + } + + return issues.map(issue => ({ + issueNum: issue.number, + issueTitle: issue.title, + labels: issue.labels.map(label => label.name), + state: issue.state, + assigneeId: issue.assignee.id, + creatorId: issue.user.id, + })); + + } catch (error) { + console.error(`Error fetching issues for assignee ${username}`, error); + return []; + } +} + +// Formats the current issue data. +function formatCurrentIssue(issue, sender) { + return { + issueNum: issue.number, + issueTitle: issue.title, + labels: issue.labels.map(label => label.name), + assigneeId: issue.assignee.id, + assigneeUsername: issue.assignee.login, + assignerId: sender.id, + creatorId: issue.user.id, + }; +} + +/** +* Checks if an assignee is eligible to be assigned an issue based on their +* previous assignments and the complexity of the current issue. +* @param {Object} currentIssue - The current issue data. +* @param {Array} previousIssues - An array of previously assigned issues. +* @param {Array} assigneeRole - An array of the assignee's roles. +* @returns {boolean} True if the assignee is eligible, false otherwise. +*/ + +function isEligibleForIssue(currentIssue, previousIssues, assigneeRole) { + const currentIssueComplexityAndRoles = extractComplexityAndRolesFromLabels( + [currentIssue] + ); + const previousIssuesComplexityAndRoles = extractComplexityAndRolesFromLabels( + previousIssues + ); + + // Check good first issue eligibility + if (currentIssueComplexityAndRoles[0].complexity === 'good first issue') { + const goodFirstIssueCount = previousIssuesComplexityAndRoles.filter( + issue => issue.complexity === 'good first issue' + ).length; + + if (goodFirstIssueCount >= 2) { + return false; + } else { + return true; + } + } + + /* + Check if the assignee has only one role (front end or back end/devOps). + If so, check their eligibility for Small/Medium complexity issues + based on the number of previous issues of the same complexity. + */ + if (assigneeRole.includes('role: front end') !== + assigneeRole.includes('role: back end/devOps')) { + const complexityCount = previousIssuesComplexityAndRoles.filter( + issue => issue.complexity === currentIssueComplexityAndRoles[0].complexity + ).length; + + if (complexityCount >= 1) { + return false; + } + } + + // Check for Small/Medium complexity eligibility for assignee with both roles + let matchingComplexityIssues = []; + + if (assigneeRole.includes('role: front end') && + assigneeRole.includes('role: back end/devOps')) { + matchingComplexityIssues = previousIssuesComplexityAndRoles.filter( + issue => issue.complexity.includes( + currentIssueComplexityAndRoles[0].complexity + ) + ); + + if (matchingComplexityIssues.length >= 2) { + return false; + } + } + + /* + If there is one previous issue of the same complexity, + check the eligibility based on the role labels of the + previous and current issues. + */ + if (matchingComplexityIssues.length === 1) { + const previousMatchingIssue = matchingComplexityIssues[0]; + + const currentIssueHasFrontEnd = + currentIssueComplexityAndRoles[0].role.includes('role: front end'); + const currentIssueHasBackEnd = + currentIssueComplexityAndRoles[0].role.includes('role: back end/devOps'); + + const previousMatchingIssueHasFrontEnd = + previousMatchingIssue.role.includes('role: front end'); + const previousMatchingIssueHasBackEnd = + previousMatchingIssue.role.includes('role: back end/devOps'); + + // If the previous issue had both roles, + // the current issue must have one of the roles, but not both + if (previousMatchingIssueHasFrontEnd && previousMatchingIssueHasBackEnd) { + return (currentIssueHasFrontEnd || currentIssueHasBackEnd) && + !(currentIssueHasFrontEnd && currentIssueHasBackEnd); + + // If the previous issue had only front end role, + // the new issue must have back end role + } else if (previousMatchingIssueHasFrontEnd) { + return currentIssueHasBackEnd; + + // If the previous issue had only back end role, + // the new issue must have front end role + } else if (previousMatchingIssueHasBackEnd) { + return currentIssueHasFrontEnd; + } + } + + return true; +} + +// Extracts complexity and roles from issue labels. +function extractComplexityAndRolesFromLabels(issues) { + // Filter to only include issues not created by assignee + const filteredIssues = issues.filter( + issue => issue.assigneeId !== issue.creatorId + ); + + return filteredIssues.map(issue => ({ + complexity: issue.labels.find( + label => + label === 'good first issue' || + label === 'Complexity: Small' || + label === 'Complexity: Medium' + ), + role: issue.labels.filter( + label => + label === 'role: front end' || label === 'role: back end/devOps' + ), + })).filter(issue => issue.complexity); +} + +// Extracts the Pre-Work Checklist (Skills Issue) from assigned issues. +function extractPreWorkIssueFromIssues(assignedIssues) { + const preWorkIssue = assignedIssues.find( + issue => issue.labels.includes('Complexity: Prework') + ); + + if (!preWorkIssue) { + throw new Error( + `Assignee's Pre-Work Checklist (Skills Issue) not found in assigned issues.` + ); + } + + return preWorkIssue; +} + +// Extracts roles from the Pre-Work Checklist (Skills Issue). +function extractRoleFromPreWorkIssue(preWorkIssue) { + return preWorkIssue.labels.filter( + label => + label === 'role: front end' || label === 'role: back end/devOps' + ); +} + +/** +* Handles actions to take when an issue is not within the complexity +* eligibility for an assignee. +* @param {Object} github - The GitHub API client. +* @param {Object} context - The GitHub webhook event context. +* @param {number} currentIssueNum - The current issue number. +* @param {string} assigneeUsername - The GitHub username of the assignee. +* @param {string} currentIssueprojectItemId - The project item ID of the current +* issue. +* @param {Object} preWorkIssue - The Pre-Work Checklist (Skills Issue) object. +* @param {string} preWorkIssueProjectItemId - The project item ID of the +* Pre-Work Checklist (Skills Issue). +*/ + +async function handleIssueComplexityNotPermitted( + github, + context, + currentIssueNum, + assigneeUsername, + projectItemId, + preWorkIssue, + preWorkIssueProjectItemId +) { + try { + const { owner, repo } = context.repo; + + // Unassign assignee from the issue + await github.rest.issues.removeAssignees({ + owner, + repo, + issue_number: currentIssueNum, + assignees: [assigneeUsername], + }); + + // Add 'Ready for Prioritization' label + await github.rest.issues.addLabels({ + owner, + repo, + issue_number: currentIssueNum, + labels: ['Ready for Prioritization'], + }); + + // Change issue's status to New Issue Approval + await mutateIssueStatus( + github, + context, + projectItemId, + statusFieldIds('New_Issue_Approval') + ); + + // If the assignee's Pre-work Checklist (Skills Issue) is closed, open it + if (preWorkIssue.state === 'closed') { + await github.rest.issues.update({ + owner, + repo, + issue_number: preWorkIssue.issueNum, + state: 'open', + }); + + // Brief delay allows Project automation to move Prework to New Issue Approval + // before script moves it to In Progress, ensuring correct final status + await setTimeout(5000); + + // Change Pre-work Checklist (Skills Issue) status to In Progress + await mutateIssueStatus( + github, + context, + preWorkIssueProjectItemId, + statusFieldIds('In_Progress') + ); + } + + const commentBody = formatComplexityReminderComment( + currentIssueNum, + assigneeUsername + ); + + // Post comment on the issue + await postComment(currentIssueNum, commentBody, github, context); + + // Post comment on the assignee's Pre-work Checklist (Skills Issue) + await postComment(preWorkIssue.issueNum, commentBody, github, context); + + } catch (error) { + throw new Error( + `Failed to handle issue complexity not permitted for issue #${currentIssueNum}: ${error.message}` + ); + } +} + +// Formats the complexity reminder comment +function formatComplexityReminderComment(issueNum, assigneeUsername) { + const replacements = [ + { + replacementString: assigneeUsername, + placeholderString: '${issueAssignee}' + }, + { + replacementString: issueNum, + placeholderString: '${issueNum}' + }, + ]; + + return formatComment( + { + replacements, + filePathToFormat: './github-actions/trigger-issue/add-preliminary-comment/developer-complexity-reminder.md', + textToFormat: null, + }, + fs + ); +} + +/** + * @description - This function formats the comment to be posted based on an array of multiple replacement objects. + * @param {Array} replacements - an array of replacement objects, each containing: + * - {String} replacementString - the string to replace the placeholder in the md file + * - {String} placeholderString - the placeholder to be replaced in the md file + * @param {String} filePathToFormat - the path of the md file to be formatted + * @param {String} textToFormat - the text to be formatted. If null, use the md file provided in the path. If provided, format that text + * @returns {String} - returns a formatted comment to be posted on github + */ +function formatComment({ replacements, filePathToFormat, textToFormat }, fs) { + let commentToPost = textToFormat === null ? fs.readFileSync(filePathToFormat).toString('utf-8') : textToFormat; + + for (const { replacementString, placeholderString } of replacements) { + commentToPost = commentToPost.replace(placeholderString, replacementString) + } + + return commentToPost; +} + +module.exports = checkComplexityEligibility; diff --git a/github-actions/trigger-issue/add-preliminary-comment/developer-complexity-reminder.md b/github-actions/trigger-issue/add-preliminary-comment/developer-complexity-reminder.md new file mode 100644 index 0000000000..8be7975412 --- /dev/null +++ b/github-actions/trigger-issue/add-preliminary-comment/developer-complexity-reminder.md @@ -0,0 +1,12 @@ + +Hello @${issueAssignee}, we appreciate you taking on issue #${issueNum}, however it looks like you've already worked on enough issues of this complexity. Try checking out some of the issues of the next complexity from the Prioritized Backlog :) + +We are going to unassign you from this issue so you can take on another issue. + +Hfla appreciates you! :) + +P.S. There is one exception to this rule/automation, and that is if you were away for a long time, and need to do the issue ladder again. If that is the case, please post the following note on the issue and on your Skills Issue (Pre-work Checklist). A Merge team member will reassign you to this issue, and will help you get assigned to subsequent issues up to medium size. + +``` +I am returning after a significant time away, and need to do the issue ladder again. Please assign me back to this issue. +``` \ No newline at end of file diff --git a/github-actions/trigger-issue/add-preliminary-comment/preliminary-update-comment.js b/github-actions/trigger-issue/add-preliminary-comment/preliminary-update-comment.js index 78b15002d6..382b7772b0 100644 --- a/github-actions/trigger-issue/add-preliminary-comment/preliminary-update-comment.js +++ b/github-actions/trigger-issue/add-preliminary-comment/preliminary-update-comment.js @@ -3,6 +3,7 @@ const fs = require("fs"); const postComment = require('../../utils/post-issue-comment'); const formatComment = require('../../utils/format-comment'); const getTimeline = require('../../utils/get-timeline'); +const checkComplexityEligibility = require('./check-complexity-eligibility'); const getTeamMembers = require('../../utils/get-team-members'); // Global variables @@ -58,6 +59,19 @@ async function main({ g, c }, { shouldPost, issueNum }) { const isAdminOrMerge = await memberOfAdminOrMergeTeam(); const isAssignedToAnotherIssues = await assignedToAnotherIssue(); + // Check if developer is allowed to work on complexity level of the issue + const issueComplexityPermitted = await checkComplexityEligibility( + github, + context, + isAdminOrMerge, + ); + // If complexity not permitted, stop here, check-complexity-eligibility.js + // script will perform remaining tasks and post comment + if (issueComplexityPermitted === false) { + console.log("Issue of this complexity is not permitted."); + return; + } + // If developer is not in Admin or Merge Teams and assigned to another issue/s, do the following: if(!isAdminOrMerge && isAssignedToAnotherIssues) { const comment = await createComment("multiple-issue-reminder.md"); @@ -319,4 +333,4 @@ async function updateItemStatus(itemId, newStatusValue) { } } -module.exports = main; \ No newline at end of file +module.exports = main; From 8c78a489994f7b4dafe2e12ced71cfb6f28daec8 Mon Sep 17 00:00:00 2001 From: Tamara Snyder <57715733+tamara-snyder@users.noreply.github.com> Date: Mon, 16 Sep 2024 15:49:36 -0400 Subject: [PATCH 4/5] Fix email link in Right to be forgotten section of privacy-policy.yml (#7461) --- _data/internal/privacy-policy.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_data/internal/privacy-policy.yml b/_data/internal/privacy-policy.yml index c39e21e2d6..49f09f95a6 100644 --- a/_data/internal/privacy-policy.yml +++ b/_data/internal/privacy-policy.yml @@ -77,7 +77,7 @@ privacy-policy: | ## Right to be forgotten and rectification - You may request that we make corrections to any personal data that is stored on our internal databases at any time. You may request that incomplete data be completed or that incorrect data be corrected. Requests can be submitted to [privacy@hackforla.org](privacy@hackforla.org) and reference “Hack for LA Public Website” in the subject line. + You may request that we make corrections to any personal data that is stored on our internal databases at any time. You may request that incomplete data be completed or that incorrect data be corrected. Requests can be submitted to [privacy@hackforla.org](mailto: privacy@hackforla.org) and reference “Hack for LA Public Website” in the subject line. ## Changes From 62a4e78b8e52dfcc1199eabd2adcedb6489f562a Mon Sep 17 00:00:00 2001 From: jmarinit Date: Mon, 16 Sep 2024 12:53:24 -0700 Subject: [PATCH 5/5] Added github-handle for Michael Morgan. (#7428) --- _projects/design-systems.md | 1 + 1 file changed, 1 insertion(+) diff --git a/_projects/design-systems.md b/_projects/design-systems.md index cc32babf0f..71e42c996a 100644 --- a/_projects/design-systems.md +++ b/_projects/design-systems.md @@ -101,6 +101,7 @@ leadership: github: 'https://github.com/liz-zheng' picture: 'https://avatars.githubusercontent.com/liz-zheng' - name: Michael Morgan + github-handle: role: UX/UI Designer links: slack: 'https://hackforla.slack.com/team/U01SPJCC26A'