diff --git a/.npmignore b/.npmignore
index 3c7e2b4b..106bcab7 100644
--- a/.npmignore
+++ b/.npmignore
@@ -10,3 +10,4 @@
!package-lock.json
!README.md
!src
+!templates
diff --git a/package-lock.json b/package-lock.json
index 84200135..a8655409 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -5,9 +5,9 @@
"requires": true,
"dependencies": {
"@openstapps/configuration": {
- "version": "0.6.0",
- "resolved": "https://registry.npmjs.org/@openstapps/configuration/-/configuration-0.6.0.tgz",
- "integrity": "sha512-ArEbUWMwBqrzYzhYKEdQPoYA0M8jxdmCahouukbbrlWz6Ca3h5K1n3C7FG8g17bMYoVkthkJXt4uHMYtsQTY1A==",
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/@openstapps/configuration/-/configuration-0.7.0.tgz",
+ "integrity": "sha512-oQjT4AE3xyMvzdfrpQ18P95i8bp5Bvwlc8SiBOwid0sjGC8ATdLsveZrwF9NHsIxGh8STodfOi/COvae5DnNWA==",
"dev": true,
"requires": {
"@types/chalk": "2.2.0",
@@ -84,33 +84,43 @@
}
},
"@slack/client": {
- "version": "4.9.0",
- "resolved": "https://registry.npmjs.org/@slack/client/-/client-4.9.0.tgz",
- "integrity": "sha512-1M23/RXWOen9miake8B6LVdb6VjZby3dQf4u9Prk/k66NuCxgGfAmXgsMhLMq4S9QJp9wBYH/DajI7fZgy1o5g==",
+ "version": "4.12.0",
+ "resolved": "https://registry.npmjs.org/@slack/client/-/client-4.12.0.tgz",
+ "integrity": "sha512-ltbdkcIWk2eIptCCT/oPmeCGlG8xb3kXfwuPTtvNujioLMo2xXqiPdfl7xK+AeUfnvj3fJLYbpTPuBTscuhgzw==",
"requires": {
"@types/form-data": "^2.2.1",
"@types/is-stream": "^1.1.0",
- "@types/loglevel": "^1.5.3",
"@types/node": ">=6.0.0",
- "@types/p-cancelable": "^0.3.0",
- "@types/p-queue": "^2.3.1",
- "@types/p-retry": "^1.0.1",
- "@types/retry": "^0.10.2",
+ "@types/p-cancelable": "^1.0.0",
+ "@types/p-queue": "^2.3.2",
+ "@types/p-retry": "^3.0.0",
+ "@types/retry": "^0.12.0",
"@types/ws": "^5.1.1",
"axios": "^0.18.0",
- "eventemitter3": "^3.0.0",
+ "eventemitter3": "^3.1.0",
"finity": "^0.5.4",
- "form-data": "^2.3.1",
+ "form-data": "^2.3.3",
"is-stream": "^1.1.0",
- "loglevel": "^1.6.1",
- "object.entries": "^1.0.4",
+ "object.entries": "^1.1.0",
"object.getownpropertydescriptors": "^2.0.3",
- "object.values": "^1.0.4",
- "p-cancelable": "^0.3.0",
- "p-queue": "^2.3.0",
- "p-retry": "^2.0.0",
+ "object.values": "^1.1.0",
+ "p-cancelable": "~1.0.0",
+ "p-queue": "^2.4.2",
+ "p-retry": "^3.0.1",
"retry": "^0.12.0",
"ws": "^5.2.0"
+ },
+ "dependencies": {
+ "form-data": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
+ "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
+ "requires": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.6",
+ "mime-types": "^2.1.12"
+ }
+ }
}
},
"@types/caseless": {
@@ -132,14 +142,6 @@
"resolved": "https://registry.npmjs.org/@types/circular-json/-/circular-json-0.4.0.tgz",
"integrity": "sha512-7+kYB7x5a7nFWW1YPBh3KxhwKfiaI4PbZ1RvzBU91LZy7lWJO822CI+pqzSre/DZ7KsCuMKdHnLHHFu8AyXbQg=="
},
- "@types/del": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/@types/del/-/del-3.0.1.tgz",
- "integrity": "sha512-y6qRq6raBuu965clKgx6FHuiPu3oHdtmzMPXi8Uahsjdq1L6DL5fS/aY5/s71YwM7k6K1QIWvem5vNwlnNGIkQ==",
- "requires": {
- "@types/glob": "*"
- }
- },
"@types/events": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/@types/events/-/events-1.2.0.tgz",
@@ -184,15 +186,6 @@
"integrity": "sha512-pGF/zvYOACZ/gLGWdQH8zSwteQS1epp68yRcVLJMgUck/MjEn/FBYmPub9pXT8C1e4a8YZfHo1CKyV8q1vKUnQ==",
"dev": true
},
- "@types/inquirer": {
- "version": "0.0.43",
- "resolved": "https://registry.npmjs.org/@types/inquirer/-/inquirer-0.0.43.tgz",
- "integrity": "sha512-xgyfKZVMFqE8aIKy1xfFVsX2MxyXUNgjgmbF6dRbR3sL+ZM5K4ka/9L4mmTwX8eTeVYtduyXu0gUVwVJa1HbNw==",
- "requires": {
- "@types/rx": "*",
- "@types/through": "*"
- }
- },
"@types/is-stream": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/@types/is-stream/-/is-stream-1.1.0.tgz",
@@ -207,11 +200,6 @@
"integrity": "sha512-Z3TNyBL8Vd/M9D9Ms2S3LmFq2sSMzahodD6rCS9V2N44HUMINb75jNkSuwAx7eo2ufqTdfOdtGQpNbieUjPQmw==",
"dev": true
},
- "@types/loglevel": {
- "version": "1.5.4",
- "resolved": "https://registry.npmjs.org/@types/loglevel/-/loglevel-1.5.4.tgz",
- "integrity": "sha512-8dx4ckP0vndJeN+iKZwdGiapLqFjVQ3JLOt92uqK0C63acs5NcPLbUOpfXCJkKVRjZLBQjw8NIGNBSsnatFnFQ=="
- },
"@types/marked": {
"version": "0.4.2",
"resolved": "https://registry.npmjs.org/@types/marked/-/marked-0.4.2.tgz",
@@ -223,10 +211,15 @@
"resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz",
"integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA=="
},
+ "@types/mustache": {
+ "version": "0.8.32",
+ "resolved": "https://registry.npmjs.org/@types/mustache/-/mustache-0.8.32.tgz",
+ "integrity": "sha512-RTVWV485OOf4+nO2+feurk0chzHkSjkjALiejpHltyuMf/13fGymbbNNFrSKdSSUg1TIwzszXdWsVirxgqYiFA=="
+ },
"@types/node": {
- "version": "10.12.27",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-10.12.27.tgz",
- "integrity": "sha512-e9wgeY6gaY21on3ve0xAjgBVjGDWq/xUteK0ujsE53bUoxycMkqfnkUgMt6ffZtykZ5X12Mg3T7Pw4TRCObDKg=="
+ "version": "10.12.30",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-10.12.30.tgz",
+ "integrity": "sha512-nsqTN6zUcm9xtdJiM9OvOJ5EF0kOI8f1Zuug27O/rgtxCRJHGqncSWfCMZUP852dCKPsDsYXGvBhxfRjDBkF5Q=="
},
"@types/nodemailer": {
"version": "4.6.5",
@@ -238,9 +231,12 @@
}
},
"@types/p-cancelable": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/@types/p-cancelable/-/p-cancelable-0.3.0.tgz",
- "integrity": "sha512-sP+9Ivnpil7cdmvr5O+145aXm65YX8Y+Lrul1ojdYz6yaE05Dqonn6Z9v5eqJCQ0UeSGcTRtepMlZDh9ywdKgw=="
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@types/p-cancelable/-/p-cancelable-1.0.1.tgz",
+ "integrity": "sha512-MGdhuVx7X2yJe4dgOnDQcZQAYgiC/QK1O5HUPgTMTxWYiOlyWEO5DWmPBlXQBU1F6/JM7aSgYBDrpt7kurC6dw==",
+ "requires": {
+ "p-cancelable": "*"
+ }
},
"@types/p-queue": {
"version": "2.3.2",
@@ -248,18 +244,13 @@
"integrity": "sha512-eKAv5Ql6k78dh3ULCsSBxX6bFNuGjTmof5Q/T6PiECDq0Yf8IIn46jCyp3RJvCi8owaEmm3DZH1PEImjBMd/vQ=="
},
"@types/p-retry": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/@types/p-retry/-/p-retry-1.0.1.tgz",
- "integrity": "sha512-HgQPG9kkUb4EpTeUv2taH2nBZsVUb5aOTSw3X2YozcTG1ttmGcLaLKx1MbAz1evVfUEDTCAPmdz2HiFztIyWrw==",
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/@types/p-retry/-/p-retry-3.0.1.tgz",
+ "integrity": "sha512-LkZCWg4JxFdQR/nGNZcMiyKAbNG3DKBRS6nn6Hg4dLS82zxkdBJJcvf4zXFvDCEI+e4dZdQX6wreqs9RDGMRfw==",
"requires": {
- "@types/retry": "*"
+ "p-retry": "*"
}
},
- "@types/pad": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/@types/pad/-/pad-1.0.2.tgz",
- "integrity": "sha512-33KsQV8vWV4t/q4DE6j7u5ToMuh8kA+c90as7uXZPtWhoBPGkWv7iZUK92AO/Oebbz54MwkZMuyado3L4QT11Q=="
- },
"@types/request": {
"version": "2.48.1",
"resolved": "https://registry.npmjs.org/@types/request/-/request-2.48.1.tgz",
@@ -280,127 +271,9 @@
}
},
"@types/retry": {
- "version": "0.10.2",
- "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.10.2.tgz",
- "integrity": "sha512-LqJkY4VQ7S09XhI7kA3ON71AxauROhSv74639VsNXC9ish4IWHnIi98if+nP1MxQV3RMPqXSCYgpPsDHjlg9UQ=="
- },
- "@types/rx": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/@types/rx/-/rx-4.1.1.tgz",
- "integrity": "sha1-WY/JSla67ZdfGUV04PVy/Y5iekg=",
- "requires": {
- "@types/rx-core": "*",
- "@types/rx-core-binding": "*",
- "@types/rx-lite": "*",
- "@types/rx-lite-aggregates": "*",
- "@types/rx-lite-async": "*",
- "@types/rx-lite-backpressure": "*",
- "@types/rx-lite-coincidence": "*",
- "@types/rx-lite-experimental": "*",
- "@types/rx-lite-joinpatterns": "*",
- "@types/rx-lite-testing": "*",
- "@types/rx-lite-time": "*",
- "@types/rx-lite-virtualtime": "*"
- }
- },
- "@types/rx-core": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/@types/rx-core/-/rx-core-4.0.3.tgz",
- "integrity": "sha1-CzNUsSOM7b4rdPYybxOdvHpZHWA="
- },
- "@types/rx-core-binding": {
- "version": "4.0.4",
- "resolved": "https://registry.npmjs.org/@types/rx-core-binding/-/rx-core-binding-4.0.4.tgz",
- "integrity": "sha512-5pkfxnC4w810LqBPUwP5bg7SFR/USwhMSaAeZQQbEHeBp57pjKXRlXmqpMrLJB4y1oglR/c2502853uN0I+DAQ==",
- "requires": {
- "@types/rx-core": "*"
- }
- },
- "@types/rx-lite": {
- "version": "4.0.5",
- "resolved": "https://registry.npmjs.org/@types/rx-lite/-/rx-lite-4.0.5.tgz",
- "integrity": "sha512-KZk5XTR1dm/kNgBx8iVpjno6fRYtAUQWBOmj+O8j724+nk097sz4fOoHJNpCkOJUtHUurZlJC7QvSFCZHbkC+w==",
- "requires": {
- "@types/rx-core": "*",
- "@types/rx-core-binding": "*"
- }
- },
- "@types/rx-lite-aggregates": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/@types/rx-lite-aggregates/-/rx-lite-aggregates-4.0.3.tgz",
- "integrity": "sha512-MAGDAHy8cRatm94FDduhJF+iNS5//jrZ/PIfm+QYw9OCeDgbymFHChM8YVIvN2zArwsRftKgE33QfRWvQk4DPg==",
- "requires": {
- "@types/rx-lite": "*"
- }
- },
- "@types/rx-lite-async": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/@types/rx-lite-async/-/rx-lite-async-4.0.2.tgz",
- "integrity": "sha512-vTEv5o8l6702ZwfAM5aOeVDfUwBSDOs+ARoGmWAKQ6LOInQ8J4/zjM7ov12fuTpktUKdMQjkeCp07Vd73mPkxw==",
- "requires": {
- "@types/rx-lite": "*"
- }
- },
- "@types/rx-lite-backpressure": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/@types/rx-lite-backpressure/-/rx-lite-backpressure-4.0.3.tgz",
- "integrity": "sha512-Y6aIeQCtNban5XSAF4B8dffhIKu6aAy/TXFlScHzSxh6ivfQBQw6UjxyEJxIOt3IT49YkS+siuayM2H/Q0cmgA==",
- "requires": {
- "@types/rx-lite": "*"
- }
- },
- "@types/rx-lite-coincidence": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/@types/rx-lite-coincidence/-/rx-lite-coincidence-4.0.3.tgz",
- "integrity": "sha512-1VNJqzE9gALUyMGypDXZZXzR0Tt7LC9DdAZQ3Ou/Q0MubNU35agVUNXKGHKpNTba+fr8GdIdkC26bRDqtCQBeQ==",
- "requires": {
- "@types/rx-lite": "*"
- }
- },
- "@types/rx-lite-experimental": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/@types/rx-lite-experimental/-/rx-lite-experimental-4.0.1.tgz",
- "integrity": "sha1-xTL1y98/LBXaFt7Ykw0bKYQCPL0=",
- "requires": {
- "@types/rx-lite": "*"
- }
- },
- "@types/rx-lite-joinpatterns": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/@types/rx-lite-joinpatterns/-/rx-lite-joinpatterns-4.0.1.tgz",
- "integrity": "sha1-9w/jcFGKhDLykVjMkv+1a05K/D4=",
- "requires": {
- "@types/rx-lite": "*"
- }
- },
- "@types/rx-lite-testing": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/@types/rx-lite-testing/-/rx-lite-testing-4.0.1.tgz",
- "integrity": "sha1-IbGdEfTf1v/vWp0WSOnIh5v+Iek=",
- "requires": {
- "@types/rx-lite-virtualtime": "*"
- }
- },
- "@types/rx-lite-time": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/@types/rx-lite-time/-/rx-lite-time-4.0.3.tgz",
- "integrity": "sha512-ukO5sPKDRwCGWRZRqPlaAU0SKVxmWwSjiOrLhoQDoWxZWg6vyB9XLEZViKOzIO6LnTIQBlk4UylYV0rnhJLxQw==",
- "requires": {
- "@types/rx-lite": "*"
- }
- },
- "@types/rx-lite-virtualtime": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/@types/rx-lite-virtualtime/-/rx-lite-virtualtime-4.0.3.tgz",
- "integrity": "sha512-3uC6sGmjpOKatZSVHI2xB1+dedgml669ZRvqxy+WqmGJDVusOdyxcKfyzjW0P3/GrCiN4nmRkLVMhPwHCc5QLg==",
- "requires": {
- "@types/rx-lite": "*"
- }
- },
- "@types/semver": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/@types/semver/-/semver-5.5.0.tgz",
- "integrity": "sha512-41qEJgBH/TWgo5NFSvBCJ1qkoi3Q6ONSF2avrHq1LVEZfYpdHmj0y9SuTK+u9ZhG1sYQKBL1AWXKyLWP4RaUoQ=="
+ "version": "0.12.0",
+ "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz",
+ "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA=="
},
"@types/shelljs": {
"version": "0.8.1",
@@ -412,14 +285,6 @@
"@types/node": "*"
}
},
- "@types/through": {
- "version": "0.0.29",
- "resolved": "https://registry.npmjs.org/@types/through/-/through-0.0.29.tgz",
- "integrity": "sha512-9a7C5VHh+1BKblaYiq+7Tfc+EOmjMdZaD1MYtkQjSoxgB69tBjW98ry6SKsi4zEIWztLOMRuL87A3bdT/Fc/4w==",
- "requires": {
- "@types/node": "*"
- }
- },
"@types/tough-cookie": {
"version": "2.3.4",
"resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-2.3.4.tgz",
@@ -461,11 +326,6 @@
"json-schema-traverse": "^0.3.0"
}
},
- "ansi-escapes": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz",
- "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ=="
- },
"ansi-regex": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
@@ -473,10 +333,13 @@
"dev": true
},
"ansi-styles": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
- "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
- "dev": true
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^1.9.0"
+ }
},
"arg": {
"version": "4.1.0",
@@ -505,19 +368,6 @@
"integrity": "sha1-nlKHYrSpBmrRY6aWKjZEGOlibs4=",
"dev": true
},
- "array-union": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz",
- "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=",
- "requires": {
- "array-uniq": "^1.0.1"
- }
- },
- "array-uniq": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz",
- "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY="
- },
"arrify": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz",
@@ -591,6 +441,12 @@
"js-tokens": "^3.0.2"
},
"dependencies": {
+ "ansi-styles": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+ "dev": true
+ },
"chalk": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
@@ -603,6 +459,12 @@
"strip-ansi": "^3.0.0",
"supports-color": "^2.0.0"
}
+ },
+ "supports-color": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+ "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+ "dev": true
}
}
},
@@ -667,58 +529,18 @@
"version": "2.4.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
"integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "dev": true,
"requires": {
"ansi-styles": "^3.2.1",
"escape-string-regexp": "^1.0.5",
"supports-color": "^5.3.0"
- },
- "dependencies": {
- "ansi-styles": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
- "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
- "requires": {
- "color-convert": "^1.9.0"
- }
- },
- "supports-color": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
- "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
- "requires": {
- "has-flag": "^3.0.0"
- }
- }
}
},
- "chardet": {
- "version": "0.7.0",
- "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz",
- "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA=="
- },
"circular-json": {
"version": "0.5.9",
"resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.5.9.tgz",
"integrity": "sha512-4ivwqHpIFJZBuhN3g/pEcdbnGUywkBblloGbkglyloVjjR3uT6tieI89MVOfbP2tHX5sgb01FuLgAOzebNlJNQ=="
},
- "cli-cursor": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz",
- "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=",
- "requires": {
- "restore-cursor": "^2.0.0"
- }
- },
- "cli-width": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz",
- "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk="
- },
- "clone": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz",
- "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4="
- },
"co": {
"version": "4.6.0",
"resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
@@ -728,6 +550,7 @@
"version": "1.9.3",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
"integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+ "dev": true,
"requires": {
"color-name": "1.1.3"
}
@@ -735,7 +558,8 @@
"color-name": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
- "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU="
+ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
+ "dev": true
},
"combined-stream": {
"version": "1.0.6",
@@ -1023,14 +847,6 @@
}
}
},
- "defaults": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz",
- "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=",
- "requires": {
- "clone": "^1.0.2"
- }
- },
"define-properties": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
@@ -1039,19 +855,6 @@
"object-keys": "^1.0.12"
}
},
- "del": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/del/-/del-3.0.0.tgz",
- "integrity": "sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU=",
- "requires": {
- "globby": "^6.1.0",
- "is-path-cwd": "^1.0.0",
- "is-path-in-cwd": "^1.0.0",
- "p-map": "^1.1.1",
- "pify": "^3.0.0",
- "rimraf": "^2.2.8"
- }
- },
"delayed-stream": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
@@ -1135,7 +938,8 @@
"escape-string-regexp": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
- "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ="
+ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+ "dev": true
},
"esprima": {
"version": "4.0.1",
@@ -1159,16 +963,6 @@
"resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
"integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="
},
- "external-editor": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.0.3.tgz",
- "integrity": "sha512-bn71H9+qWoOQKyZDo25mOMVpSmXROAsTJVVVYzrrtol3d4y+AsKjf4Iwl2Q+IuT0kFSQ1qo166UuIwqYq7mGnA==",
- "requires": {
- "chardet": "^0.7.0",
- "iconv-lite": "^0.4.24",
- "tmp": "^0.0.33"
- }
- },
"extsprintf": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
@@ -1184,14 +978,6 @@
"resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz",
"integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I="
},
- "figures": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz",
- "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=",
- "requires": {
- "escape-string-regexp": "^1.0.5"
- }
- },
"find-up": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
@@ -1504,25 +1290,6 @@
"path-is-absolute": "^1.0.0"
}
},
- "globby": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz",
- "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=",
- "requires": {
- "array-union": "^1.0.1",
- "glob": "^7.0.3",
- "object-assign": "^4.0.1",
- "pify": "^2.0.0",
- "pinkie-promise": "^2.0.0"
- },
- "dependencies": {
- "pify": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
- "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw="
- }
- }
- },
"graceful-fs": {
"version": "4.1.11",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
@@ -1566,7 +1333,8 @@
"has-flag": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
- "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0="
+ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+ "dev": true
},
"has-symbols": {
"version": "1.0.0",
@@ -1595,14 +1363,6 @@
"sshpk": "^1.7.0"
}
},
- "iconv-lite": {
- "version": "0.4.24",
- "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
- "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
- "requires": {
- "safer-buffer": ">= 2.1.2 < 3"
- }
- },
"indent-string": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz",
@@ -1629,46 +1389,6 @@
"integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==",
"dev": true
},
- "inquirer": {
- "version": "6.2.2",
- "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.2.2.tgz",
- "integrity": "sha512-Z2rREiXA6cHRR9KBOarR3WuLlFzlIfAEIiB45ll5SSadMg7WqOh1MKEjjndfuH5ewXdixWCxqnVfGOQzPeiztA==",
- "requires": {
- "ansi-escapes": "^3.2.0",
- "chalk": "^2.4.2",
- "cli-cursor": "^2.1.0",
- "cli-width": "^2.0.0",
- "external-editor": "^3.0.3",
- "figures": "^2.0.0",
- "lodash": "^4.17.11",
- "mute-stream": "0.0.7",
- "run-async": "^2.2.0",
- "rxjs": "^6.4.0",
- "string-width": "^2.1.0",
- "strip-ansi": "^5.0.0",
- "through": "^2.3.6"
- },
- "dependencies": {
- "ansi-regex": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.0.0.tgz",
- "integrity": "sha512-iB5Dda8t/UqpPI/IjsejXu5jOGDrzn41wJyljwPH65VCIbk6+1BzFIMJGFwTNrYXT1CrD+B4l19U7awiQ8rk7w=="
- },
- "lodash": {
- "version": "4.17.11",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz",
- "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg=="
- },
- "strip-ansi": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.0.0.tgz",
- "integrity": "sha512-Uu7gQyZI7J7gn5qLn1Np3G9vcYGTVqB+lFTytnDJv83dd8T22aGH451P3jueT2/QemInJDfxHB5Tde5OzgG1Ow==",
- "requires": {
- "ansi-regex": "^4.0.0"
- }
- }
- }
- },
"interpret": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz",
@@ -1705,49 +1425,18 @@
"number-is-nan": "^1.0.0"
}
},
- "is-fullwidth-code-point": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
- "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8="
- },
"is-obj": {
"version": "1.0.1",
"resolved": "http://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz",
"integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=",
"dev": true
},
- "is-path-cwd": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz",
- "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0="
- },
- "is-path-in-cwd": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz",
- "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==",
- "requires": {
- "is-path-inside": "^1.0.0"
- }
- },
- "is-path-inside": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz",
- "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=",
- "requires": {
- "path-is-inside": "^1.0.1"
- }
- },
"is-plain-obj": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz",
"integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=",
"dev": true
},
- "is-promise": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz",
- "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o="
- },
"is-regex": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz",
@@ -1813,9 +1502,9 @@
"dev": true
},
"js-yaml": {
- "version": "3.12.1",
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.1.tgz",
- "integrity": "sha512-um46hB9wNOKlwkHgiuyEVAybXBjwFUV0Z/RaHJblRd9DXltue9FTYvzCr9ErQrK9Adz5MU4gHWVaNUfdmrC8qA==",
+ "version": "3.12.2",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.2.tgz",
+ "integrity": "sha512-QHn/Lh/7HhZ/Twc7vJYQTkjuCa0kaCcDcjK5Zlk2rvnUpy7DxMJ23+Jc2dcyvltwQVg1nygAVlB2oRDFHoRS5Q==",
"dev": true,
"requires": {
"argparse": "^1.0.7",
@@ -1927,11 +1616,6 @@
"lodash._reinterpolate": "~3.0.0"
}
},
- "loglevel": {
- "version": "1.6.1",
- "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.1.tgz",
- "integrity": "sha1-4PyVEztu8nbNyIh82vJKpvFW+Po="
- },
"loud-rejection": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz",
@@ -1990,11 +1674,6 @@
"mime-db": "~1.35.0"
}
},
- "mimic-fn": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz",
- "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ=="
- },
"minimatch": {
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
@@ -2052,10 +1731,10 @@
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
"integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg=="
},
- "mute-stream": {
- "version": "0.0.7",
- "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz",
- "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s="
+ "mustache": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/mustache/-/mustache-3.0.1.tgz",
+ "integrity": "sha512-jFI/4UVRsRYdUbuDTKT7KzfOp7FiD5WzYmmwNwXyUVypC0xjoTL78Fqc0jHUPIvvGD+6DQSPHIt1NE7D1ArsqA=="
},
"normalize-package-data": {
"version": "2.5.0",
@@ -2089,7 +1768,8 @@
"object-assign": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
- "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
+ "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
+ "dev": true
},
"object-keys": {
"version": "1.1.0",
@@ -2135,14 +1815,6 @@
"wrappy": "1"
}
},
- "onetime": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz",
- "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=",
- "requires": {
- "mimic-fn": "^1.0.0"
- }
- },
"optimist": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz",
@@ -2164,12 +1836,13 @@
"os-tmpdir": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
- "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ="
+ "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=",
+ "dev": true
},
"p-cancelable": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.3.0.tgz",
- "integrity": "sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw=="
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.0.0.tgz",
+ "integrity": "sha512-USgPoaC6tkTGlS831CxsVdmZmyb8tR1D+hStI84MyckLOzfJlYQUweomrwE3D8T7u5u5GVuW064LT501wHTYYA=="
},
"p-limit": {
"version": "1.3.0",
@@ -2189,20 +1862,15 @@
"p-limit": "^1.1.0"
}
},
- "p-map": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz",
- "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA=="
- },
"p-queue": {
"version": "2.4.2",
"resolved": "https://registry.npmjs.org/p-queue/-/p-queue-2.4.2.tgz",
"integrity": "sha512-n8/y+yDJwBjoLQe1GSJbbaYQLTI7QHNZI2+rpmCDbe++WLf9HC3gf6iqj5yfPAV71W4UF3ql5W1+UBPXoXTxng=="
},
"p-retry": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-2.0.0.tgz",
- "integrity": "sha512-ZbCuzAmiwJ45q4evp/IG9D+5MUllGSUeCWwPt3j/tdYSi1KPkSD+46uqmAA1LhccDhOXv8kYZKNb8x78VflzfA==",
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-3.0.1.tgz",
+ "integrity": "sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==",
"requires": {
"retry": "^0.12.0"
}
@@ -2213,14 +1881,6 @@
"integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=",
"dev": true
},
- "pad": {
- "version": "2.2.2",
- "resolved": "https://registry.npmjs.org/pad/-/pad-2.2.2.tgz",
- "integrity": "sha512-w5m0/ISM+Jc/xsxNwKzHhOX+KHKYP3tT+UMmZfCgMSLdCccbjMNYx6LtafOql60qI4NYv13ZGAkSiehJj9ttcQ==",
- "requires": {
- "wcwidth": "^1.0.1"
- }
- },
"parse-github-repo-url": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/parse-github-repo-url/-/parse-github-repo-url-1.4.1.tgz",
@@ -2248,11 +1908,6 @@
"resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
"integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18="
},
- "path-is-inside": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz",
- "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM="
- },
"path-parse": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
@@ -2276,17 +1931,20 @@
"pify": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
- "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY="
+ "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
+ "dev": true
},
"pinkie": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
- "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA="
+ "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=",
+ "dev": true
},
"pinkie-promise": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
"integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
+ "dev": true,
"requires": {
"pinkie": "^2.0.0"
}
@@ -2511,15 +2169,6 @@
"path-parse": "^1.0.6"
}
},
- "restore-cursor": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz",
- "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=",
- "requires": {
- "onetime": "^2.0.0",
- "signal-exit": "^3.0.2"
- }
- },
"retry": {
"version": "0.12.0",
"resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz",
@@ -2529,26 +2178,11 @@
"version": "2.6.3",
"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz",
"integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==",
+ "dev": true,
"requires": {
"glob": "^7.1.3"
}
},
- "run-async": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz",
- "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=",
- "requires": {
- "is-promise": "^2.1.0"
- }
- },
- "rxjs": {
- "version": "6.4.0",
- "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.4.0.tgz",
- "integrity": "sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw==",
- "requires": {
- "tslib": "^1.9.0"
- }
- },
"safe-buffer": {
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
@@ -2562,7 +2196,8 @@
"semver": {
"version": "5.6.0",
"resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz",
- "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg=="
+ "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==",
+ "dev": true
},
"shelljs": {
"version": "0.8.3",
@@ -2578,7 +2213,8 @@
"signal-exit": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
- "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0="
+ "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=",
+ "dev": true
},
"source-map": {
"version": "0.6.1",
@@ -2587,9 +2223,9 @@
"dev": true
},
"source-map-support": {
- "version": "0.5.10",
- "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.10.tgz",
- "integrity": "sha512-YfQ3tQFTK/yzlGJuX8pTwa4tifQj4QS2Mj7UegOu8jAz59MqIiMGPXxQhVQiIMNzayuUSF/jEuVnfFF5JqybmQ==",
+ "version": "0.5.11",
+ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.11.tgz",
+ "integrity": "sha512-//sajEx/fGL3iw6fltKMdPvy8kL3kJ2O3iuYlRoT3k9Kb4BjOoZ+BZzaNHeuaruSt+Kf3Zk9tnfAQg9/AJqUVQ==",
"dev": true,
"requires": {
"buffer-from": "^1.0.0",
@@ -2673,30 +2309,6 @@
"resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz",
"integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks="
},
- "string-width": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
- "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
- "requires": {
- "is-fullwidth-code-point": "^2.0.0",
- "strip-ansi": "^4.0.0"
- },
- "dependencies": {
- "ansi-regex": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
- "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg="
- },
- "strip-ansi": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
- "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
- "requires": {
- "ansi-regex": "^3.0.0"
- }
- }
- }
- },
"string_decoder": {
"version": "1.1.1",
"resolved": "http://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
@@ -2728,15 +2340,13 @@
"dev": true
},
"supports-color": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
- "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
- "dev": true
- },
- "tangular": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/tangular/-/tangular-2.0.1.tgz",
- "integrity": "sha512-8CVEU6f+PuDotu2B0mbLiatYlMWyWLsDK4syISrc0W6nZMU38MVtrciYt0snSkloilzOrhGqtqb7hj5CrYq5hg=="
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^3.0.0"
+ }
},
"tempfile": {
"version": "1.1.1",
@@ -2765,7 +2375,8 @@
"through": {
"version": "2.3.8",
"resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
- "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU="
+ "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=",
+ "dev": true
},
"through2": {
"version": "2.0.5",
@@ -2777,19 +2388,6 @@
"xtend": "~4.0.1"
}
},
- "tmp": {
- "version": "0.0.33",
- "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
- "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==",
- "requires": {
- "os-tmpdir": "~1.0.2"
- }
- },
- "toposort": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/toposort/-/toposort-2.0.2.tgz",
- "integrity": "sha1-riF2gXXRVZ1IvvNUILL0li8JwzA="
- },
"tough-cookie": {
"version": "2.5.0",
"resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz",
@@ -2819,9 +2417,9 @@
"dev": true
},
"ts-node": {
- "version": "8.0.2",
- "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.0.2.tgz",
- "integrity": "sha512-MosTrinKmaAcWgO8tqMjMJB22h+sp3Rd1i4fdoWY4mhBDekOwIAKI/bzmRi7IcbCmjquccYg2gcF6NBkLgr0Tw==",
+ "version": "8.0.3",
+ "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.0.3.tgz",
+ "integrity": "sha512-2qayBA4vdtVRuDo11DEFSsD/SFsBXQBRZZhbRGSIkmYmVkWjULn/GGMdG10KVqkaGndljfaTD8dKjWgcejO8YA==",
"dev": true,
"requires": {
"arg": "^4.1.0",
@@ -2834,12 +2432,13 @@
"tslib": {
"version": "1.9.3",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz",
- "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ=="
+ "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==",
+ "dev": true
},
"tslint": {
- "version": "5.13.0",
- "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.13.0.tgz",
- "integrity": "sha512-ECOOQRxXCYnUUePG5h/+Z1Zouobk3KFpIHA9aKBB/nnMxs97S1JJPDGt5J4cGm1y9U9VmVlfboOxA8n1kSNzGw==",
+ "version": "5.14.0",
+ "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.14.0.tgz",
+ "integrity": "sha512-IUla/ieHVnB8Le7LdQFRGlVJid2T/gaJe5VkjzRVSRR6pA2ODYrnfR1hmxi+5+au9l50jBwpbBL34txgv4NnTQ==",
"dev": true,
"requires": {
"babel-code-frame": "^6.22.0",
@@ -2854,7 +2453,7 @@
"resolve": "^1.3.2",
"semver": "^5.3.0",
"tslib": "^1.8.0",
- "tsutils": "^2.27.2"
+ "tsutils": "^2.29.0"
}
},
"tslint-eslint-rules": {
@@ -2875,9 +2474,9 @@
"dev": true
},
"tsutils": {
- "version": "3.8.0",
- "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.8.0.tgz",
- "integrity": "sha512-XQdPhgcoTbCD8baXC38PQ0vpTZ8T3YrE+vR66YIj/xvDt1//8iAhafpIT/4DmvzzC1QFapEImERu48Pa01dIUA==",
+ "version": "3.9.1",
+ "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.9.1.tgz",
+ "integrity": "sha512-hrxVtLtPqQr//p8/msPT1X1UYXUjizqSit5d9AQ5k38TcV38NyecL5xODNxa73cLe/5sdiJ+w1FqzDhRBA/anA==",
"dev": true,
"requires": {
"tslib": "^1.8.1"
@@ -2948,9 +2547,9 @@
"dev": true
},
"typescript": {
- "version": "3.3.3333",
- "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.3.3333.tgz",
- "integrity": "sha512-JjSKsAfuHBE/fB2oZ8NxtRTk5iGcg6hkYXMnZ3Wc+b2RSqejEqTaem11mHASMnFilHrax3sLK0GDzcJrekZYLw==",
+ "version": "3.3.4000",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.3.4000.tgz",
+ "integrity": "sha512-jjOcCZvpkl2+z7JFn0yBOoLQyLoIkNZAs/fYJkUG6VKy6zLPHJGfQJYFHzibB6GJaF/8QrcECtlQ5cpvRHSMEA==",
"dev": true
},
"uglify-js": {
@@ -3010,14 +2609,6 @@
"extsprintf": "^1.2.0"
}
},
- "wcwidth": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz",
- "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=",
- "requires": {
- "defaults": "^1.0.3"
- }
- },
"wordwrap": {
"version": "0.0.3",
"resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz",
diff --git a/package.json b/package.json
index 77f3be73..1eea0bd4 100644
--- a/package.json
+++ b/package.json
@@ -24,35 +24,25 @@
"dependencies": {
"@openstapps/gitlab-api": "0.5.1",
"@openstapps/logger": "0.0.5",
- "@slack/client": "4.9.0",
- "@types/del": "3.0.1",
+ "@slack/client": "4.12.0",
"@types/glob": "7.1.1",
- "@types/inquirer": "0.0.43",
- "@types/node": "10.12.27",
- "@types/pad": "1.0.2",
- "@types/request": "2.48.1",
- "@types/semver": "5.5.0",
+ "@types/mustache": "0.8.32",
+ "@types/node": "10.12.30",
"async-pool-native": "0.1.0",
"commander": "2.19.0",
- "del": "3.0.0",
"glob": "7.1.3",
- "inquirer": "6.2.2",
"moment": "2.24.0",
- "pad": "2.2.2",
- "request": "2.88.0",
- "semver": "5.6.0",
- "tangular": "2.0.1",
- "toposort": "2.0.2"
+ "mustache": "3.0.1"
},
"devDependencies": {
- "@openstapps/configuration": "0.6.0",
+ "@openstapps/configuration": "0.7.0",
"conventional-changelog-cli": "2.0.12",
"prepend-file-cli": "1.0.6",
"rimraf": "2.6.3",
- "ts-node": "8.0.2",
- "tslint": "5.13.0",
+ "ts-node": "8.0.3",
+ "tslint": "5.14.0",
"typedoc": "0.14.2",
- "typescript": "3.3.3333"
+ "typescript": "3.3.4000"
},
"main": "lib/common.js",
"typings": "lib/common.d.ts",
diff --git a/reports/2019-03-27.md b/reports/2019-03-27.md
new file mode 100644
index 00000000..d3d1aa5d
--- /dev/null
+++ b/reports/2019-03-27.md
@@ -0,0 +1,132 @@
+# Meeting 2019-03-27
+
+ ##
Rainer Killinger
+
+ ### open: 4, closed: 3
+
+ quota closed: 42%
+
+ | __title__ | __status__ | __project__ | __weeks__ |
+ | --- | --- | --- | --- |
+ | __[Insert sample data from the StappsCore into the backend](https://gitlab.com/openstapps/minimal-connector/issues/4)__
__Labels:__ meeting | | [openstapps/minimal-connector](https://gitlab.com/openstapps/minimal-connector) | 0 |
+| __[Simplify translation implementation](https://gitlab.com/openstapps/core/issues/43)__
__Labels:__ feature, meeting | | [openstapps/core](https://gitlab.com/openstapps/core) | 0 |
+| __[Update transport security in nginx configuration](https://gitlab.com/openstapps/proxy/issues/1)__
__Labels:__ meeting |
[
](https://gitlab.com/openstapps/proxy/merge_requests/3) | [openstapps/proxy](https://gitlab.com/openstapps/proxy) | 3 |
+| __[Add notion of study modules](https://gitlab.com/openstapps/core/issues/20)__
__Labels:__ feature, meeting |
[
](https://gitlab.com/openstapps/core/merge_requests/10) | [openstapps/core](https://gitlab.com/openstapps/core) | 11 |
+| __[Manual docker image publishing fails](https://gitlab.com/openstapps/backend/issues/28)__
__Labels:__ __bug__, meeting | | [openstapps/backend](https://gitlab.com/openstapps/backend) | 1 |
+| __[Fix folder permissions for elasticsearch volume](https://gitlab.com/openstapps/minimal-deployment/issues/5)__
__Labels:__ meeting | | [openstapps/minimal-deployment](https://gitlab.com/openstapps/minimal-deployment) | 0 |
+| __[Test docker image building](https://gitlab.com/openstapps/proxy/issues/7)__
__Labels:__ meeting, testing | | [openstapps/proxy](https://gitlab.com/openstapps/proxy) | 1 |
+ ##
Jovan Krunić
+
+ ### open: 33, closed: 1
+
+ quota closed: 2%
+
+ | __title__ | __status__ | __project__ | __weeks__ |
+ | --- | --- | --- | --- |
+ | __[Improve image docs and standardize usage](https://gitlab.com/openstapps/core/issues/44)__
__Labels:__ __bug__, meeting | | [openstapps/core](https://gitlab.com/openstapps/core) | 0 |
+| __[Include sample JSON files within the published package](https://gitlab.com/openstapps/core/issues/46)__
__Labels:__ feature, meeting | | [openstapps/core](https://gitlab.com/openstapps/core) | 0 |
+| __[Use review apps from gitlab to provide demo](https://gitlab.com/openstapps/app/issues/42)__
__Labels:__ feature, meeting | | [openstapps/app](https://gitlab.com/openstapps/app) | 0 |
+| __[Make sure appearance is compatible with (new) devices with cutouts](https://gitlab.com/openstapps/app/issues/40)__
__Labels:__ improvement, meeting | | [openstapps/app](https://gitlab.com/openstapps/app) | 3 |
+| __[Inconsistency in definitions of things without references](https://gitlab.com/openstapps/core/issues/41)__
__Labels:__ feature, meeting | | [openstapps/core](https://gitlab.com/openstapps/core) | 3 |
+| __[Show dishes for multiple days](https://gitlab.com/openstapps/app/issues/39)__
__Labels:__ feature, meeting | | [openstapps/app](https://gitlab.com/openstapps/app) | 3 |
+| __[Use fake backend - backendless development](https://gitlab.com/openstapps/app/issues/37)__
__Labels:__ improvement, meeting | | [openstapps/app](https://gitlab.com/openstapps/app) | 3 |
+| __[add a main page for the group (whole project)](https://gitlab.com/openstapps/openstapps.gitlab.io/issues/1)__
__Labels:__ documentation, meeting, organization | | [openstapps/openstapps.gitlab.io](https://gitlab.com/openstapps/openstapps.gitlab.io) | 6 |
+| __[upgrade to Ionic 4.0 (stable)](https://gitlab.com/openstapps/app/issues/35)__
__Labels:__ improvement, meeting | | [openstapps/app](https://gitlab.com/openstapps/app) | 6 |
+| __[Develop a prototype for authentication](https://gitlab.com/openstapps/backend/issues/8)__
__Labels:__ feature, meeting | | [openstapps/backend](https://gitlab.com/openstapps/backend) | 8 |
+| __[Add examples for routes](https://gitlab.com/openstapps/core/issues/17)__
__Labels:__ feature, meeting | | [openstapps/core](https://gitlab.com/openstapps/core) | 13 |
+| __[(TODO: complete) school module: evaluate and create a prototype of a generic app](https://gitlab.com/openstapps/app/issues/29)__
__Labels:__ meeting | | [openstapps/app](https://gitlab.com/openstapps/app) | 13 |
+| __[List of most recent searches](https://gitlab.com/openstapps/app/issues/28)__
__Labels:__ meeting | | [openstapps/app](https://gitlab.com/openstapps/app) | 13 |
+| __[Sorting by categories should be default for certain views](https://gitlab.com/openstapps/app/issues/25)__
__Labels:__ meeting | | [openstapps/app](https://gitlab.com/openstapps/app) | 13 |
+| __[Evaluate solutions for adding monitoring (automatic error reports)](https://gitlab.com/openstapps/app/issues/24)__
__Labels:__ meeting | | [openstapps/app](https://gitlab.com/openstapps/app) | 13 |
+| __[Todos module - predefined and user-defined tasks](https://gitlab.com/openstapps/app/issues/23)__
__Labels:__ meeting | | [openstapps/app](https://gitlab.com/openstapps/app) | 13 |
+| __[Add deep-linking support](https://gitlab.com/openstapps/app/issues/22)__
__Labels:__ meeting | | [openstapps/app](https://gitlab.com/openstapps/app) | 13 |
+| __[Show menus of (student) canteens for multiple days](https://gitlab.com/openstapps/app/issues/19)__
__Labels:__ meeting | | [openstapps/app](https://gitlab.com/openstapps/app) | 13 |
+| __[Limit loaded places by the current zoom level](https://gitlab.com/openstapps/app/issues/18)__
__Labels:__ meeting | | [openstapps/app](https://gitlab.com/openstapps/app) | 13 |
+| __[Appointment system module - queue number and estimated waiting time](https://gitlab.com/openstapps/app/issues/17)__
__Labels:__ meeting | | [openstapps/app](https://gitlab.com/openstapps/app) | 13 |
+| __["About" module - app information and policies](https://gitlab.com/openstapps/app/issues/16)__
__Labels:__ meeting | | [openstapps/app](https://gitlab.com/openstapps/app) | 13 |
+| __[Catalog tree module - catalog of university events](https://gitlab.com/openstapps/app/issues/15)__
__Labels:__ meeting | | [openstapps/app](https://gitlab.com/openstapps/app) | 13 |
+| __[Styles and images](https://gitlab.com/openstapps/app/issues/14)__
__Labels:__ meeting | | [openstapps/app](https://gitlab.com/openstapps/app) | 13 |
+| __[Home module - home page with widgets](https://gitlab.com/openstapps/app/issues/13)__
__Labels:__ meeting | | [openstapps/app](https://gitlab.com/openstapps/app) | 13 |
+| __[Map module: show places and position](https://gitlab.com/openstapps/app/issues/12)__
__Labels:__ meeting | | [openstapps/app](https://gitlab.com/openstapps/app) | 13 |
+| __[Export persons into the phone's contact list](https://gitlab.com/openstapps/app/issues/11)__
__Labels:__ meeting | | [openstapps/app](https://gitlab.com/openstapps/app) | 13 |
+| __[Favorites module - save frequently used data as favorites](https://gitlab.com/openstapps/app/issues/10)__
__Labels:__ meeting | | [openstapps/app](https://gitlab.com/openstapps/app) | 13 |
+| __[Events (timetable) module - schedule and calendar](https://gitlab.com/openstapps/app/issues/8)__
__Labels:__ meeting | | [openstapps/app](https://gitlab.com/openstapps/app) | 13 |
+| __[First start module: initial information and settings](https://gitlab.com/openstapps/app/issues/6)__
__Labels:__ meeting | | [openstapps/app](https://gitlab.com/openstapps/app) | 14 |
+| __[Use skeleton screens](https://gitlab.com/openstapps/app/issues/4)__
__Labels:__ meeting | | [openstapps/app](https://gitlab.com/openstapps/app) | 14 |
+| __[Data synchronization and consistency](https://gitlab.com/openstapps/app/issues/2)__
__Labels:__ meeting | | [openstapps/app](https://gitlab.com/openstapps/app) | 14 |
+| __[Data module - data handling and presentation](https://gitlab.com/openstapps/app/issues/1)__
__Labels:__ meeting |
[
](https://gitlab.com/openstapps/app/merge_requests/2) | [openstapps/app](https://gitlab.com/openstapps/app) | 14 |
+| __[Add an npm initializer package](https://gitlab.com/openstapps/projectmanagement/issues/2)__
__Labels:__ meeting | | [openstapps/projectmanagement](https://gitlab.com/openstapps/projectmanagement) | 15 |
+| __[Backend should "wait" for the database container to be ready](https://gitlab.com/openstapps/minimal-deployment/issues/1)__
__Labels:__ meeting |
| [openstapps/minimal-deployment](https://gitlab.com/openstapps/minimal-deployment) | 6 |
+ ##
Karl-Philipp Wulfert
+
+ ### open: 9, closed: 0
+
+ quota closed: 0%
+
+ | __title__ | __status__ | __project__ | __weeks__ |
+ | --- | --- | --- | --- |
+ | __[Add systemd service file and error handler](https://gitlab.com/openstapps/proxy/issues/5)__
__Labels:__ feature, meeting |
[
](https://gitlab.com/openstapps/proxy/merge_requests/2) | [openstapps/proxy](https://gitlab.com/openstapps/proxy) | 3 |
+| __[Add issue templates](https://gitlab.com/openstapps/minimal-deployment/issues/3)__
__Labels:__ meeting | | [openstapps/minimal-deployment](https://gitlab.com/openstapps/minimal-deployment) | 3 |
+| __[Remove links to old GitLab instance](https://gitlab.com/openstapps/proxy/issues/3)__
__Labels:__ meeting | | [openstapps/proxy](https://gitlab.com/openstapps/proxy) | 3 |
+| __[Throws error in `production` environment: "... doesn't set an transport agent ..."](https://gitlab.com/openstapps/logger/issues/4)__
__Labels:__ meeting | | [openstapps/logger](https://gitlab.com/openstapps/logger) | 7 |
+| __[Support adding links to external services of a university/school](https://gitlab.com/openstapps/app/issues/21)__
__Labels:__ meeting | | [openstapps/app](https://gitlab.com/openstapps/app) | 13 |
+| __[Include place when exporting events into the native calendar](https://gitlab.com/openstapps/app/issues/20)__
__Labels:__ meeting | | [openstapps/app](https://gitlab.com/openstapps/app) | 13 |
+| __[Evaluate use of clickable alphabet for lists](https://gitlab.com/openstapps/app/issues/7)__
__Labels:__ meeting | | [openstapps/app](https://gitlab.com/openstapps/app) | 13 |
+| __[`circular-json` is deprecated](https://gitlab.com/openstapps/logger/issues/2)__
__Labels:__ meeting |
[
](https://gitlab.com/openstapps/logger/merge_requests/2) | [openstapps/logger](https://gitlab.com/openstapps/logger) | 15 |
+| __[Test coverage levels are too low](https://gitlab.com/openstapps/logger/issues/1)__
__Labels:__ meeting | | [openstapps/logger](https://gitlab.com/openstapps/logger) | 15 |
+ ##
Michel Jonathan Schmitz
+
+ ### open: 7, closed: 0
+
+ quota closed: 0%
+
+ | __title__ | __status__ | __project__ | __weeks__ |
+ | --- | --- | --- | --- |
+ | __[Provide context based search](https://gitlab.com/openstapps/core/issues/45)__
__Labels:__ feature, meeting |
[
](https://gitlab.com/openstapps/core/merge_requests/34) | [openstapps/core](https://gitlab.com/openstapps/core) | 0 |
+| __[minimal connector and app should be part of the minimal deployment](https://gitlab.com/openstapps/minimal-deployment/issues/2)__
__Labels:__ meeting |
[
](https://gitlab.com/openstapps/minimal-deployment/merge_requests/2) | [openstapps/minimal-deployment](https://gitlab.com/openstapps/minimal-deployment) | 3 |
+| __[Easy access for connector developers](https://gitlab.com/openstapps/minimal-connector/issues/3)__
__Labels:__ meeting |
[
](https://gitlab.com/openstapps/minimal-connector/merge_requests/3) | [openstapps/minimal-connector](https://gitlab.com/openstapps/minimal-connector) | 5 |
+| __[Provide context based search](https://gitlab.com/openstapps/backend/issues/11)__
__Labels:__ feature, meeting |
[
](https://gitlab.com/openstapps/backend/merge_requests/12) | [openstapps/backend](https://gitlab.com/openstapps/backend) | 8 |
+| __[Do not exclude externals from reflection](https://gitlab.com/openstapps/core-tools/issues/7)__
__Labels:__ meeting | | [openstapps/core-tools](https://gitlab.com/openstapps/core-tools) | 9 |
+| __[UML generation for data models](https://gitlab.com/openstapps/core-tools/issues/3)__
__Labels:__ Doing, meeting |
[
](https://gitlab.com/openstapps/core-tools/merge_requests/2) | [openstapps/core-tools](https://gitlab.com/openstapps/core-tools) | 10 |
+| __[Unclear documentation](https://gitlab.com/openstapps/projectmanagement/issues/6)__
__Labels:__ meeting | | [openstapps/projectmanagement](https://gitlab.com/openstapps/projectmanagement) | 15 |
+ ##
Sebastian Lange
+
+ ### open: 5, closed: 2
+
+ quota closed: 28%
+
+ | __title__ | __status__ | __project__ | __weeks__ |
+ | --- | --- | --- | --- |
+ | __[Follow-up from "Resolve "Config module - Provider for app configuration""](https://gitlab.com/openstapps/app/issues/41)__
__Labels:__ meeting | | [openstapps/app](https://gitlab.com/openstapps/app) | 0 |
+| __[Config module - Provider for app configuration](https://gitlab.com/openstapps/app/issues/34)__
__Labels:__ feature, meeting |
[
](https://gitlab.com/openstapps/app/merge_requests/5) | [openstapps/app](https://gitlab.com/openstapps/app) | 7 |
+| __[Initialize settings with from backend served app configuration](https://gitlab.com/openstapps/app/issues/30)__
__Labels:__ feature, meeting |
[
](https://gitlab.com/openstapps/app/merge_requests/7) | [openstapps/app](https://gitlab.com/openstapps/app) | 13 |
+| __[Use i18n](https://gitlab.com/openstapps/app/issues/5)__
__Labels:__ meeting | | [openstapps/app](https://gitlab.com/openstapps/app) | 14 |
+| __[Menu module - main and context menu](https://gitlab.com/openstapps/app/issues/3)__
__Labels:__ meeting |
[
](https://gitlab.com/openstapps/app/merge_requests/9) | [openstapps/app](https://gitlab.com/openstapps/app) | 14 |
+| __[Update core dependency to v0.12.0](https://gitlab.com/openstapps/backend/issues/30)__
__Labels:__ feature, meeting | | [openstapps/backend](https://gitlab.com/openstapps/backend) | 0 |
+| __[Remodeling of Buckets in SCFacets](https://gitlab.com/openstapps/core/issues/42)__
__Labels:__ feature, meeting | | [openstapps/core](https://gitlab.com/openstapps/core) | 1 |
+ ##
Wieland Schöbl
+
+ ### open: 17, closed: 1
+
+ quota closed: 5%
+
+ | __title__ | __status__ | __project__ | __weeks__ |
+ | --- | --- | --- | --- |
+ | __[SCIndexResponse: additionalProperty "uid" exists in instance when not allowed](https://gitlab.com/openstapps/backend/issues/32)__
__Labels:__ __bug__, meeting | | [openstapps/backend](https://gitlab.com/openstapps/backend) | 0 |
+| __[There are still occcurences of `isProductiveEnvironment`](https://gitlab.com/openstapps/backend/issues/29)__
__Labels:__ __bug__, meeting |
[
](https://gitlab.com/openstapps/backend/merge_requests/11) | [openstapps/backend](https://gitlab.com/openstapps/backend) | 0 |
+| __[Refactoring of search (query building)](https://gitlab.com/openstapps/backend/issues/13)__
__Labels:__ __bug__, meeting | | [openstapps/backend](https://gitlab.com/openstapps/backend) | 8 |
+| __[Backend should throw an Error if someone tries to close an empty bulk process](https://gitlab.com/openstapps/backend/issues/7)__
__Labels:__ __bug__, meeting | | [openstapps/backend](https://gitlab.com/openstapps/backend) | 8 |
+| __[Implement unit tests](https://gitlab.com/openstapps/backend/issues/31)__
__Labels:__ feature, meeting | | [openstapps/backend](https://gitlab.com/openstapps/backend) | 0 |
+| __[Add better documentation](https://gitlab.com/openstapps/backend/issues/26)__
__Labels:__ feature, meeting |
[
](https://gitlab.com/openstapps/backend/merge_requests/7) | [openstapps/backend](https://gitlab.com/openstapps/backend) | 2 |
+| __[Automatically check database version](https://gitlab.com/openstapps/backend/issues/24)__
__Labels:__ feature, meeting |
[
](https://gitlab.com/openstapps/backend/merge_requests/6) | [openstapps/backend](https://gitlab.com/openstapps/backend) | 3 |
+| __[Publish documentation to gitlab pages](https://gitlab.com/openstapps/backend/issues/22)__
__Labels:__ feature, meeting | | [openstapps/backend](https://gitlab.com/openstapps/backend) | 3 |
+| __[backend version should be provided by the requested path instead of the `X-StApps-Version` header](https://gitlab.com/openstapps/proxy/issues/2)__
__Labels:__ meeting | | [openstapps/proxy](https://gitlab.com/openstapps/proxy) | 3 |
+| __[Dynamic Data should be accesible by the search route as well](https://gitlab.com/openstapps/backend/issues/17)__
__Labels:__ feature, meeting | | [openstapps/backend](https://gitlab.com/openstapps/backend) | 8 |
+| __[Link documentation for routes in the README.ms](https://gitlab.com/openstapps/backend/issues/10)__
__Labels:__ feature, meeting | | [openstapps/backend](https://gitlab.com/openstapps/backend) | 8 |
+| __[Develop a monitoring solution for backend load](https://gitlab.com/openstapps/backend/issues/9)__
__Labels:__ feature, meeting | | [openstapps/backend](https://gitlab.com/openstapps/backend) | 8 |
+| __[Aggregations for the first letters of search results](https://gitlab.com/openstapps/backend/issues/6)__
__Labels:__ feature, meeting | | [openstapps/backend](https://gitlab.com/openstapps/backend) | 8 |
+| __[Boosting of academic terms should be done dynamically](https://gitlab.com/openstapps/backend/issues/4)__
__Labels:__ feature, meeting | | [openstapps/backend](https://gitlab.com/openstapps/backend) | 8 |
+| __[Develop a new plugin structure that registers plugins via HTTP](https://gitlab.com/openstapps/backend/issues/2)__
__Labels:__ feature, meeting | | [openstapps/backend](https://gitlab.com/openstapps/backend) | 9 |
+| __[Elasticsearch Mapping files should be generated from the StAppsCore schema](https://gitlab.com/openstapps/core-tools/issues/6)__
__Labels:__ meeting |
[
](https://gitlab.com/openstapps/core-tools/merge_requests/8) | [openstapps/core-tools](https://gitlab.com/openstapps/core-tools) | 9 |
+| __[Add model for routes that register backend plugins](https://gitlab.com/openstapps/core/issues/15)__
__Labels:__ feature, meeting | | [openstapps/core](https://gitlab.com/openstapps/core) | 14 |
+| __[Closing a bulk fails for SCThingTypes that contain a space character](https://gitlab.com/openstapps/backend/issues/25)__
__Labels:__ __bug__, meeting | | [openstapps/backend](https://gitlab.com/openstapps/backend) | 3 |
diff --git a/src/common.ts b/src/common.ts
index a84fa157..5554ffe1 100644
--- a/src/common.ts
+++ b/src/common.ts
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2018 StApps
+ * Copyright (C) 2018, 2019 StApps
* This program is free software: you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the Free
* Software Foundation, version 3.
@@ -20,9 +20,11 @@ import {readFile, unlink, writeFile} from 'fs';
import * as glob from 'glob';
import {promisify} from 'util';
-/**
- * Instantiated logger
- */
+export const readFilePromisified = promisify(readFile);
+export const globPromisified = promisify(glob);
+export const writeFilePromisified = promisify(writeFile);
+export const unlinkPromisified = promisify(unlink);
+
export const logger = new Logger();
/**
@@ -65,20 +67,3 @@ export async function getSubGroups(api: Api, groups: number[]): Promise
export function flatten2dArray(arr: T[][]): T[] {
return ([] as T[]).concat(...arr);
}
-
-/**
- * Promisified version of readFile
- */
-export const readFilePromisified = promisify(readFile);
-/**
- * Promisified version of glob
- */
-export const globPromisified = promisify(glob);
-/**
- * Promisified version of writeFile
- */
-export const writeFilePromisified = promisify(writeFile);
-/**
- * Promisified version of unlink
- */
-export const unlinkPromisified = promisify(unlink);
diff --git a/src/tasks/report.ts b/src/tasks/report.ts
index ae37dc6b..c9852838 100644
--- a/src/tasks/report.ts
+++ b/src/tasks/report.ts
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2018 StApps
+ * Copyright (C) 2018, 2019 StApps
* This program is free software: you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the Free
* Software Foundation, version 3.
@@ -15,15 +15,61 @@
import {Api} from '@openstapps/gitlab-api';
import {Issue, IssueState, MembershipScope, MergeRequestState, Project, User} from '@openstapps/gitlab-api/lib/types';
import {asyncPool} from 'async-pool-native/dist/async-pool';
-import {readFileSync, writeFile} from 'fs';
import * as moment from 'moment';
-import {join} from 'path';
+import {render} from 'mustache';
+import {join, resolve} from 'path';
import {cwd} from 'process';
-import {promisify} from 'util';
-import {flatten2dArray, getProjects, getSubGroups, logger} from '../common';
+import {flatten2dArray, getProjects, logger, readFilePromisified, writeFilePromisified} from '../common';
import {BOLD_LABELS, GROUPS, LABEL_WEIGHTS} from '../configuration';
-const asyncWriteFile = promisify(writeFile);
+/**
+ * A structure for template compilation
+ */
+export interface StructureForTemplate {
+ issuesByAssignee: AssigneeWithIssues[];
+ meetingDay: string;
+}
+
+/**
+ * A map
+ */
+export interface IssuesGroupedByAssigneeId {
+ [assigneeId: number]: AssigneeWithIssues;
+}
+
+/**
+ * An assignee with assigned issues
+ */
+export interface AssigneeWithIssues {
+ assignee: User;
+ issueCounts: {
+ closed: number;
+ opened: number;
+ };
+ issues: IssueWithMeta[];
+ quota: number;
+}
+
+/**
+ * Issue with meta information
+ */
+export interface IssueWithMeta extends Issue {
+ $branchExists: boolean;
+ $labels: string;
+ $mergeRequestUrl: string;
+ $project: string;
+ $weeksOpen: number;
+}
+
+/**
+ * Merge request data
+ */
+export interface MergeRequestsForProjects {
+ [projectId: string]: Array<{
+ issue_iid: number;
+ web_url: string;
+ }>;
+}
/**
* Check if issue state is opened or closed
@@ -41,8 +87,7 @@ export function issueStateIsOpenedOrClosed(state: IssueState): state is IssueSta
* @param projectId Project ID to get data about merge requests for
* @param issueIid Issue IID in certain project (relative ID, and not issue's GitLab API ID)
*/
-
-export function getMergeRequestUrls(projectMergeRequests: MergeRequestData,
+export function getMergeRequestUrls(projectMergeRequests: MergeRequestsForProjects,
projectId: number,
issueIid: number): string[] {
if (typeof projectMergeRequests[projectId] === 'undefined' || projectMergeRequests[projectId].length === 0) {
@@ -56,72 +101,15 @@ export function getMergeRequestUrls(projectMergeRequests: MergeRequestData,
});
}
-/**
- * An assignee with his/her issues
- */
-export interface AssigneeWithIssues {
- assignee: User;
- issueCounts: {
- closed: number;
- opened: number;
- };
- issues: Issue[];
- quota: number;
-}
-
-export interface MergeRequestData {
- [k: string]: Array<{
- issue_iid: number;
- web_url: string;
- }>;
-}
-
-/**
- * Tangular compiled template
- */
-export type TangularCompiled = (model?: any, $?: any) => string;
-
-/**
- * Convert an issue to a markdown table row
- *
- * @param issue Issue to convert
- * @param projectBranches Map of branches for project IDs
- * @param projectMergeRequests Map of merge requests for project IDs
- * @param template Template to render this issue with
- */
-function issueToString(issue: any,
- projectBranches: any,
- projectMergeRequests: any,
- template: any): string {
- issue._labels = issue.labels.map((label: string) => {
- // print specific labels bold
- if (BOLD_LABELS.indexOf(label) >= 0) {
- label = '__' + label + '__';
- }
-
- return label;
- }).join(', ');
-
- /* tslint:disable: max-line-length */
- return template({
- branchExists: typeof projectBranches[issue.project_id] !== 'undefined' && projectBranches[issue.project_id].indexOf(issue.iid) >= 0,
- issue: issue,
- // take the first URL from the merge request urls array (usually if there are URLs, then there is that only one)
- mergeRequestUrl: getMergeRequestUrls(projectMergeRequests, issue.project_id, issue.iid)[0],
- project: issue.web_url.replace('https://gitlab.com/', '').split('/issues/')[0],
- weeksOpen: moment().diff(moment(issue.created_at), 'weeks'),
- });
- /* tslint:enable */
-}
-
/**
* Get issues from all groups with a specific milestone
*
* @param api GitLab API to make requests with
* @param label Label to filter by
+ * @param groups List of groups to get issues for
*/
-export async function getIssues(api: Api, label: string): Promise {
- const issueResults = await asyncPool(2, GROUPS, (groupId) => {
+export async function getIssues(api: Api, label: string, groups: number[]): Promise {
+ const issueResults = await asyncPool(2, groups, (groupId) => {
return api.getIssues({
groupId: groupId,
});
@@ -142,7 +130,7 @@ export async function getIssues(api: Api, label: string): Promise {
* @param api GitLab API To make requests with
* @param projects List of projects
*/
-export async function getIdsOfIssuesWithBranchesForProjects(
+export async function getIssueBranches(
api: Api,
projects: Project[]): Promise<{ [k: string]: number[] }> {
const projectBranches: { [k: string]: number[] } = {};
@@ -164,14 +152,28 @@ export async function getIdsOfIssuesWithBranchesForProjects(
}
/**
- * Group a list of issues by their assignees
+ * Get issues grouped by assignees
*
- * @param issues List of issues to group
+ * @param api GitLab API to make requests with
+ * @param label Label to generate report for
*/
-export function groupIssuesByAssignee(issues: Issue[]): { [k: number]: AssigneeWithIssues } {
- const issuesByAssignee: {
- [k: number]: AssigneeWithIssues;
- } = {};
+export async function getIssuesGroupedByAssignees(api: Api, label: string): Promise {
+ const issuesByAssignee: IssuesGroupedByAssigneeId = {};
+
+ const groups = flatten2dArray(await asyncPool(2, GROUPS, async (groupId) => {
+ return (await api.getSubGroupsForGroup(groupId)).map((group) => {
+ return group.id;
+ });
+ }));
+ groups.push.apply(groups, GROUPS);
+
+ const [issues, projects] = await Promise.all([
+ getIssues(api, label, groups),
+ getProjects(api, groups),
+ ]);
+
+ const issueBranches = await getIssueBranches(api, projects);
+ const mergeRequests = await getMergeRequests(api, projects);
issues.forEach((issue) => {
if (issue.assignee === null) {
@@ -195,12 +197,33 @@ export function groupIssuesByAssignee(issues: Issue[]): { [k: number]: AssigneeW
issue.state = IssueState.OPENED;
}
+ const issueWithMeta: IssueWithMeta = {
+ ...issue,
+ ...{
+ $branchExists: typeof issueBranches[issue.project_id] !== 'undefined'
+ && issueBranches[issue.project_id].indexOf(issue.iid) >= 0,
+ $issue: issue,
+ $labels: issue.labels.map((issueLabel: string) => {
+ // print specific labels bold
+ if (BOLD_LABELS.indexOf(issueLabel) >= 0) {
+ issueLabel = '__' + issueLabel + '__';
+ }
+
+ return issueLabel;
+ }).join(', '),
+ $mergeRequestUrl: getMergeRequestUrls(mergeRequests, issue.project_id, issue.iid)[0],
+ $project: issue.web_url.replace('https://gitlab.com/', '').split('/issues/')[0],
+ $weeksOpen: moment().diff(moment(issue.created_at), 'weeks'),
+ },
+ };
+
if (issueStateIsOpenedOrClosed(issue.state)) {
issuesByAssignee[issue.assignee.id].issueCounts[issue.state]++;
- issuesByAssignee[issue.assignee.id].issues.push(issue);
+ issuesByAssignee[issue.assignee.id].issues.push(issueWithMeta);
}
});
+ // calculate quota
Object.keys(issuesByAssignee).forEach((_assigneeId) => {
const assigneeId = parseInt(_assigneeId, 10);
@@ -211,25 +234,37 @@ export function groupIssuesByAssignee(issues: Issue[]): { [k: number]: AssigneeW
);
});
- return issuesByAssignee;
-}
+ // sort issues by weight of labels and status
+ Object.keys(issuesByAssignee).forEach((_assigneeId) => {
+ const assigneeId = parseInt(_assigneeId, 10);
-/**
- * Compile templates
- */
-export function compileTemplates(): { [k: string]: TangularCompiled } {
- const tangular: { compile: (template: string) => TangularCompiled } = require('tangular');
+ issuesByAssignee[assigneeId].issues.sort((a, b) => {
+ let weightA = 0;
+ let weightB = 0;
- const templates = {
- assigneeFooter: tangular.compile(readFileSync('templates/md/assigneeFooter.md').toString()),
- assigneeHeader: tangular.compile(readFileSync('templates/md/assigneeHeader.md').toString()),
- header: tangular.compile(readFileSync('templates/md/header.md').toString()),
- issue: tangular.compile(readFileSync('templates/md/issue.md').toString()),
- };
+ Object.keys(LABEL_WEIGHTS).forEach((issueLabel) => {
+ if (a.labels.indexOf(issueLabel) >= 0) {
+ weightA += LABEL_WEIGHTS[issueLabel];
+ }
- logger.log('Compiled templates.');
+ if (b.labels.indexOf(issueLabel) >= 0) {
+ weightB += LABEL_WEIGHTS[issueLabel];
+ }
+ });
- return templates;
+ if (a.state === IssueState.CLOSED) {
+ weightA -= 10;
+ }
+
+ if (b.state === IssueState.CLOSED) {
+ weightB -= 10;
+ }
+
+ return weightB - weightA;
+ });
+ });
+
+ return Object.values(issuesByAssignee);
}
/**
@@ -261,9 +296,9 @@ export function getNextMeetingDay() {
* @param api GitLab API to make requests with
* @param projects List of projects
*/
-export async function getMergeRequestsForProjects(api: Api,
- projects: Project[]): Promise {
- const projectMergeRequests: MergeRequestData = {};
+export async function getMergeRequests(api: Api,
+ projects: Project[]): Promise {
+ const projectMergeRequests: MergeRequestsForProjects = {};
// iterate over projects
await asyncPool(2, projects, async (project) => {
@@ -292,72 +327,41 @@ export async function getMergeRequestsForProjects(api: Api,
return projectMergeRequests;
}
-export async function generateReport(api: Api, label: string): Promise {
- const templates = compileTemplates();
+/**
+ * Generate a report
+ *
+ * @param api GitLab API to make requests with
+ * @param label Label to generate report for
+ * @param template Template to generate report with
+ */
+export async function generateReport(api: Api, label: string, template: string): Promise {
+ const issuesGroupedByAssignee = await getIssuesGroupedByAssignees(api, label);
- const groupIds: number[] = [];
- groupIds.push.apply(groupIds, GROUPS);
- groupIds.push.apply(groupIds, (await getSubGroups(api, GROUPS)).map((group) => group.id));
+ const structureForTemplate: StructureForTemplate = {
+ issuesByAssignee: issuesGroupedByAssignee,
+ meetingDay: getNextMeetingDay(),
+ };
- logger.log(`Getting data for ${groupIds.length} group(s).`);
-
- const projects = await getProjects(api, groupIds);
- const issues = await getIssues(api, label);
-
- const issuesGroupedByAssignee = groupIssuesByAssignee(issues);
-
- const issueBranches = await getIdsOfIssuesWithBranchesForProjects(api, projects);
- const mergeRequests = await getMergeRequestsForProjects(api, projects);
-
- let markdown = templates.header();
-
- Object.keys(issuesGroupedByAssignee).forEach((_assigneeId) => {
- const assigneeId = parseInt(_assigneeId, 10);
-
- markdown += templates.assigneeHeader(issuesGroupedByAssignee[assigneeId]);
-
- issuesGroupedByAssignee[assigneeId].issues.sort((a, b) => {
- let weightA = 0;
- let weightB = 0;
-
- Object.keys(LABEL_WEIGHTS).forEach((issueLabel) => {
- if (a.labels.indexOf(issueLabel) >= 0) {
- weightA += LABEL_WEIGHTS[issueLabel];
- }
-
- if (b.labels.indexOf(issueLabel) >= 0) {
- weightB += LABEL_WEIGHTS[issueLabel];
- }
- });
-
- if (a.state === IssueState.CLOSED) {
- weightA -= 10;
- }
-
- if (b.state === IssueState.CLOSED) {
- weightB -= 10;
- }
-
- return weightB - weightA;
- }).forEach((issue) => {
- markdown += issueToString(
- issue,
- issueBranches,
- mergeRequests,
- templates.issue,
- );
- });
-
- markdown += templates.assigneeFooter(issuesGroupedByAssignee[assigneeId]);
- });
-
- return markdown;
+ return render(
+ template,
+ structureForTemplate,
+ );
}
+/**
+ * Generate a markdown report
+ *
+ * @param api GitLab API to make requests with
+ * @param label Label to generate report for
+ */
export async function report(api: Api, label: string) {
const meetingDay = getNextMeetingDay();
- const markdown = generateReport(api, label);
+ const markdown = await generateReport(
+ api,
+ label,
+ (await readFilePromisified(resolve(__dirname, '..', '..', 'templates', 'report.md.mustache'))).toString(),
+ );
let filename = join(cwd(), 'reports', meetingDay + '.md');
@@ -365,7 +369,7 @@ export async function report(api: Api, label: string) {
filename = join(cwd(), 'reports', `${label}.md`);
}
- await asyncWriteFile(filename, markdown);
+ await writeFilePromisified(filename, markdown);
logger.ok(`Wrote file '${filename}'.`);
}
diff --git a/templates/md/assigneeFooter.md b/templates/md/assigneeFooter.md
deleted file mode 100644
index 139597f9..00000000
--- a/templates/md/assigneeFooter.md
+++ /dev/null
@@ -1,2 +0,0 @@
-
-
diff --git a/templates/md/assigneeHeader.md b/templates/md/assigneeHeader.md
deleted file mode 100644
index d8a12002..00000000
--- a/templates/md/assigneeHeader.md
+++ /dev/null
@@ -1,8 +0,0 @@
-##
{{ assignee.name }}
-
-### open: {{ issueCounts.opened }}, closed: {{ issueCounts.closed }}
-
-quota closed: {{ quota }}%
-
-| __title__ | __status__ | __project__ | __weeks__ |
-| --- | --- | --- | --- |
diff --git a/templates/md/header.md b/templates/md/header.md
deleted file mode 100644
index 4217d1a3..00000000
--- a/templates/md/header.md
+++ /dev/null
@@ -1 +0,0 @@
-# Meeting {{ meetingDay }}
diff --git a/templates/md/issue.md b/templates/md/issue.md
deleted file mode 100644
index 97a7e246..00000000
--- a/templates/md/issue.md
+++ /dev/null
@@ -1 +0,0 @@
-| __[{{ if issue.state !== 'closed' }} {{ issue.title }} {{ else }} ~~{{ issue.title }}~~ {{ fi }}]({{ issue.web_url }})__
__Labels:__ {{ issue._labels }} | {{ if branchExists }}
{{ fi}} {{ if mergeRequestUrl !== undefined }}
{{ fi }} | [{{ project }}](https://gitlab.com/{{ project }}) | {{ weeksOpen }} |
diff --git a/templates/report.md.mustache b/templates/report.md.mustache
new file mode 100644
index 00000000..94667b2d
--- /dev/null
+++ b/templates/report.md.mustache
@@ -0,0 +1,14 @@
+# Meeting {{meetingDay}}
+
+{{#issuesByAssignee}}
+ ## {{#assignee.avatar_url}}
{{/assignee.avatar_url}}{{assignee.name}}
+
+ ### open: {{issueCounts.opened}}, closed: {{issueCounts.closed}}
+
+ quota closed: {{quota}}%
+
+ | __title__ | __status__ | __project__ | __weeks__ |
+ | --- | --- | --- | --- |
+ {{#issues}}| __[{{title}}]({{&web_url}})__
__Labels:__ {{$labels}} | {{#$branchExists}}
{{/$branchExists}}{{#$mergeRequestUrl}}[
]({{&$mergeRequestUrl}}){{/$mergeRequestUrl}} | [{{$project}}](https://gitlab.com/{{&$project}}) | {{$weeksOpen}} |
+ {{/issues}}
+{{/issuesByAssignee}}