{"_id":"spire","_rev":"73-c52b45d931271d252a198490f01479c4","name":"spire","description":"Extensible CLI toolkit managment tool","dist-tags":{"latest":"5.0.8","canary":"1.7.2-next.1","next":"1.8.4-next.48"},"versions":{"0.6.1":{"name":"spire","version":"0.6.1","description":"Clean & thorough spa buildchain","homepage":"https://github.com/epiloque/spire","author":{"name":"Mark Milstein","email":"mark@epiloque.com","url":"https://github.com/epiloque"},"license":"Apache-2.0","keywords":["boilerplate"],"maintainers":[{"name":"Mark Milstein","email":"robots+npm@epiloque.com","url":"https://github.com/epiloque"}],"contributors":[{"name":"Mark Milstein","email":"robots+npm@epiloque.com","url":"https://github.com/epiloque"}],"bugs":{"url":"https://github.com/epiloque/spire/issues"},"repository":{"type":"git","url":"git+ssh://git@github.com/epiloque/spire.git"},"browsers":false,"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"devDependencies":{"babel-core":"^6.3.26","babel-plugin-transform-runtime":"^6.3.13","babel-preset-es2015":"^6.3.13","babelify":"^7.2.0","breakpoint-sass":"^2.6.1","browser-sync":"^2.11.0","browserify":"^12.0.1","deasync":"^0.1.4","del":"^2.2.0","eslint":"^1.10.3","fontfaceobserver":"^1.6.3","gulp":"^3.9.0","gulp-autoprefixer":"^3.1.0","gulp-concat":"^2.6.0","gulp-data":"^1.2.1","gulp-file":"^0.2.0","gulp-filter":"^3.0.1","gulp-if":"^2.0.0","gulp-imagemin":"^2.4.0","gulp-load-plugins":"^1.1.0","gulp-minify-css":"^1.2.3","gulp-mustache":"^2.2.0","gulp-plumber":"^1.0.1","gulp-rename":"^1.2.2","gulp-rev-all":"^0.8.22","gulp-sass":"^2.1.1","gulp-sort":"^1.1.1","gulp-sourcemaps":"^1.6.0","gulp-tap":"^0.1.3","gulp-task-loader":"^1.3.1","gulp-uglify":"^1.5.1","gulp-zopfli":"^1.0.0","imagemin-pngquant":"^4.2.0","modernizr":"^3.2.0","modularscale-sass":"^2.1.1","opentype.js":"^0.6.0","remark":"^3.1.3","remark-github":"^2.0.1","remark-toc":"^2.0.1","susy":"^2.2.9","vinyl-buffer":"^1.0.0","vinyl-source-stream":"^1.1.0","watchify":"^3.6.1"},"dependencies":{"bluebird":"^3.1.1","find-root":"^0.1.1","good":"^6.4.0","good-console":"^5.2.0","hapi":"^12.0.0","hoek":"^3.0.4","husl":"^6.0.1","inert":"^3.2.0","lodash":"^3.10.1","read-package-json":"^2.0.2","require-directory":"^2.1.1","slug":"^0.9.1","spdx-license-list":"^2.1.0"},"gitHead":"ab3124f042dc39f8768be85fe6110cb14546f9cb","_id":"spire@0.6.1","_shasum":"b9dd13056df3838f5263d027b4d063157ccf1caa","_from":".","_npmVersion":"3.3.12","_nodeVersion":"5.2.0","_npmUser":{"name":"epiloque","email":"robots+npm@epiloque.com"},"dist":{"shasum":"b9dd13056df3838f5263d027b4d063157ccf1caa","tarball":"https://registry.npmjs.org/spire/-/spire-0.6.1.tgz","integrity":"sha512-+vh7pmPFZBX1g5isqTA2RvE6nIMR6dLY134W7gWJHpY4F6MVGxCVyNdEV+17tsOWTL6u0f5pQn3RN1LlYtbpSw==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIH0q/qwkHXMQNYoHTeeIha6xpBvsJGtCzmq7ZRdkPZW2AiEAiagMhBxrFzRPqnUXUpDBORz0KYvHVLxEwNUGtZu5XtU="}]},"directories":{}},"1.3.0":{"name":"spire","version":"1.3.0","description":"Extensible CLI toolkit managment tool","main":"index.js","repository":{"type":"git","url":"git+https://github.com/researchgate/spire.git"},"author":{"name":"Sergey Bekrin","email":"sergey@bekrin.me","url":"https://bekrin.me"},"license":"MIT","bin":{"spire":"./bin/spire.js"},"engines":{"node":">=8.3"},"scripts":{"postinstall":"./bin/spire.js hook postinstall","preuninstall":"./bin/spire.js hook preuninstall"},"dependencies":{"cosmiconfig":"^5.0.7","fs-extra":"^7.0.1","invariant":"^2.2.4","pretty-format":"^23.6.0","signale":"^1.3.0","spire-config-default":"^1.3.0","yargs":"^12.0.5"},"devDependencies":{"spire-test-utils":"^1.3.0"},"gitHead":"80196ef60929493f659dd06911ab5195b735a825","bugs":{"url":"https://github.com/researchgate/spire/issues"},"homepage":"https://github.com/researchgate/spire#readme","_id":"spire@1.3.0","_nodeVersion":"10.15.1","_npmVersion":"lerna/3.10.5/node@v10.15.1+x64 (darwin)","_npmUser":{"name":"sbekrin","email":"sergey@bekrin.me"},"dist":{"integrity":"sha512-d6dgXks+SC+VUYRypeFnmhK48ENsscDZqJ4CYIu6Q3vrCUn4VbgIKXDBTjBkDMfwzSly05j1b0pFjAO11QyFZQ==","shasum":"6531c890462a9585d36feb9c7d208bb30f027687","tarball":"https://registry.npmjs.org/spire/-/spire-1.3.0.tgz","fileCount":19,"unpackedSize":29759,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcd/DHCRA9TVsSAnZWagAAVwcP/jcL/dHsgSsk77Vu1kp7\nAvuruYiyjeZqc0BMgan5Mh4hzfTw2pC+xzxIGkJo5Sq6Vi3VL9RyULmZA+9r\nRQIvtRROF8W7N+UolRxV5RA8El8bnKURp9BYoLy0PWzHILttGWIPxvKEPvN8\njHHO5dy4G3O1ZOcO7abFjNi8TXQ6wH7qDbhPYTG6nBSLifoVq01gyoZLEZ4n\nojHeh6z9LczxtHpnl7CGHTckVr1zi0zD8jA21jwdtn0IaxntoUcBVPw92iQp\nE7DpRMN9MNd8jnLysnqGVPfVuvmZ8UP1hCd/Nd5+9sL+GVyRaha8hPAQT7sc\ng604FwN+VT4laZuP359Hea/MfWCK38IPa4J+epNqBuRoK3xxymKsuuLlUxuA\nMk1yAxjnqoh3+ZnifBxSxv8/tnXld56b+okGeS4zVAYAYUnCtuDbAQKJ8USM\ncOGocXTJHsBCFMK89K12Ix403FpWZnClmRZgp2PRYitVsQ6VZJuueDP+yW7w\nDtpqsGDOQFGtz8H6bg2U4NfeCfp7a8CXQ5cc6IGVpcqjSTaJxi79zdGSUS6e\nFtNKl31vuTgS5GCqgtnTUORm0fWtvGk9LxmdqxfLTNl4UbFLiXW6EuIdhstT\ngoSn/SjUpH7IDwzg1GeLQAUcM0xza0BPvOI09GM3kOpLkQllZCHtbFC7Ej0Q\n4imA\r\n=krFc\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIH9EaYtabSrWkX2zDTbtC7i7qXWnUDbVQ/1PU8TFDIe3AiEAnyskYSx9U8zc5Wz1X/9xH1uAIw3SjZpNAMDjBXtazOM="}]},"maintainers":[{"email":"sergey@bekrin.me","name":"sbekrin"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/spire_1.3.0_1551364295177_0.8488179549957724"},"_hasShrinkwrap":false},"1.4.0":{"name":"spire","version":"1.4.0","description":"Extensible CLI toolkit managment tool","main":"index.js","repository":{"type":"git","url":"git+https://github.com/researchgate/spire.git"},"author":{"name":"Sergey Bekrin","email":"sergey@bekrin.me","url":"https://bekrin.me"},"license":"MIT","bin":{"spire":"./bin/spire.js"},"engines":{"node":">=8.3"},"scripts":{"postinstall":"./bin/spire.js hook postinstall","preuninstall":"./bin/spire.js hook preuninstall"},"dependencies":{"cosmiconfig":"^5.1.0","fs-extra":"^7.0.1","invariant":"^2.2.4","pretty-format":"^24.5.0","signale":"^1.4.0","spire-config-default":"^1.4.0","yargs":"^13.2.2"},"devDependencies":{"spire-test-utils":"^1.3.0"},"gitHead":"954d72b66d9c101af20d6e18741d50a43ee5be9a","bugs":{"url":"https://github.com/researchgate/spire/issues"},"homepage":"https://github.com/researchgate/spire#readme","_id":"spire@1.4.0","_nodeVersion":"10.15.1","_npmVersion":"lerna/3.13.1/node@v10.15.1+x64 (darwin)","_npmUser":{"name":"sbekrin","email":"sergey@bekrin.me"},"dist":{"integrity":"sha512-PqD9FjNP8dD4XwyG3XMZO3pOXzjAoMzyN5dKn7DmLHKoPKBKdSh/LEGE5qLq1E1QGmbxwY+ZhtKydpi2HKhS3Q==","shasum":"833996fd5c89429a34cc84e118e0ec5da008fb38","tarball":"https://registry.npmjs.org/spire/-/spire-1.4.0.tgz","fileCount":19,"unpackedSize":30646,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcnfUrCRA9TVsSAnZWagAAnW0P/2khSb648oJRkr05OpCo\ntijqx29wOu/LKQQjvyZxXqDvPyaeCUofxdAdjCeMx3T4PiQD30eNsaHkSZPH\nl8zTZtWqTN4AdppCW8u9OdHZZPJcuRen6yoI0Avk2UWvI6M9ebe0r5jLuvk3\n72BE5WsUBWzUyTz+4Y3c+0sOR19npgFkyERFWFcyRtVuV1oJ9W7PSErqSqf+\nhtmzjfo2fyqn/8LA2n1EHRVEwNc9klVDGTU0TvBNHljp07AmGQToaEqvQ/MJ\nt5HMSLcrNN2zJyHQjz5azioNliuZRcGlQKZDO+rZyK6wI/TSBeB0wBZDBlsp\nL+47ssRWd1Kv3eWodSpI7G+7qWjWYsSqD6r+2uqH+rUKKbTgur1m1zGCTtJF\nMUOkMtAfuqA8hJVY09P0P3CTJChFytX2kSgeifzeskhDAXiVriLfpwYUDzX+\nfe3zhPKdqFpGmsPbtHNYJiCefeVBC/A3oSA9oHUqegQevqTOOk6QhT0DAgrc\nOil4RSixZQbSOXSG/Dnr063HkPawvhl3PkuBfZS1ZlDqA3Pe3XTIjS00J3Lf\nOrwQvb3MkhV6peiEB5myYeMN0UJnnx+WLg0GXSMt/dtYGMRjm7aCCb2pU2is\nRw8wOidngIuFsHZ88IZiWJUaWo5Ptvo4jKhAL6BKEl2j303bQHa/IHp4VT+2\nyV4F\r\n=h4I2\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIAtWUb1Y7yU3NtSbJZjNTljyFyJQenMkLv4oRtPuNt+lAiEApXWndMtExV1Tz2woUklcvANGHlWTriYZ82VbNYy7VHU="}]},"maintainers":[{"email":"sergey@bekrin.me","name":"sbekrin"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/spire_1.4.0_1553855786236_0.586474098714795"},"_hasShrinkwrap":false},"1.4.1":{"name":"spire","version":"1.4.1","description":"Extensible CLI toolkit managment tool","main":"index.js","repository":{"type":"git","url":"git+https://github.com/researchgate/spire.git"},"author":{"name":"Sergey Bekrin","email":"sergey@bekrin.me","url":"https://bekrin.me"},"license":"MIT","bin":{"spire":"./bin/spire.js"},"engines":{"node":">=8.3"},"scripts":{"postinstall":"./bin/spire.js hook postinstall","preuninstall":"./bin/spire.js hook preuninstall"},"dependencies":{"cosmiconfig":"^5.2.0","fs-extra":"^7.0.1","import-from":"^2.1.0","invariant":"^2.2.4","pretty-format":"^24.5.0","signale":"^1.4.0","spire-config-default":"^1.4.1","yargs":"^13.2.2"},"devDependencies":{"spire-test-utils":"^1.3.0"},"gitHead":"84a79fafae163c3c4f2eaffecd54b09c2cf71241","bugs":{"url":"https://github.com/researchgate/spire/issues"},"homepage":"https://github.com/researchgate/spire#readme","_id":"spire@1.4.1","_nodeVersion":"10.15.1","_npmVersion":"lerna/3.13.1/node@v10.15.1+x64 (darwin)","_npmUser":{"name":"sbekrin","email":"sergey@bekrin.me"},"dist":{"integrity":"sha512-/taQlWWUgAgA4aGIi9uzKZqlR5CaZdec3Bq0dS36sM+QrFjxvTzD3fOoTxDuWOOWoWXn/InBA9ogPW+yqHhaEA==","shasum":"b1e08a29dec672bb3e6b483e3c65e4c85e9f23fe","tarball":"https://registry.npmjs.org/spire/-/spire-1.4.1.tgz","fileCount":19,"unpackedSize":31331,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcnjpVCRA9TVsSAnZWagAAshcP/2KztB1bhA2B2m5gVzz5\nIyGTnThALGGm0OljpdR9ecVcBmQT945f4WfdVzHwyGFcGrLXf/3tIcLq4Ayo\naeBVeEmVcIL6ZzUD3sOkZdTAckseAr3ABvj1/LEzZt7cUo48qdDSn/MI5fyX\nOi2pfCEOgva9Jzl0NFaxFkrJjRmt41Z0c29psC53KK9pUC1hkpjGgxuFv6D6\n6REcE/Jdpjf2MooT3AX+n5VEedTQDIbyWt5ijG0ipKOdyeTtjD45RWSK6ZPh\nV2mpdnjRP/0eRTyXDLeoIWxMeVCEZjSLfxFF34cJaFNUjKZV/SDh8EtLRAEX\n64R4lFURVWRa0h85GjzqWonRRb7DuHljzv4ho/38h72LYkKKb1njECMBaaw5\nppfXhn/OEFD+X+y7F0mz+WzsZPh+Foltcvy2lZSLKYjUaoSBEci8nft3rs9p\n665oz97dhnFyv53ocQWG9hOLVfs3xT6kbX9G5PVmAzZUpjMkMWMltymypRZH\n0IWcXjMfkFCV/nUJb12c0yyWBgJRqNbDgOqmc4TNrX4HFP6H0eZv+dUkWprz\nbmxEpHBRhuNCX8s9zVS3ugP3y1gGEFSiqe9lgx7UECI97BuXRebxUDLKsCH2\nSXZG0wnbyUvAWtzCr1rAzHsIRS+NBu8A8mweIQ6+MppIvrp1w5J0Re7qCOPr\nAbA4\r\n=EocR\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCcSJGExuYzZZZe+/unimcBR8Wh/bv4NlXGzEv2RgRctQIgQAV51nvXQXsThED3gFsdnIfXQNx9rTrCNkfuxjgEf6s="}]},"maintainers":[{"email":"sergey@bekrin.me","name":"sbekrin"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/spire_1.4.1_1553873492778_0.033749374760342565"},"_hasShrinkwrap":false},"1.7.0":{"name":"spire","version":"1.7.0","description":"Extensible CLI toolkit managment tool","main":"index.js","repository":{"type":"git","url":"git+https://github.com/researchgate/spire.git"},"author":{"name":"Sergey Bekrin","email":"sergey@bekrin.me","url":"https://bekrin.me"},"license":"MIT","bin":{"spire":"./bin/spire.js"},"engines":{"node":">=8.3"},"scripts":{"postinstall":"./bin/spire.js hook postinstall","preuninstall":"./bin/spire.js hook preuninstall"},"dependencies":{"cosmiconfig":"^5.2.0","fs-extra":"^7.0.1","import-from":"^2.1.0","invariant":"^2.2.4","pretty-format":"^24.7.0","signale":"^1.4.0","spire-config-default":"^1.7.0","yargs":"^13.2.2"},"devDependencies":{"spire-test-utils":"^1.3.0"},"gitHead":"86b810c92e10c76d1dc5800b04bea17fc3285ebc","bugs":{"url":"https://github.com/researchgate/spire/issues"},"homepage":"https://github.com/researchgate/spire#readme","_id":"spire@1.7.0","_nodeVersion":"10.15.1","_npmVersion":"lerna/3.13.1/node@v10.15.1+x64 (darwin)","_npmUser":{"name":"sbekrin","email":"sergey@bekrin.me"},"dist":{"integrity":"sha512-+SOCOmBra+1bAyvMm0rnRWia9sf+r2G2CXTYTzl9gJVpLs8GHsVdEPsudojGOEzf6NnXZGhk4fNkuXXy6jJhpQ==","shasum":"873a153937efb151d06d9a9c2a141f4dc7739a76","tarball":"https://registry.npmjs.org/spire/-/spire-1.7.0.tgz","fileCount":19,"unpackedSize":32394,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcpNQRCRA9TVsSAnZWagAA0AkP/3kfsBy6ai9zhThhNmgq\nauk5DQXGNTNMvazuCyKuKmgBlVZ0cJru0kueZ5A3PftqrIbFJZ0AukOPz7Ie\n7bHVzJCDlpCzsB5QMeCUdGrRS1jVgoHkbqGHdrxmk78w7Ax9EdalyqgW7TY3\nXx42IqHTg2sUy+QxDcDauILftq7MItU8mgWOW0ttXIrOBU/deoGifEc4/ngr\nW/uAhIOwIc+/2DAF3SzOCvVriJDX7HdSwuAKR+qlak0PHeyreYXlsjWTxK+x\nlQZ76lv6Go62Bn3Hx+sr/SLBRih4t4Zq9X59906IMBQfj75mxmI/I5jcZkHZ\npyKv4b6WS+arzp/5yfQwGyaaYyU4O8JfbmJULXhghL3CoD7VBPtt9vwVeu+O\n99TJ+4J950mWAcSyti864C/xsdat+WQ8DomZ/dg+hxpqJZZLpuiuF+W1ZKkK\ntjwVZnDuY+srl7vP2j2HqmNf5SxbI1mfL6Dts6KISG/eylZysVpDMxPbY27O\nU/MWP12nit7J5Zg6bXZ9XTj2mmfQDnAHiXE0rBk+rs2pqmnJNLAlNLXD6Ct6\neMPx1Wl4xOLxZGgp5cjdjM8Uy2RlSYKHSqE91GRJC+ack/9EQV036inD8UMS\n2fEfZnW0CqE129ytlmJtv+jwqqKJJfvcRQrh/oJx/FduFOk0SHXtV58ZkT94\nw2qk\r\n=hzIe\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCs8NK+fLji1kfBQ2jqlkPTsr3A1xyWXyyCVhWprLA4JgIgQd4JyIwZM/z/n9ija9AMkLAARoaZM/CuUDeq1sYSfrU="}]},"maintainers":[{"email":"sergey@bekrin.me","name":"sbekrin"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/spire_1.7.0_1554306064845_0.8078505891691452"},"_hasShrinkwrap":false},"1.7.1":{"name":"spire","version":"1.7.1","description":"Extensible CLI toolkit managment tool","main":"index.js","repository":{"type":"git","url":"git+https://github.com/researchgate/spire.git"},"author":{"name":"Sergey Bekrin","email":"sergey@bekrin.me","url":"https://bekrin.me"},"license":"MIT","bin":{"spire":"./bin/spire.js"},"engines":{"node":">=8.3"},"scripts":{"postinstall":"./bin/spire.js hook postinstall","preuninstall":"./bin/spire.js hook preuninstall"},"dependencies":{"cosmiconfig":"^5.2.0","fs-extra":"^7.0.1","import-from":"^2.1.0","invariant":"^2.2.4","pretty-format":"^24.7.0","signale":"^1.4.0","spire-config-default":"^1.7.1","yargs":"^13.2.2"},"devDependencies":{"spire-test-utils":"^1.7.1"},"gitHead":"ff9029a8516da0a3cd8f78ef7d0eb6a96680dc27","bugs":{"url":"https://github.com/researchgate/spire/issues"},"homepage":"https://github.com/researchgate/spire#readme","_id":"spire@1.7.1","_nodeVersion":"10.15.0","_npmVersion":"lerna/3.13.1/node@v10.15.0+x64 (darwin)","_npmUser":{"name":"sbekrin","email":"sergey@bekrin.me"},"dist":{"integrity":"sha512-kjP+22MeYGtLbJVKNkpxm/UnlDS+BMCq9sFzHyoakxwXO3yQcYwaHDqigBJhsx9VnlM6F8pDxIOcN1zaEGniGw==","shasum":"9568f3121e492d541c66ae5a39f47284c664a2a8","tarball":"https://registry.npmjs.org/spire/-/spire-1.7.1.tgz","fileCount":19,"unpackedSize":34008,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcvuKhCRA9TVsSAnZWagAAgVYP/0enDbAuDm9aCgbYQMez\nB7XotzoZrFV3jrqWc6Ehl+Z8nqyo+rROIbKkRNYT9KJ8rFJudq05+gQPYz1m\nr8zpxXNASvH1jp2/9w1CLVY/UVGKwtrqnELYA5SN9KaQ4W7zsyBLkaCGeE90\nkF+oCd2fKk4j0Pd8y2hwrxhQdPFTf0hs6OIGNktymmjupk0cWoNdQKo2jCuN\nOwSh7p0vpH7/NofPMz1VmvUH+zSE03lI8lVLwUZhWP0aKV2+hWfkT3uyWRzB\nzgAWDpHFpcnAAOBZ8Ecbe5KoOspndQiyUAIuTq81AAAtIEy1+IUoh5vuc3Rl\nwu6QYtyNWe7rTRRvusLmGaEJ+jiz1KqqcAk/DCSYli/Xpv/EjZwlXBkzrm6z\nGW0B6iLPZmC0C5AEv01x73Fp4lueU9PORm63YENLn/haW+CEHnqYi1tl7NvR\nLOp7HQXm6Vj9Suj7Hso1aAnpIf1V3s6rGbYguxh96og/s9B9pYFLsvQ3jhgu\nvYNU/ktRYi3TR+AZFuebErmvHpsst9NG385UKdVogADYz9nH76V+uq3/cQh6\n1gMDo1tYOGY/pH2cDOehFaiTDeLVazo18+c1+G8RHkFzZi+p4vW1Izi1+MTa\njosOYRLG4hYFikUjLdGNdwSoYuyOvhjNiFEdw8SBPbRMQatQ7T8oEn/VKnsb\ndQMj\r\n=zvb2\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCjV8RMgg7VEiMW0P4eaaJJjGvo7OTYcWY4kcWaVAQjUwIgbHoIvoczZ6ARyh27I1WijDmq21lvjr42Nhq8B9KHHmM="}]},"maintainers":[{"email":"sergey@bekrin.me","name":"sbekrin"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/spire_1.7.1_1556013728758_0.5740029794914512"},"_hasShrinkwrap":false},"1.7.2-next.1":{"name":"spire","version":"1.7.2-next.1","description":"Extensible CLI toolkit managment tool","main":"index.js","repository":{"type":"git","url":"git+https://github.com/researchgate/spire.git"},"author":{"name":"Sergey Bekrin","email":"sergey@bekrin.me","url":"https://bekrin.me"},"license":"MIT","bin":{"spire":"./bin/spire.js"},"engines":{"node":">=8.3"},"scripts":{"postinstall":"./bin/spire.js hook postinstall","preuninstall":"./bin/spire.js hook preuninstall"},"dependencies":{"cosmiconfig":"^5.2.0","fs-extra":"^7.0.1","import-from":"^2.1.0","invariant":"^2.2.4","pretty-format":"^24.7.0","signale":"^1.4.0","spire-config-default":"^1.7.2-next.1+98c6149","yargs":"^13.2.4"},"devDependencies":{"spire-test-utils":"^1.7.1"},"gitHead":"98c6149215678a79a57b1cbfd10cbefd89569c6a","readme":"# 🗼 Spire\n\nExtensible JavaScript toolbox management.\n\n<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->\n\n\n- [Motivation](#motivation)\n- [Quick Start](#quick-start)\n- [Configuration](#configuration)\n  - [Using a Custom Preset](#using-a-custom-preset)\n  - [Using a Local Preset](#using-a-local-preset)\n  - [Passing Options](#passing-options)\n- [Guides](#guides)\n  - [Writing a Config](#writing-a-config)\n  - [Writing a Plugin](#writing-a-plugin)\n  - [Migrating to Spire](#migrating-to-spire)\n  - [Using without Git](#using-without-git)\n  - [Using in monorepos](#using-in-monorepos)\n- [API](#api)\n  - [CLI](#cli)\n  - [`spire`](#spire)\n  - [`context`](#context)\n- [References](#references)\n- [License](#license)\n\n<!-- END doctoc generated TOC please keep comment here to allow auto update -->\n\n## Motivation\n\n**Problem:** Maintaining tools and configurations for linting, testing and\nbuilding your code is hard. The more projects you have, the more time it takes\nto keep your setup consistent and up-to-date.\n\n**Solution:** Spire is a pluggable CLI tool which allows you to abstract all of\nyour tools and configurations into reusable plugins and presets. Think of it as\n“babel for infrastructure”.\n\n## Quick Start\n\n1. Install `spire`:\n\n```sh\n# yarn\nyarn add --dev spire\n\n# npm\nnpm install --save-dev spire\n```\n\n2. Start using in your project:\n\n```sh\n# npx\nnpx spire --help\n\n# yarn\nyarn spire --help\n```\n\n3. Depending on your tech stack, you can start using Spire as zero-config tool.\n   See [spire-config-default] for a list of default tools and\n   [configuration section](#configuration) for how to customise it.\n\n- _Using yarn? Consider installing [spire-plugin-yarn] for few power features._\n\n- _Want to have automated release w/ changelog generation? Check out\n  [spire-plugin-semantic-release] and [spire-plugin-lerna-release] for lerna\n  monorepos._\n\n## Configuration\n\nSpire is based on config presets, which is the same concept for tools like\n[Babel](https://babeljs.io/) and [ESLint](https://eslint.org/). Configs are a\nset of predefined plugins and their options. Configs can also extend a chain of\nother configs. By default, Spire is shipped with [spire-config-default].\n\n### Using a Custom Preset\n\nTo use your preferred configuration, install it as dev dependency and reference\nit by module name in [`extends` property](#writing-a-config). To extend multiple\nconfigs, provide it as an array. You can also use individual plugins along with\nconfigs with [`plugins` property](#writing-a-config).\n\n<details open>\n  <summary>via <code>package.json#spire</code> (recommended)</summary>\n\n```json\n{\n  \"name\": \"acme-project\",\n  \"devDependencies\": {\n    \"spire\": \"^1.0.0\",\n    \"spire-config-acme\": \"^1.0.0\"\n  },\n  \"spire\": {\n    \"extends\": \"spire-config-acme\"\n  }\n}\n```\n\n</details>\n\n<details>\n  <summary>via <code>spire.config.js</code></summary>\n\n```js\nmodule.exports = {\n  extends: 'spire-config-acme',\n};\n```\n\n</details>\n\n<details>\n  <summary>via <code>.spirerc</code></summary>\n\n```js\n{\n  \"extends\": \"spire-config-acme\",\n}\n```\n\n</details>\n\n### Using a Local Preset\n\n_Note: It is recommended to enable Local Presets only for development._\n\nYou can reference a Local Preset or plugin using `<rootDir>` placeholder which\npoints to the current project directory:\n\n```json\n{\n  \"spire\": {\n    \"extends\": \"<rootDir>/spire-config.js\",\n    \"plugins\": [\"<rootDir>/spire-plugin.js\"]\n  }\n}\n```\n\n### Passing Options\n\nIf the config preset or plugin you're using supports customisation, you can pass\noptions to it:\n\n```json\n{\n  \"spire\": {\n    \"extends\": [[\"spire-config-acme\", { \"fictional\": false }]],\n    \"plugins\": [[\"spire-plugin-acme\", { \"company\": true }]]\n  }\n}\n```\n\n## Guides\n\n### Writing a Config\n\nA Config is a module which exports a function returning an object.\n\n- `config` \\<[function]([Object], [Object])\\>\n  - `spire` \\<[Object]\\> Spire [API object](#spire).\n  - `options` \\<[Object]\\> User-provided config options.\n- returns: \\<[Object]\\>\n  - `extends` \\<[string]|\\<[Array]\\<[string]\\>\\>\\> Config or an array of config\n    presets to extend.\n  - `plugins` \\<[Array]\\<[string]\\>\\> Array of plugins to include.\n\nExample:\n\n```js\nmodule.exports = (spire, options) => {\n  return {\n    extends: ['spire-config-first', 'spire-config-second'],\n    plugins: ['spire-plugin'],\n  };\n};\n```\n\nYou can dynamically change the behaviour of your preset based on `options` or\n`spire` APIs, but it's recommended to keep it explicit. Check\n[spire-config-default](https://github.com/researchgate/spire/blob/master/packages/spire-config-default/index.js)\nfor a reference.\n\n### Writing a Plugin\n\nA Plugin is a key component of Spire. After it resolves the config, Spire\naccumulates all plugins in chronological order and runs them. A Plugin is a\nfunction returning an object:\n\n_Note: It is recommended to keep plugins scoped to a single feature or tool._\n\n- `plugin` \\<[function]([Object], [Object])\\>\n  - `spire` \\<[Object]\\> Spire [API object](#spire).\n  - `options` \\<[Object]\\> User-provided plugin options.\n- returns: \\<[Object]\\>\n  - `name` \\<[string]\\> Name of the plugin (recommended).\n  - `preinstall` \\<[function]\\([Context]\\): [Promise]\\> Executed before\n    `yarn install` or `npm install`\n  - `postinstall` \\<[function]\\([Context]\\): [Promise]\\> Executed after\n    `yarn install` or `npm install`.\n  - `postmerge` \\<[function]\\([Context]\\): [Promise]\\> Executed on `git pull`.\n  - `precommit` \\<[function]\\([Context]\\): [Promise]\\> Executed on `git commit`.\n  - `setup` \\<[function]\\([Context]\\): [Promise]\\> Executed before `run` hook.\n    Use it to prepare arguments or config for your tools. If it fails, Spire\n    stops futher hooks from being executed.\n  - `skip` \\<[function]\\([Context]\\): [Promise]<[boolean]>\\> Executed before\n    `run` hook. Returning `true` will prevent `run` hook from being executed.\n    Use this to check if the current command is the one you expect\n  - `run` \\<[function]\\([Context]\\): [Promise]\\> Executed as the main logic of\n    the plugin. Use this hook to run the CLI tool or process long-running task.\n  - `teardown` \\<[function]\\([Context]\\): [Promise]\\> Executed after `run` hook,\n    even if it has failed. Use this hook to cleanup locally or to collect some\n    stats.\n  - `preuninstall` \\<[function]\\([Context]\\): [Promise]\\> Executed before\n    `yarn uninstall` or `npm uninstall`. Run it to cleanup external data.\n\nExample:\n\n```js\nmodule.exports = (spire, options) => {\n  const MY_TOOL = Symbol.for('my-tool');\n  return {\n    name: 'my-awesome-tool',\n    async setup({ cli }) {\n      cli.command(\n        'my-tool',\n        'run my awesome tool',\n        () => {},\n        () => spire.setCommand(MY_TOOL)\n      );\n    },\n    async skip() {\n      return spire.getCommand() !== MY_TOOL;\n    },\n    async run({ logger }) {\n      logger.log('Hi from my awesome tool!');\n    },\n  };\n};\n```\n\nCheck [spire-plugin-clean], [spire-plugin-doctoc] and [spire-plugin-eslint] for\nmore plugin examples.\n\n### Migrating to Spire\n\n**Identify your tools:** To get started, gather a list of shared tools in your\nexisting projects. This will help to identify which plugins you'll need.\n\n**Pick preset or plugin:** Check if there's already a default or community\nplugin for that.\n[Search for `spire-plugin-*`](https://www.npmjs.com/search?q=spire-plugin-) on\nnpm for individual tools and\n[`spire-config-*`](https://www.npmjs.com/search?q=spire-config-) for specific\necosystems and tech stacks. In case if there's no suitable option for your,\ncheck on how to [write a custom plugin](#writing-a-plugin).\n\n**Make your own preset**: If you find that an existing or default preset works\nfor you, skip this step. If not, create a new module with a name matching\n`spire-config-*`. It can be specific for your personal projects, your company or\na tech stack. Check [writing a config](#writing-a-config) for instructions on\nhow to do this.\n\n**Migrate your projects**: Once you've got a preset ready, go through your\nprojects and [setup Spire](#quick-start) with it. Make sure to delete the\ndependencies it replaces. At this point you're done!\n\n### Using without Git\n\nAt the moment Spire has a hard dependency on a Git repository to resolve\nmonorepo project root. This most likely to be reviewed in the future, but\nmeanwhile it is part of the core, you can export `SKIP_PREFLIGHT_CHECK=true`\nenvironment variable to disable this check. The idea and name of this flag is\nborrowed from [create-react-app].\n\n### Using in monorepos\n\nIt is recommended to install Spire on the root level of a monorepo and run all\ncommands from there. The main motivation behind this is performance and\nconsistency reasons. You can still though run commands in an indivudual package.\nBelow is an example of how to run `spire lint` in a specific monorepo package:\n\n- With [yarn workspaces]:\n  ```sh\n  yarn workspace <pkg-name> spire lint\n  ```\n- With [lerna]:\n  ```sh\n  npx lerna --scope <pkg-name> exec spire lint\n  ```\n\n## API\n\n### CLI\n\nEach plugin can extend a list of available commands and their options. The list\nbelow only includes basic commands.\n\n- `npx spire --help` Prints the list of available commands.\n- `npx spire --version` Prints the current version of Spire.\n- `npx spire <cmd>` Runs a specific command defined by plugins.\n- `npx spire --debug <cmd>` Outputs additional debug information.\n- _(hidden)_ `npx spire hook <name>` Runs specific git or npm plugin hooks.\n  Available hooks are `postinstall`, `preuninstall`, `precommit` and\n  `postmerge`. Use this to test or debug your plugins.\n\n### `spire`\n\nSpire is an object which is passed as the first argument to both configs and\nplugins.\n\n- `spire`\n  - `setState` \\<[function]\\([Object]|[function]\\)\\> Sets state by merging it\n    with previous one (shallow).\n    - `state` \\<[Object]|[function]\\> New state as an object or a function which\n      recevies the previous state and returns an object. Usefull to avoid\n      `getState()` calls.\n  - `getState` \\<[function]\\(\\): [Object]\\> Returns current state.\n  - `setCommand` \\<[function]\\([Symbol]\\)\\> Sets or overrides current command.\n  - `getCommand` \\<[function]\\(\\): [Symbol]\\> Returns current command name if\n    any. Available only after `setup` hook.\n  - `hasFile` \\<[function]\\([string]\\): [Promise]\\<[boolean]\\>\\> Checks if\n    current projects contains specific file.\n  - `hasPackageProp` \\<[function]\\([string]\\): [Promise]\\<[boolean]\\>\\> Check if\n    current project's `package.json` contains specific prop.\n  - `stop` \\<[function]\\(\\)\\> Stops futher `run` hooks from being executed.\n    Works only in plugins.\n\n### `context`\n\nContext is an object which is passed as the first argument to plugin hooks. It's\ndesigned to be read-only. If you want to pass some data futher, consider using\n[`spire.setState` instead](#spire).\n\n- `context`\n  - `argv` \\<[Array]\\<[string]\\>\\> Array of arguments Spire was called with.\n    Defaults to `process.argv.slice(2)`.\n  - `cli` \\<[Object]\\> Instance of [yargs](http://yargs.js.org/) for adding\n    custom commands.\n  - `cwd` \\<[string]\\> Directory Spire is executed in. Defaults to\n    `process.cwd()`.\n  - `env` \\<[Object]\\> Set of environment variables. Defaults to `process.env`.\n  - `logger` \\<[Object]\\> Instance of\n    [Signale](https://github.com/klauscfhq/signale). Use `logger.debug()` to\n    print debug info which is only shown with `--debug` flag.\n  - `config` \\<[Object]\\> Parsed and normalised [config](#writing-a-config).\n  - `options` \\<[Object]\\> Parsed yargs options. Available only after `setup`\n    hook.\n\n## References\n\nThis project is inspired by the great work of JavaScript open source community\n(without particular order):\n\n- [Kent C. Dodds: Tools without config 🛠📦](https://blog.kentcdodds.com/automation-without-config-412ab5e47229)\n- [Dan Abramov: The Melting Pot of JavaScript](https://www.youtube.com/watch?v=nl30vWYKs9A)\n- [Jamie Kyle: Tools 4 Tools 4 Tools](https://www.youtube.com/watch?v=itI5xGyvtho)\n- [semantic-release](https://github.com/semantic-release/semantic-release)\n- [react-scripts](https://github.com/facebook/create-react-app/tree/next/packages/react-scripts)\n- [kcd-scripts](https://github.com/kentcdodds/kcd-scripts)\n- [bolt](https://github.com/boltpkg/bolt)\n\n## License\n\nMIT &copy; [ResearchGate](https://github.com/researchgate)\n\n[context]: #context\n[spire-config-default]:\n  https://github.com/researchgate/spire/blob/master/packages/spire-config-default\n[spire-plugin-yarn]:\n  https://github.com/researchgate/spire/blob/master/packages/spire-plugin-yarn\n[spire-plugin-clean]:\n  https://github.com/researchgate/spire/blob/master/packages/spire-plugin-clean\n[spire-plugin-doctoc]:\n  https://github.com/researchgate/spire/blob/master/packages/spire-plugin-doctoc\n[spire-plugin-eslint]:\n  https://github.com/researchgate/spire/blob/master/packages/spire-plugin-eslint\n[spire-plugin-semantic-release]:\n  https://github.com/researchgate/spire/blob/master/packages/spire-plugin-semantic-release\n[spire-plugin-lerna-release]:\n  https://github.com/researchgate/spire/blob/master/packages/spire-plugin-lerna-release\n[boolean]:\n  https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Boolean_type\n[string]:\n  https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type\n[array]:\n  https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array\n[object]:\n  https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object\n[function]:\n  https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function\n[promise]:\n  https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise\n[symbol]:\n  https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol\n[create-react-app]: https://github.com/facebook/create-react-app\n[yarn workspaces]: https://yarnpkg.com/lang/en/docs/workspaces/\n[lerna]: https://github.com/lerna/lerna\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/researchgate/spire/issues"},"homepage":"https://github.com/researchgate/spire#readme","_id":"spire@1.7.2-next.1","_nodeVersion":"10.15.0","_npmVersion":"lerna/3.13.1/node@v10.15.0+x64 (darwin)","dist":{"integrity":"sha512-YoY8hQSPFNTjlhqiRKd1Gn+1g7wBB1A+iA/PJqE5UNUpzedbQVVM4pG4bgWat3jII+0SQkZKO6aRx0KVyYLldA==","shasum":"ef32f6b8fac5ff4bb43fb6742c34d0ce795f119b","tarball":"https://registry.npmjs.org/spire/-/spire-1.7.2-next.1.tgz","fileCount":19,"unpackedSize":35070,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc5B4cCRA9TVsSAnZWagAAV6YP/1OVJ4p0KBvrWmQsPYh2\nnilZUwBgtWTiktvCNhTrw0jyQ580Vu56B5Vlan43v5UcO48pzwmNwoL5Xx+U\ni1zjvWkc6rVaemYUPKmPci5mrK5qKtOhrmtL56n0S4EGR1mSGtfd1q/ZDp18\n7/WNDKDAfAcbuKk+ZldqD3chRLDE6nIywzG0k4ZMlgzbj6KvEpOyyfCep68W\nfyl2Cmj8C1LyeBtZF3FgSHuB99a17gBHaroJoxEZ+uF8XG0G64JjFUrT50g2\nKtrhJ5pL2vulTDzf7JGr7vJv0fJO7pI85fv6601ZYkIbD4foh2cKOIvuTN46\nh5FQDpHX3xfUoTiYrGTaQOaVkC+p7dZSvny49jH4LZbl8jyF5363IclXIQ6t\n2rMlzpWoWhTfxRvYhbmt9gtLr/VM6aO21s4Wa4dIgNi2pGnklEAZ7a/A4dRZ\noHoclv0HTNGRt0Jv6BiiLhLqB7o1q8RYCTX3SNUxfuqeuL9ejtNWbd9vEnq/\nnIHt5gib08eId9Zsz/ELVog+o2mOOciJOc3V9PfIiVVAObbYcd7gXdxr55/w\n0i8ZDwrOv1maWqYmbZZ+PM0bgY6tGUVtubkgON35bf4FMvPWYV3eqTCGFz8Y\nB9mgd1J1MSUU665jj2ZMzV+YhVipAUkVGyiwHAIOwOrw6R4+MgXyPZBRbPBG\nkB17\r\n=2zDA\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGCq4tflHAJxX+JvgjtgdEZanEbN8CnDKPnMCGY60/ZHAiA6jaD9T3mkNKPdNSlfuEzl1VczKWsQVuGa6v4lsUr2xw=="}]},"maintainers":[{"email":"sergey@bekrin.me","name":"sbekrin"}],"_npmUser":{"name":"sbekrin","email":"sergey@bekrin.me"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/spire_1.7.2-next.1_1558453787551_0.3175940927581169"},"_hasShrinkwrap":false},"1.7.2":{"name":"spire","version":"1.7.2","description":"Extensible CLI toolkit managment tool","main":"index.js","repository":{"type":"git","url":"git+https://github.com/researchgate/spire.git"},"author":{"name":"Sergey Bekrin","email":"sergey@bekrin.me","url":"https://bekrin.me"},"license":"MIT","bin":{"spire":"./bin/spire.js"},"engines":{"node":">=8.3"},"scripts":{"postinstall":"./bin/spire.js hook postinstall","preuninstall":"./bin/spire.js hook preuninstall"},"dependencies":{"cosmiconfig":"^5.2.0","fs-extra":"^7.0.1","import-from":"^2.1.0","invariant":"^2.2.4","pretty-format":"^24.7.0","signale":"^1.4.0","spire-config-default":"^1.7.2","yargs":"^13.2.4"},"devDependencies":{"spire-test-utils":"^1.7.1"},"bugs":{"url":"https://github.com/researchgate/spire/issues"},"homepage":"https://github.com/researchgate/spire#readme","_id":"spire@1.7.2","_npmVersion":"6.5.0","_nodeVersion":"10.15.0","_npmUser":{"name":"sbekrin","email":"sergey@bekrin.me"},"dist":{"integrity":"sha512-d7xxTSjzWpTGxaTmLHGob2B98jGlZzWdvqbl+L2pUYVMNfFhtpG0qZ23c9o9zQ975TTLe9HpO00X3CIP0wr5Eg==","shasum":"cb47c9f8fb8f6dbea7c8c9d609b28d97e4fe45f6","tarball":"https://registry.npmjs.org/spire/-/spire-1.7.2.tgz","fileCount":18,"unpackedSize":34406,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc6AFqCRA9TVsSAnZWagAAuX0P/0zMcniKydMDHc4wAMni\nyeGurSLckpockJEuLWkH2utQP56zPIT2OCKeVapvS10HX2YIrCXJ43Blk4Py\ngT1xWa5mVsetsoTBWQ+ipbpYDJujb0kb5iaywg4dS6c8NWX0nAyLzsXSqHuy\nYv5LI79nZfA4ZJcIkmOzj/9h4TpHeYfwtCWEx51cU/wxJiUdpTG1taO04Olw\nsBn3xeJLX7TYQx06846jYuaFys0xmcX5f5lIRnHsazgTwDAXcPFqA4Z9P3iK\nAJ2sthxLpCznIpvlp4OFoRqjvVvYbyEr2mgagjF9A3WpoZEX6vkp+zjw8Qae\nQvqe5/NteigYab3bfDf0uSXCvgga1ORtVM7/Soq0gJYks1fPWMutz94U3sl8\ndEFfboZqSsJtcrR4H3zhb6L6fKS4DCm9cmD09EJzntSJ26Y+q3mzGNwg7VOi\nlIpmAPahujkEiGpGA568wW5kTNg/bUtHeejWDBvNN507QmzTOWXpJjnFnVUV\nySKEe95TVsxLcNq8eCADAMtix0VfsmAXur4XNvs4qAL+axreyf4ZjrSm2wh4\n2/cEdTLDC9BvRHAFatw205FdWf0bdXCXO+zSVbH556lT8PXLLaRi1B5690qO\n7bMHOX8GE7u9+Q4zfcsi1N2GWWivULIn0BBjBmzhDNQz9eidovhsqRJjF2VT\npZHl\r\n=yK16\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDW0U9aRSuDnLP8PYC9JbxjxUN1hApsIq/8U+WpB3pnKAiEAknv5kOHGvt4yEWB63zfBRZgolvLxXXEfMgR2StGGtlw="}]},"maintainers":[{"email":"sergey@bekrin.me","name":"sbekrin"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/spire_1.7.2_1558708585953_0.522896577024144"},"_hasShrinkwrap":false},"1.7.4-next.11":{"name":"spire","version":"1.7.4-next.11","description":"Extensible CLI toolkit managment tool","main":"index.js","repository":{"type":"git","url":"git+https://github.com/researchgate/spire.git"},"author":{"name":"Sergey Bekrin","email":"sergey@bekrin.me","url":"https://bekrin.me"},"license":"MIT","bin":{"spire":"./bin/spire.js"},"engines":{"node":">=8.3"},"scripts":{"postinstall":"./bin/spire.js hook postinstall","preuninstall":"./bin/spire.js hook preuninstall"},"dependencies":{"cosmiconfig":"^5.2.0","fs-extra":"^8.1.0","import-from":"^3.0.0","invariant":"^2.2.4","pretty-format":"^24.7.0","signale":"^1.4.0","spire-config-default":"^1.7.3","yargs":"^13.2.4"},"devDependencies":{"spire-test-utils":"^1.7.1"},"gitHead":"1d25fab1378e1bf005c2524531a2c777a0db8874","readme":"# 🗼 Spire\n\nExtensible JavaScript toolbox management.\n\n<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->\n\n- [Motivation](#motivation)\n- [Quick Start](#quick-start)\n- [Configuration](#configuration)\n  - [Using a Custom Preset](#using-a-custom-preset)\n  - [Using a Local Preset](#using-a-local-preset)\n  - [Passing Options](#passing-options)\n- [Guides](#guides)\n  - [Writing a Config](#writing-a-config)\n  - [Writing a Plugin](#writing-a-plugin)\n  - [Migrating to Spire](#migrating-to-spire)\n  - [Using without Git](#using-without-git)\n  - [Using in monorepos](#using-in-monorepos)\n- [API](#api)\n  - [CLI](#cli)\n  - [`spire`](#spire)\n  - [`context`](#context)\n- [References](#references)\n- [License](#license)\n\n<!-- END doctoc generated TOC please keep comment here to allow auto update -->\n\n## Motivation\n\n**Problem:** Maintaining tools and configurations for linting, testing and\nbuilding your code is hard. The more projects you have, the more time it takes\nto keep your setup consistent and up-to-date.\n\n**Solution:** Spire is a pluggable CLI tool which allows you to abstract all of\nyour tools and configurations into reusable plugins and presets. Think of it as\n“babel for infrastructure”.\n\n## Quick Start\n\n1. Install `spire`:\n\n```sh\n# yarn\nyarn add --dev spire\n\n# npm\nnpm install --save-dev spire\n```\n\n2. Start using in your project:\n\n```sh\n# npx\nnpx spire --help\n\n# yarn\nyarn spire --help\n```\n\n3. Depending on your tech stack, you can start using Spire as zero-config tool.\n   See [spire-config-default] for a list of default tools and\n   [configuration section](#configuration) for how to customise it.\n\n- _Using yarn? Consider installing [spire-plugin-yarn] for few power features._\n\n- _Want to have automated release w/ changelog generation? Check out\n  [spire-plugin-semantic-release] and [spire-plugin-lerna-release] for lerna\n  monorepos._\n\n## Configuration\n\nSpire is based on config presets, which is the same concept for tools like\n[Babel](https://babeljs.io/) and [ESLint](https://eslint.org/). Configs are a\nset of predefined plugins and their options. Configs can also extend a chain of\nother configs. By default, Spire is shipped with [spire-config-default].\n\n### Using a Custom Preset\n\nTo use your preferred configuration, install it as dev dependency and reference\nit by module name in [`extends` property](#writing-a-config). To extend multiple\nconfigs, provide it as an array. You can also use individual plugins along with\nconfigs with [`plugins` property](#writing-a-config).\n\n<details open>\n  <summary>via <code>package.json#spire</code> (recommended)</summary>\n\n```json\n{\n  \"name\": \"acme-project\",\n  \"devDependencies\": {\n    \"spire\": \"^1.0.0\",\n    \"spire-config-acme\": \"^1.0.0\"\n  },\n  \"spire\": {\n    \"extends\": \"spire-config-acme\"\n  }\n}\n```\n\n</details>\n\n<details>\n  <summary>via <code>spire.config.js</code></summary>\n\n```js\nmodule.exports = {\n  extends: 'spire-config-acme',\n};\n```\n\n</details>\n\n<details>\n  <summary>via <code>.spirerc</code></summary>\n\n```js\n{\n  \"extends\": \"spire-config-acme\",\n}\n```\n\n</details>\n\n### Using a Local Preset\n\n_Note: It is recommended to enable Local Presets only for development._\n\nYou can reference a Local Preset or plugin using `<rootDir>` placeholder which\npoints to the current project directory:\n\n```json\n{\n  \"spire\": {\n    \"extends\": \"<rootDir>/spire-config.js\",\n    \"plugins\": [\"<rootDir>/spire-plugin.js\"]\n  }\n}\n```\n\n### Passing Options\n\nIf the config preset or plugin you're using supports customisation, you can pass\noptions to it:\n\n```json\n{\n  \"spire\": {\n    \"extends\": [[\"spire-config-acme\", { \"fictional\": false }]],\n    \"plugins\": [[\"spire-plugin-acme\", { \"company\": true }]]\n  }\n}\n```\n\n## Guides\n\n### Writing a Config\n\nA Config is a module which exports a function returning an object.\n\n- `config` \\<[function]([Object], [Object])\\>\n  - `spire` \\<[Object]\\> Spire [API object](#spire).\n  - `options` \\<[Object]\\> User-provided config options.\n- returns: \\<[Object]\\>\n  - `extends` \\<[string]|\\<[Array]\\<[string]\\>\\>\\> Config or an array of config\n    presets to extend.\n  - `plugins` \\<[Array]\\<[string]\\>\\> Array of plugins to include.\n\nExample:\n\n```js\nmodule.exports = (spire, options) => {\n  return {\n    extends: ['spire-config-first', 'spire-config-second'],\n    plugins: ['spire-plugin'],\n  };\n};\n```\n\nYou can dynamically change the behaviour of your preset based on `options` or\n`spire` APIs, but it's recommended to keep it explicit. Check\n[spire-config-default](https://github.com/researchgate/spire/blob/master/packages/spire-config-default/index.js)\nfor a reference.\n\n### Writing a Plugin\n\nA Plugin is a key component of Spire. After it resolves the config, Spire\naccumulates all plugins in chronological order and runs them. A Plugin is a\nfunction returning an object:\n\n_Note: It is recommended to keep plugins scoped to a single feature or tool._\n\n- `plugin` \\<[function]([Object], [Object])\\>\n  - `spire` \\<[Object]\\> Spire [API object](#spire).\n  - `options` \\<[Object]\\> User-provided plugin options.\n- returns: \\<[Object]\\>\n  - `name` \\<[string]\\> Name of the plugin (recommended).\n  - `command` \\<[string]\\> Optional name of command. Leaving it empty will\n    ignore `run` hook completly.\n  - `description` \\<[string]\\> Optional human-readable command description.\n  - `preinstall` \\<[function]\\([Context]\\): [Promise]\\> Executed before\n    `yarn install` or `npm install`\n  - `postinstall` \\<[function]\\([Context]\\): [Promise]\\> Executed after\n    `yarn install` or `npm install`.\n  - `postmerge` \\<[function]\\([Context]\\): [Promise]\\> Executed on `git pull`.\n  - `precommit` \\<[function]\\([Context]\\): [Promise]\\> Executed on `git commit`.\n  - `setup` \\<[function]\\([Context]\\): [Promise]\\> Executed before `run` hook.\n    Use it to prepare arguments or config for your tools. If it fails, Spire\n    stops futher hooks from being executed.\n  - `run` \\<[function]\\([Context]\\): [Promise]\\> Executed as the main logic of\n    the plugin. Use this hook to run the CLI tool or process long-running task.\n  - `teardown` \\<[function]\\([Context]\\): [Promise]\\> Executed after `run` hook,\n    even if it has failed. Use this hook to cleanup locally or to collect some\n    stats.\n  - `preuninstall` \\<[function]\\([Context]\\): [Promise]\\> Executed before\n    `yarn uninstall` or `npm uninstall`. Run it to cleanup external data.\n\nExample:\n\n```js\nmodule.exports = (spire, options) => {\n  return {\n    name: 'my-awesome-tool',\n    command: 'my-tool',\n    description: 'run my awesome tool',\n    async run({ logger }) {\n      logger.log('Hi from my awesome tool!');\n    },\n  };\n};\n```\n\nCheck [spire-plugin-clean], [spire-plugin-doctoc] and [spire-plugin-eslint] for\nmore plugin examples.\n\n### Migrating to Spire\n\n**Identify your tools:** To get started, gather a list of shared tools in your\nexisting projects. This will help to identify which plugins you'll need.\n\n**Pick preset or plugin:** Check if there's already a default or community\nplugin for that.\n[Search for `spire-plugin-*`](https://www.npmjs.com/search?q=spire-plugin-) on\nnpm for individual tools and\n[`spire-config-*`](https://www.npmjs.com/search?q=spire-config-) for specific\necosystems and tech stacks. In case if there's no suitable option for your,\ncheck on how to [write a custom plugin](#writing-a-plugin).\n\n**Make your own preset**: If you find that an existing or default preset works\nfor you, skip this step. If not, create a new module with a name matching\n`spire-config-*`. It can be specific for your personal projects, your company or\na tech stack. Check [writing a config](#writing-a-config) for instructions on\nhow to do this.\n\n**Migrate your projects**: Once you've got a preset ready, go through your\nprojects and [setup Spire](#quick-start) with it. Make sure to delete the\ndependencies it replaces. At this point you're done!\n\n### Using without Git\n\nAt the moment Spire has a hard dependency on a Git repository to resolve\nmonorepo project root. This most likely to be reviewed in the future, but\nmeanwhile it is part of the core, you can export `SKIP_PREFLIGHT_CHECK=true`\nenvironment variable to disable this check. The idea and name of this flag is\nborrowed from [create-react-app].\n\n### Using in monorepos\n\nIt is recommended to install Spire on the root level of a monorepo and run all\ncommands from there. The main motivation behind this is performance and\nconsistency reasons. You can still though run commands in an indivudual package.\nBelow is an example of how to run `spire lint` in a specific monorepo package:\n\n- With [yarn workspaces]:\n  ```sh\n  yarn workspace <pkg-name> spire lint\n  ```\n- With [lerna]:\n  ```sh\n  npx lerna --scope <pkg-name> exec spire lint\n  ```\n\n## API\n\n### CLI\n\nEach plugin can extend a list of available commands and their options. The list\nbelow only includes basic commands.\n\n- `npx spire --help` Prints the list of available commands.\n- `npx spire --version` Prints the current version of Spire.\n- `npx spire <cmd>` Runs a specific command defined by plugins.\n- `npx spire --debug <cmd>` Outputs additional debug information.\n- _(hidden)_ `npx spire hook <name>` Runs specific git or npm plugin hooks.\n  Available hooks are `postinstall`, `preuninstall`, `precommit` and\n  `postmerge`. Use this to test or debug your plugins.\n\n### `spire`\n\nSpire is an object which is passed as the first argument to both configs and\nplugins.\n\n- `spire`\n  - `setState` \\<[function]\\([Object]|[function]\\)\\> Sets state by merging it\n    with previous one (shallow).\n    - `state` \\<[Object]|[function]\\> New state as an object or a function which\n      recevies the previous state and returns an object. Usefull to avoid\n      `getState()` calls.\n  - `getState` \\<[function]\\(\\): [Object]\\> Returns current state.\n  - `hasFile` \\<[function]\\([string]\\): [Promise]\\<[boolean]\\>\\> Checks if\n    current projects contains specific file.\n  - `hasPackageProp` \\<[function]\\([string]\\): [Promise]\\<[boolean]\\>\\> Check if\n    current project's `package.json` contains specific prop.\n\n### `context`\n\nContext is an object which is passed as the first argument to plugin hooks. It's\ndesigned to be read-only. If you want to pass some data futher, consider using\n[`spire.setState` instead](#spire).\n\n- `context`\n  - `argv` \\<[Array]\\<[string]\\>\\> Array of arguments Spire was called with.\n    Defaults to `process.argv.slice(2)`.\n  - `cli` \\<[Object]\\> Instance of [yargs](http://yargs.js.org/) for adding\n    custom commands.\n  - `cwd` \\<[string]\\> Directory Spire is executed in. Defaults to\n    `process.cwd()`.\n  - `env` \\<[Object]\\> Set of environment variables. Defaults to `process.env`.\n  - `logger` \\<[Object]\\> Instance of\n    [Signale](https://github.com/klauscfhq/signale). Use `logger.debug()` to\n    print debug info which is only shown with `--debug` flag.\n  - `config` \\<[Object]\\> Parsed and normalised [config](#writing-a-config).\n  - `options` \\<[Object]\\> Parsed yargs options. Available only after `setup`\n    hook.\n\n## References\n\nThis project is inspired by the great work of JavaScript open source community\n(without particular order):\n\n- [Kent C. Dodds: Tools without config 🛠📦](https://blog.kentcdodds.com/automation-without-config-412ab5e47229)\n- [Dan Abramov: The Melting Pot of JavaScript](https://www.youtube.com/watch?v=nl30vWYKs9A)\n- [Jamie Kyle: Tools 4 Tools 4 Tools](https://www.youtube.com/watch?v=itI5xGyvtho)\n- [semantic-release](https://github.com/semantic-release/semantic-release)\n- [react-scripts](https://github.com/facebook/create-react-app/tree/next/packages/react-scripts)\n- [kcd-scripts](https://github.com/kentcdodds/kcd-scripts)\n- [bolt](https://github.com/boltpkg/bolt)\n\n## License\n\nMIT &copy; [ResearchGate](https://github.com/researchgate)\n\n[context]: #context\n[spire-config-default]:\n  https://github.com/researchgate/spire/blob/master/packages/spire-config-default\n[spire-plugin-yarn]:\n  https://github.com/researchgate/spire/blob/master/packages/spire-plugin-yarn\n[spire-plugin-clean]:\n  https://github.com/researchgate/spire/blob/master/packages/spire-plugin-clean\n[spire-plugin-doctoc]:\n  https://github.com/researchgate/spire/blob/master/packages/spire-plugin-doctoc\n[spire-plugin-eslint]:\n  https://github.com/researchgate/spire/blob/master/packages/spire-plugin-eslint\n[spire-plugin-semantic-release]:\n  https://github.com/researchgate/spire/blob/master/packages/spire-plugin-semantic-release\n[spire-plugin-lerna-release]:\n  https://github.com/researchgate/spire/blob/master/packages/spire-plugin-lerna-release\n[boolean]:\n  https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Boolean_type\n[string]:\n  https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type\n[array]:\n  https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array\n[object]:\n  https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object\n[function]:\n  https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function\n[promise]:\n  https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise\n[symbol]:\n  https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol\n[create-react-app]: https://github.com/facebook/create-react-app\n[yarn workspaces]: https://yarnpkg.com/lang/en/docs/workspaces/\n[lerna]: https://github.com/lerna/lerna\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/researchgate/spire/issues"},"homepage":"https://github.com/researchgate/spire#readme","_id":"spire@1.7.4-next.11","_nodeVersion":"10.16.3","_npmVersion":"lerna/3.15.0/node@v10.16.3+x64 (linux)","dist":{"integrity":"sha512-3K/KJsbj9DKesElrb9WVoMMqZb1l9puTrKgapEsvG2EsQ9UeAA//ylTTHjC/arW4jRXIHqod87wreMDwZQmiSw==","shasum":"debee857aa699b9d96fa4b746ff9e054b23c5cf7","tarball":"https://registry.npmjs.org/spire/-/spire-1.7.4-next.11.tgz","fileCount":19,"unpackedSize":35128,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdYG3dCRA9TVsSAnZWagAAX7gP/jtZxe5+jYQUDepN/ZSl\nmHnlttNc9CmmaVOWMKE68e/V1Jb6d0cLGz6ymnEFOZsJHEv1o1X4LpdWqzE9\n1ijl5SVG3Sm7S2xt87Decyq5A4uJgI32xW1j4w77SNfMm3tCzbyP/Z14X2L5\nA0swKbJYwaQJQZSS/EHhA8mFG7l6R1NURW6WyyCm7xtXWxfyOBH/1UvXOunF\n78LGtcf1J3e5Umddn3OG1gmVAiBoM64fb75zy49pNsZqNq8Y3xy0kXCvPX8B\naxc9XuDKAODcAcpg82hGazDPpQ74mTXmzX8NVfg0OlfGdHD7gbez6AtQXQw0\nqj6GiQ6WousDijOltv+V6HaHRCurHoa4WHAdiSl8kYwEYl4AT6bmZAph/qIO\ngWv9dgAknt1gbMkj+4Rk3zN56riCCYNCFlmUuSfNuqrGj2IXfpLqC87ao6mf\nUeEUcEuCG56ZccfWrffnyrDTyC63SHZ6ik0jn8xjU2vnhIypylGmt/N0X84f\niDKk7FxzhlQtPz38sZiz5U2/m09kKU2532d9nMq9eGCNNpUVIxxJxrKkhcSc\np2DcnM0CzmgL9nfziqTsXMW0NXJm7SyZV84YG45tNZLAzp4NBRAzG9TTQ9Gh\nSy7JV5uQdS2KsfTSNUSCtfnFP1/sbp12sreHnLXMpkYjPXXA6pfkxBZeaQyK\nx8QF\r\n=yE7T\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCKMwi95IeG7UEc7OpF3XYumJ8zhZK5TDehGAAKDnY4WQIhAP8h95pbDkfEF1BIVMF1SHRLf+k69ZucLagf5pfh0Kqq"}]},"maintainers":[{"email":"sergey@bekrin.me","name":"sbekrin"}],"_npmUser":{"name":"researchgate-bot","email":"sebastian.jerie@researchgate.net"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/spire_1.7.4-next.11_1566600668812_0.13594950971950892"},"_hasShrinkwrap":false},"1.7.4-next.17":{"name":"spire","version":"1.7.4-next.17","description":"Extensible CLI toolkit managment tool","main":"index.js","repository":{"type":"git","url":"git+https://github.com/researchgate/spire.git"},"author":{"name":"Sergey Bekrin","email":"sergey@bekrin.me","url":"https://bekrin.me"},"license":"MIT","bin":{"spire":"./bin/spire.js"},"engines":{"node":">=8.3"},"scripts":{"postinstall":"./bin/spire.js hook postinstall","preuninstall":"./bin/spire.js hook preuninstall"},"dependencies":{"cosmiconfig":"^5.2.0","fs-extra":"^8.1.0","import-from":"^3.0.0","invariant":"^2.2.4","pretty-format":"^24.7.0","signale":"^1.4.0","spire-config-default":"^1.7.3","yargs":"^14.0.0"},"devDependencies":{"spire-test-utils":"^1.7.1"},"prettier":"spire-plugin-prettier/config","gitHead":"4889465324b1796f9aaf3e13bfed8e80addbeea8","readme":"# 🗼 Spire\n\nExtensible JavaScript toolbox management.\n\n<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->\n\n- [Motivation](#motivation)\n- [Quick Start](#quick-start)\n- [Configuration](#configuration)\n  - [Using a Custom Preset](#using-a-custom-preset)\n  - [Using a Local Preset](#using-a-local-preset)\n  - [Passing Options](#passing-options)\n- [Guides](#guides)\n  - [Writing a Config](#writing-a-config)\n  - [Writing a Plugin](#writing-a-plugin)\n  - [Migrating to Spire](#migrating-to-spire)\n  - [Using without Git](#using-without-git)\n  - [Using in monorepos](#using-in-monorepos)\n- [API](#api)\n  - [CLI](#cli)\n  - [`spire`](#spire)\n  - [`context`](#context)\n- [References](#references)\n- [License](#license)\n\n<!-- END doctoc generated TOC please keep comment here to allow auto update -->\n\n## Motivation\n\n**Problem:** Maintaining tools and configurations for linting, testing and\nbuilding your code is hard. The more projects you have, the more time it takes\nto keep your setup consistent and up-to-date.\n\n**Solution:** Spire is a pluggable CLI tool which allows you to abstract all of\nyour tools and configurations into reusable plugins and presets. Think of it as\n“babel for infrastructure”.\n\n## Quick Start\n\n1. Install `spire`:\n\n```sh\n# yarn\nyarn add --dev spire\n\n# npm\nnpm install --save-dev spire\n```\n\n2. Start using in your project:\n\n```sh\n# npx\nnpx spire --help\n\n# yarn\nyarn spire --help\n```\n\n3. Depending on your tech stack, you can start using Spire as zero-config tool.\n   See [spire-config-default] for a list of default tools and\n   [configuration section](#configuration) for how to customise it.\n\n- _Using yarn? Consider installing [spire-plugin-yarn] for few power features._\n\n- _Want to have automated release w/ changelog generation? Check out\n  [spire-plugin-semantic-release] and [spire-plugin-lerna-release] for lerna\n  monorepos._\n\n## Configuration\n\nSpire is based on config presets, which is the same concept for tools like\n[Babel](https://babeljs.io/) and [ESLint](https://eslint.org/). Configs are a\nset of predefined plugins and their options. Configs can also extend a chain of\nother configs. By default, Spire is shipped with [spire-config-default].\n\n### Using a Custom Preset\n\nTo use your preferred configuration, install it as dev dependency and reference\nit by module name in [`extends` property](#writing-a-config). To extend multiple\nconfigs, provide it as an array. You can also use individual plugins along with\nconfigs with [`plugins` property](#writing-a-config).\n\n<details open>\n  <summary>via <code>package.json#spire</code> (recommended)</summary>\n\n```json\n{\n  \"name\": \"acme-project\",\n  \"devDependencies\": {\n    \"spire\": \"^1.0.0\",\n    \"spire-config-acme\": \"^1.0.0\"\n  },\n  \"spire\": {\n    \"extends\": \"spire-config-acme\"\n  }\n}\n```\n\n</details>\n\n<details>\n  <summary>via <code>spire.config.js</code></summary>\n\n```js\nmodule.exports = {\n  extends: 'spire-config-acme',\n};\n```\n\n</details>\n\n<details>\n  <summary>via <code>.spirerc</code></summary>\n\n```js\n{\n  \"extends\": \"spire-config-acme\",\n}\n```\n\n</details>\n\n### Using a Local Preset\n\n_Note: It is recommended to enable Local Presets only for development._\n\nYou can reference a Local Preset or plugin using `<rootDir>` placeholder which\npoints to the current project directory:\n\n```json\n{\n  \"spire\": {\n    \"extends\": \"<rootDir>/spire-config.js\",\n    \"plugins\": [\"<rootDir>/spire-plugin.js\"]\n  }\n}\n```\n\n### Passing Options\n\nIf the config preset or plugin you're using supports customisation, you can pass\noptions to it:\n\n```json\n{\n  \"spire\": {\n    \"extends\": [[\"spire-config-acme\", { \"fictional\": false }]],\n    \"plugins\": [[\"spire-plugin-acme\", { \"company\": true }]]\n  }\n}\n```\n\n## Guides\n\n### Writing a Config\n\nA Config is a module which exports a function returning an object.\n\n- `config` \\<[function]([Object], [Object])\\>\n  - `spire` \\<[Object]\\> Spire [API object](#spire).\n  - `options` \\<[Object]\\> User-provided config options.\n- returns: \\<[Object]\\>\n  - `extends` \\<[string]|\\<[Array]\\<[string]\\>\\>\\> Config or an array of config\n    presets to extend.\n  - `plugins` \\<[Array]\\<[string]\\>\\> Array of plugins to include.\n\nExample:\n\n```js\nmodule.exports = (spire, options) => {\n  return {\n    extends: ['spire-config-first', 'spire-config-second'],\n    plugins: ['spire-plugin'],\n  };\n};\n```\n\nYou can dynamically change the behaviour of your preset based on `options` or\n`spire` APIs, but it's recommended to keep it explicit. Check\n[spire-config-default](https://github.com/researchgate/spire/blob/master/packages/spire-config-default/index.js)\nfor a reference.\n\n### Writing a Plugin\n\nA Plugin is a key component of Spire. After it resolves the config, Spire\naccumulates all plugins in chronological order and runs them. A Plugin is a\nfunction returning an object:\n\n_Note: It is recommended to keep plugins scoped to a single feature or tool._\n\n- `plugin` \\<[function]([Object], [Object])\\>\n  - `spire` \\<[Object]\\> Spire [API object](#spire).\n  - `options` \\<[Object]\\> User-provided plugin options.\n- returns: \\<[Object]\\>\n  - `name` \\<[string]\\> Name of the plugin (recommended).\n  - `command` \\<[string]\\> Optional name of command. Leaving it empty will\n    ignore `run` hook completly.\n  - `description` \\<[string]\\> Optional human-readable command description.\n  - `preinstall` \\<[function]\\([Context]\\): [Promise]\\> Executed before\n    `yarn install` or `npm install`\n  - `postinstall` \\<[function]\\([Context]\\): [Promise]\\> Executed after\n    `yarn install` or `npm install`.\n  - `postmerge` \\<[function]\\([Context]\\): [Promise]\\> Executed on `git pull`.\n  - `precommit` \\<[function]\\([Context]\\): [Promise]\\> Executed on `git commit`.\n  - `setup` \\<[function]\\([Context]\\): [Promise]\\> Executed before `run` hook.\n    Use it to prepare arguments or config for your tools. If it fails, Spire\n    stops futher hooks from being executed.\n  - `run` \\<[function]\\([Context]\\): [Promise]\\> Executed as the main logic of\n    the plugin. Use this hook to run the CLI tool or process long-running task.\n  - `teardown` \\<[function]\\([Context]\\): [Promise]\\> Executed after `run` hook,\n    even if it has failed. Use this hook to cleanup locally or to collect some\n    stats.\n  - `preuninstall` \\<[function]\\([Context]\\): [Promise]\\> Executed before\n    `yarn uninstall` or `npm uninstall`. Run it to cleanup external data.\n\nExample:\n\n```js\nmodule.exports = (spire, options) => {\n  return {\n    name: 'my-awesome-tool',\n    command: 'my-tool',\n    description: 'run my awesome tool',\n    async run({ logger }) {\n      logger.log('Hi from my awesome tool!');\n    },\n  };\n};\n```\n\nCheck [spire-plugin-clean], [spire-plugin-doctoc] and [spire-plugin-eslint] for\nmore plugin examples.\n\n### Migrating to Spire\n\n**Identify your tools:** To get started, gather a list of shared tools in your\nexisting projects. This will help to identify which plugins you'll need.\n\n**Pick preset or plugin:** Check if there's already a default or community\nplugin for that.\n[Search for `spire-plugin-*`](https://www.npmjs.com/search?q=spire-plugin-) on\nnpm for individual tools and\n[`spire-config-*`](https://www.npmjs.com/search?q=spire-config-) for specific\necosystems and tech stacks. In case if there's no suitable option for your,\ncheck on how to [write a custom plugin](#writing-a-plugin).\n\n**Make your own preset**: If you find that an existing or default preset works\nfor you, skip this step. If not, create a new module with a name matching\n`spire-config-*`. It can be specific for your personal projects, your company or\na tech stack. Check [writing a config](#writing-a-config) for instructions on\nhow to do this.\n\n**Migrate your projects**: Once you've got a preset ready, go through your\nprojects and [setup Spire](#quick-start) with it. Make sure to delete the\ndependencies it replaces. At this point you're done!\n\n### Using without Git\n\nAt the moment Spire has a hard dependency on a Git repository to resolve\nmonorepo project root. This most likely to be reviewed in the future, but\nmeanwhile it is part of the core, you can export `SKIP_PREFLIGHT_CHECK=true`\nenvironment variable to disable this check. The idea and name of this flag is\nborrowed from [create-react-app].\n\n### Using in monorepos\n\nIt is recommended to install Spire on the root level of a monorepo and run all\ncommands from there. The main motivation behind this is performance and\nconsistency reasons. You can still though run commands in an indivudual package.\nBelow is an example of how to run `spire lint` in a specific monorepo package:\n\n- With [yarn workspaces]:\n  ```sh\n  yarn workspace <pkg-name> spire lint\n  ```\n- With [lerna]:\n  ```sh\n  npx lerna --scope <pkg-name> exec spire lint\n  ```\n\n## API\n\n### CLI\n\nEach plugin can extend a list of available commands and their options. The list\nbelow only includes basic commands.\n\n- `npx spire --help` Prints the list of available commands.\n- `npx spire --version` Prints the current version of Spire.\n- `npx spire <cmd>` Runs a specific command defined by plugins.\n- `npx spire --debug <cmd>` Outputs additional debug information.\n- _(hidden)_ `npx spire hook <name>` Runs specific git or npm plugin hooks.\n  Available hooks are `postinstall`, `preuninstall`, `precommit` and\n  `postmerge`. Use this to test or debug your plugins.\n\n### `spire`\n\nSpire is an object which is passed as the first argument to both configs and\nplugins.\n\n- `spire`\n  - `setState` \\<[function]\\([Object]|[function]\\)\\> Sets state by merging it\n    with previous one (shallow).\n    - `state` \\<[Object]|[function]\\> New state as an object or a function which\n      recevies the previous state and returns an object. Usefull to avoid\n      `getState()` calls.\n  - `getState` \\<[function]\\(\\): [Object]\\> Returns current state.\n  - `hasFile` \\<[function]\\([string]\\): [Promise]\\<[boolean]\\>\\> Checks if\n    current projects contains specific file.\n  - `hasPackageProp` \\<[function]\\([string]\\): [Promise]\\<[boolean]\\>\\> Check if\n    current project's `package.json` contains specific prop.\n\n### `context`\n\nContext is an object which is passed as the first argument to plugin hooks. It's\ndesigned to be read-only. If you want to pass some data futher, consider using\n[`spire.setState` instead](#spire).\n\n- `context`\n  - `argv` \\<[Array]\\<[string]\\>\\> Array of arguments Spire was called with.\n    Defaults to `process.argv.slice(2)`.\n  - `cli` \\<[Object]\\> Instance of [yargs](http://yargs.js.org/) for adding\n    custom commands.\n  - `cwd` \\<[string]\\> Directory Spire is executed in. Defaults to\n    `process.cwd()`.\n  - `env` \\<[Object]\\> Set of environment variables. Defaults to `process.env`.\n  - `logger` \\<[Object]\\> Instance of\n    [Signale](https://github.com/klauscfhq/signale). Use `logger.debug()` to\n    print debug info which is only shown with `--debug` flag.\n  - `config` \\<[Object]\\> Parsed and normalised [config](#writing-a-config).\n  - `options` \\<[Object]\\> Parsed yargs options. Available only after `setup`\n    hook.\n\n## References\n\nThis project is inspired by the great work of JavaScript open source community\n(without particular order):\n\n- [Kent C. Dodds: Tools without config 🛠📦](https://blog.kentcdodds.com/automation-without-config-412ab5e47229)\n- [Dan Abramov: The Melting Pot of JavaScript](https://www.youtube.com/watch?v=nl30vWYKs9A)\n- [Jamie Kyle: Tools 4 Tools 4 Tools](https://www.youtube.com/watch?v=itI5xGyvtho)\n- [semantic-release](https://github.com/semantic-release/semantic-release)\n- [react-scripts](https://github.com/facebook/create-react-app/tree/next/packages/react-scripts)\n- [kcd-scripts](https://github.com/kentcdodds/kcd-scripts)\n- [bolt](https://github.com/boltpkg/bolt)\n\n## License\n\nMIT &copy; [ResearchGate](https://github.com/researchgate)\n\n[context]: #context\n[spire-config-default]:\n  https://github.com/researchgate/spire/blob/master/packages/spire-config-default\n[spire-plugin-yarn]:\n  https://github.com/researchgate/spire/blob/master/packages/spire-plugin-yarn\n[spire-plugin-clean]:\n  https://github.com/researchgate/spire/blob/master/packages/spire-plugin-clean\n[spire-plugin-doctoc]:\n  https://github.com/researchgate/spire/blob/master/packages/spire-plugin-doctoc\n[spire-plugin-eslint]:\n  https://github.com/researchgate/spire/blob/master/packages/spire-plugin-eslint\n[spire-plugin-semantic-release]:\n  https://github.com/researchgate/spire/blob/master/packages/spire-plugin-semantic-release\n[spire-plugin-lerna-release]:\n  https://github.com/researchgate/spire/blob/master/packages/spire-plugin-lerna-release\n[boolean]:\n  https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Boolean_type\n[string]:\n  https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type\n[array]:\n  https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array\n[object]:\n  https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object\n[function]:\n  https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function\n[promise]:\n  https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise\n[symbol]:\n  https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol\n[create-react-app]: https://github.com/facebook/create-react-app\n[yarn workspaces]: https://yarnpkg.com/lang/en/docs/workspaces/\n[lerna]: https://github.com/lerna/lerna\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/researchgate/spire/issues"},"homepage":"https://github.com/researchgate/spire#readme","_id":"spire@1.7.4-next.17","_nodeVersion":"10.16.3","_npmVersion":"lerna/3.16.4/node@v10.16.3+x64 (linux)","dist":{"integrity":"sha512-fNUssA7OkR/rBYQKsvBnyQY7EZ3pS8XujAMogQW0TDHV/YnsHf0ohQLmKwnAhMP/ZWGbW3pVmkahAdFuVQ2Fhg==","shasum":"268379b78a376a00725b5e215ae2518f797d670c","tarball":"https://registry.npmjs.org/spire/-/spire-1.7.4-next.17.tgz","fileCount":19,"unpackedSize":35523,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdgMRQCRA9TVsSAnZWagAAHw8P/0C0/7SuI/CCheQtGcVc\njSD19ni+W+yo9PHytGyIuWC623Z7vmBbe2fIv1dJp7onGCkvVYArN5zMB6Th\npn3EmRSnCp3uJtIT7+bWy7A8oE7j/q52HzF1O9gJlyKJsGUWWblOynVNK98E\nARN2Qt6AN4V8+EuPcvZIwH+UBFKsqBZEdyQprDXGo7pRMhfFqmz4eA+QO2K7\nYleJixLYnLVuL9pKZVE4aYYfBferRmmObv6EDAme92zxaVTAeBzNB13LhWF/\nTbk82aW60N4doT0L4RNtHf8Bf/xJA/MX1Z8chVUqsQUGmomUsUX3bFXPOcgH\nu5E8GbnHI7A/OL6DU5x+45KDbCmCSg5oHZHHl53G1KG21ombjgCa7jBu9Fk/\ndf9AGn73Z2G2qwLnrhw7Z7lQXJ5yC+OP0h9dBCLVgd6v6NqU8fc7ib79aIds\nsCnb9xDSsDl53+mMSbHeoy0GKDYXcsEdS7BQZzKGqi1stbuwX6o4izGDGli5\nD/GgomvTC8B1SXiqE9BYzxPHReeMLVJoPzFg7J65YKYU53cTDuFD0wl4L27X\nDiLV2tgQyY+aRV2rgknSogxhBbi9UAAjmwyO/wjVXQjCmKMSR8t7owade5Py\n4DqP0QbAxUF+I1aWG/LuoIvr/ndWKv3pedhDp3R+byk7rNu1lXXf22dFmGO8\ni+WD\r\n=fzwm\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBxtuFZeyzYN6V61KSMSX/PC6CsINblc739Quk6asZZDAiEAub5sMUVIiIV9taCFV5VINqzSLyFekhCdP1gZARMOwUg="}]},"maintainers":[{"email":"sergey@bekrin.me","name":"sbekrin"}],"_npmUser":{"name":"researchgate-bot","email":"sebastian.jerie@researchgate.net"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/spire_1.7.4-next.17_1568719952022_0.46211866485811304"},"_hasShrinkwrap":false},"1.7.3":{"name":"spire","version":"1.7.3","description":"Extensible CLI toolkit managment tool","main":"index.js","repository":{"type":"git","url":"git+https://github.com/researchgate/spire.git"},"author":{"name":"Sergey Bekrin","email":"sergey@bekrin.me","url":"https://bekrin.me"},"license":"MIT","bin":{"spire":"./bin/spire.js"},"engines":{"node":">=8.3"},"scripts":{"postinstall":"./bin/spire.js hook postinstall","preuninstall":"./bin/spire.js hook preuninstall"},"dependencies":{"cosmiconfig":"^5.2.0","fs-extra":"^7.0.1","import-from":"^2.1.0","invariant":"^2.2.4","pretty-format":"^24.7.0","signale":"^1.4.0","spire-config-default":"^1.7.3","yargs":"^13.2.4"},"devDependencies":{"spire-test-utils":"^1.7.1"},"bugs":{"url":"https://github.com/researchgate/spire/issues"},"homepage":"https://github.com/researchgate/spire#readme","_id":"spire@1.7.3","_nodeVersion":"12.13.0","_npmVersion":"6.12.0","dist":{"integrity":"sha512-B0C0WJxeMAiBx5aA5noEYE5h0A21uE1y4YbF7ZhJfnd/XAV8nvOl3mcMuLix390+juXplmBqQc5XvaaFU9ihAQ==","shasum":"ab280a1c001c80dc167a0e2a0c8dc79b2d7b906a","tarball":"https://registry.npmjs.org/spire/-/spire-1.7.3.tgz","fileCount":18,"unpackedSize":33721,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdwWLdCRA9TVsSAnZWagAAqZkP/icTrp0f/B1a8wkaFHkM\nEdBYz9LDLMeBMk6lCOaIX//m3CmDly00EjTA7atHbJXggwhRuclsCiw4Lo+v\nzTyvb2viTAG/mBoDysXp72X6Pdje9DqSBLVeLoCdYCkpQsBh96V09c8ruWh3\nBer3KPKCTFztRH/hmv8QVcjXogEkUWiYorWGTzZv9TlxthfvDQJfXV62+pvb\n3bfNWGEXNeiHv1LX3ZJ7doDhNFEj6tmrIrVUuUhDlcb9SMw7NBA54pGeWfpp\nd4r/0hfyI5x930rkCOUC6FHXWSbTgegxz2XtAJlCrRcvIo2d2PZwzyf+sA1Q\ncvbBCxJCBSBJ1K2NLzZoafT/uxfb4QRlYLX2+J9yM8Uu37Daa9BDUahmALV4\nBqnBwexzZi7btHWtJfmxmyUdvQwGPbwb2gfaYhC+dOIEqujqaTrkZcQLUK0Z\nHQpZZb22kthOjzX08CxeOPVCBStHRNzwgq2dAMYA+LTtnw6lKBDtHVCho/qC\nfJfuQcB7LSBdRFrCzK/XI2GBTN67ESVIGk7L8KE7SSwnjoAuWN1BkFD2oRIT\nLOp9IfI9AEicHSWu+OKTOoGclVZgTPH6dpdyVyWELYabqhexs3npOf2H4qgb\ny7SGfCbzV6Zl3QmUnmZ6gFmgeQE8kUBndponPYhg+NQDl098K2Xw/hBTDNSA\nRiCq\r\n=holm\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCgG4+8xeEOH1len/hg3lB3pGwZuaQth7qTd6ZsjSHWwQIhAPEOmhzSotR7y7FiyVNPvPIc+mDMAvq5EXRO1nYS+TM9"}]},"maintainers":[{"email":"daniel@tschinder.de","name":"danez"},{"email":"justnvdm@gmail.com","name":"justinvdm"},{"email":"sebastian.jerie@researchgate.net","name":"researchgate-bot"},{"email":"sergey@bekrin.me","name":"sbekrin"},{"email":"info@weaintplastic.com","name":"weaintplastic"}],"_npmUser":{"name":"danez","email":"daniel@tschinder.de"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/spire_1.7.3_1572954843863_0.19846513006004995"},"_hasShrinkwrap":false},"1.8.0":{"name":"spire","version":"1.8.0","description":"Extensible CLI toolkit managment tool","main":"index.js","repository":{"type":"git","url":"git+https://github.com/researchgate/spire.git"},"author":{"name":"Sergey Bekrin","email":"sergey@bekrin.me","url":"https://bekrin.me"},"license":"MIT","bin":{"spire":"./bin/spire.js"},"engines":{"node":">=8.3"},"scripts":{"postinstall":"./bin/spire.js hook postinstall","preuninstall":"./bin/spire.js hook preuninstall"},"dependencies":{"cosmiconfig":"^5.2.0","fs-extra":"^8.1.0","import-from":"^3.0.0","invariant":"^2.2.4","pretty-format":"^24.7.0","signale":"^1.4.0","spire-config-default":"^1.8.0","yargs":"^13.2.4"},"devDependencies":{"spire-test-utils":"^1.8.0"},"gitHead":"61201d1828143875b3b4c699cffe80afde435e53","bugs":{"url":"https://github.com/researchgate/spire/issues"},"homepage":"https://github.com/researchgate/spire#readme","_id":"spire@1.8.0","_nodeVersion":"12.13.0","_npmVersion":"lerna/3.15.0/node@v12.13.0+x64 (darwin)","dist":{"integrity":"sha512-fVUx0LerQIiDXrJHge5ccSP1BR5Ic/EUcnu3t3VR0vnrAfTNDutdAwen++uPP49Ti5351EfOWAxOeA5Z6+n5Ow==","shasum":"98f43b11a71677a08bb0f2106dd86922316afcb2","tarball":"https://registry.npmjs.org/spire/-/spire-1.8.0.tgz","fileCount":19,"unpackedSize":36532,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdzB0ZCRA9TVsSAnZWagAAT9wP/AmH+Kd4+AkJQsd7OpbV\nsy3cCLbG9BYFSCab8PGuaCLo/CFIQ85Xye793h7/ZghYpNuZMKJYx1wDozW1\nTWH24FZe+ZoFrY5x434Ey30WlqI+/B161dJsFLZrGM7YSoB+gkKZOuZn57oo\ntkvxvUPCC7Al46pWlQdSwXwQ2FN6+xJK9xrhYiIMBDFXnU5w2q1zALFG35XC\nkd1msvzZYunk+MGunVCy9U3by9S++PBHQBS/ckCJBET5PxY58RC/sdGpSPaW\nWnTMH5skPF/+IqcHX0VG0QHh0Rzd4BH5LJ+QU+EcSaSq9avuMU6++HILVdXK\n5taIDIvGX8IvVE4BVYwzaM7SEuaQ0ruIBw/keDgkDRDjLE/TuwnCFwbAkCI1\nmO6g7YK7jfy8ztDvwMZHPANMwjergJGf5hVTYCpLxS+d4H3U22qSaG3nsqIN\nfgSNCMiaIirY0ICMNkWMxX/pnQCAFiF1PZOm5OwXAHWbuCzoTaJc9b3JtH4a\ntGWYjqH0mKbVWbatI3XpyqJEP1GQY1exszfTAt3lO9+sLBXCUifGaKxbnj3k\n1VoDKQ8QLnYhpSHXT0TqBFfC1v3pfCxPp1vnGPNhSNeFy+CZe+AVfEGUuyu3\nkbIXvgWUJNiWnwQqEsImRF/Vw4DcX+eqL4vB4eDTI0h4ZBQeD2HwtJ9qEK6q\nYbZ9\r\n=6kmH\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIAinMjkew+XOUH/JXZbsJaXYH48CJ/GW+ZqVO74KY/AgAiEAoJQUhsHqwQNwrO804v1UEAzycOjUStTDXUCF7vhXfhc="}]},"maintainers":[{"email":"daniel@tschinder.de","name":"danez"},{"email":"justnvdm@gmail.com","name":"justinvdm"},{"email":"sebastian.jerie@researchgate.net","name":"researchgate-bot"},{"email":"sergey@bekrin.me","name":"sbekrin"},{"email":"info@weaintplastic.com","name":"weaintplastic"}],"_npmUser":{"name":"danez","email":"daniel@tschinder.de"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/spire_1.8.0_1573657880970_0.6576153199268344"},"_hasShrinkwrap":false},"1.8.1":{"name":"spire","version":"1.8.1","description":"Extensible CLI toolkit managment tool","main":"index.js","repository":{"type":"git","url":"git+https://github.com/researchgate/spire.git"},"author":{"name":"Sergey Bekrin","email":"sergey@bekrin.me","url":"https://bekrin.me"},"license":"MIT","bin":{"spire":"./bin/spire.js"},"engines":{"node":">=8.3"},"scripts":{"postinstall":"./bin/spire.js hook postinstall","preuninstall":"./bin/spire.js hook preuninstall"},"dependencies":{"cosmiconfig":"^5.2.0","fs-extra":"^8.1.0","import-from":"^3.0.0","invariant":"^2.2.4","pretty-format":"^24.7.0","signale":"^1.4.0","spire-config-default":"^1.8.0","yargs":"^13.2.4"},"devDependencies":{"spire-test-utils":"^1.8.0"},"gitHead":"6562cce70f17c196d2622c131e04d9a97347a725","bugs":{"url":"https://github.com/researchgate/spire/issues"},"homepage":"https://github.com/researchgate/spire#readme","_id":"spire@1.8.1","_nodeVersion":"12.13.0","_npmVersion":"lerna/3.15.0/node@v12.13.0+x64 (darwin)","dist":{"integrity":"sha512-17cQ3py//hMUp0j7aa+H+1httau3I+ToWmsIBn8wq/E8Lr4YyokhGlEzGSX24RhnuUL28Ap8RobjXDgUimL1MQ==","shasum":"df91391ebc5e66ef9086c8df74524dc3bbe76194","tarball":"https://registry.npmjs.org/spire/-/spire-1.8.1.tgz","fileCount":19,"unpackedSize":36747,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdzCYxCRA9TVsSAnZWagAA1OQQAIybfwso7/VAfSq3NaWZ\n6ggDZyHspYr8HXa12lIrDUQRwlisDemQtRT2RtmEIjHfRl72BqejtKRre80H\nU5aUPbYuhm9Aq/52einToTygJ16N2qiET5EjlWX6N3mdAnokAM1KsIF5JmwK\n9x4T5Gtyq6R8T1Vd00vGLp5CW2eXoRl4OPKjG2nhg2yA2smzVJE4tN2vDQjB\nykP7KhyoScdSKZwKifyJca/8ltON2at02BV8BE/u/Hs1Vwh5bMEhnbmM7v0m\naPX/WKDmusLtpppJYHOUt1bBv9UAx0FuEkML1wN1/ROwyI6VLjtp3k9KzW4I\n6zylghXCABpZwcO9SSQy/QHB6wVpetVSjk/JHBMsl89DszARrWFyV1/0pQyc\nkZpWDZxzrAjyMaFmkQOXnOXDEZqdSo2oYLCVthapFuC4qC7AqtOtoCmIMfDd\nT53XSaoQbjFeyd4Wi0fPulyG+pHEWqbmsBz2B1bOKNWUYcItOV8YwTW9oBj4\niY1Roz5+90wQfrDoyc9igGm5Q2bfG7XkCGjyRqyKSHYjtztcEtnPVeGJ7vd4\nq1Dih5hKew2/xLpimUHSHGiJ+MZZX4E+BLqEZqqxHpMm+Q2xycXQ5Wt2ZTV2\nGRTsafh++xG3usXkFSD3BV/KhzNx6OvB8rivEiRmlnIFvt3MjMjb1PTr/rVi\n80cY\r\n=KcWc\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDgKtAMhlZD4dYx//MFvFhEVQs32gRZSvbZV+jfdr7zQAiEA70NvJSCWxvu8BuB9LcP5W7ZUmSRwR32r2q4O3jW6foM="}]},"maintainers":[{"email":"daniel@tschinder.de","name":"danez"},{"email":"justnvdm@gmail.com","name":"justinvdm"},{"email":"sebastian.jerie@researchgate.net","name":"researchgate-bot"},{"email":"sergey@bekrin.me","name":"sbekrin"},{"email":"info@weaintplastic.com","name":"weaintplastic"}],"_npmUser":{"name":"danez","email":"daniel@tschinder.de"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/spire_1.8.1_1573660208279_0.9194419464864643"},"_hasShrinkwrap":false},"1.7.4-next.32":{"name":"spire","version":"1.7.4-next.32","description":"Extensible CLI toolkit managment tool","main":"index.js","repository":{"type":"git","url":"git+https://github.com/researchgate/spire.git"},"author":{"name":"Sergey Bekrin","email":"sergey@bekrin.me","url":"https://bekrin.me"},"license":"MIT","bin":{"spire":"./bin/spire.js"},"engines":{"node":">=8.3"},"scripts":{"postinstall":"./bin/spire.js hook postinstall","preuninstall":"./bin/spire.js hook preuninstall"},"dependencies":{"cosmiconfig":"^5.2.0","fs-extra":"^8.1.0","import-from":"^3.0.0","invariant":"^2.2.4","pretty-format":"^24.7.0","signale":"^1.4.0","spire-config-default":"^1.8.0","yargs":"^14.2.0"},"devDependencies":{"spire-test-utils":"^1.8.0"},"prettier":"spire-plugin-prettier/config","gitHead":"af7183e1cd310747ae9d8e013dc44bd9d39d53ce","readme":"# 🗼 Spire\n\nExtensible JavaScript toolbox management.\n\n<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->\n\n- [Motivation](#motivation)\n- [Quick Start](#quick-start)\n- [Configuration](#configuration)\n  - [Using a Custom Preset](#using-a-custom-preset)\n  - [Using a Local Preset](#using-a-local-preset)\n  - [Passing Options](#passing-options)\n- [Guides](#guides)\n  - [Writing a Config](#writing-a-config)\n  - [Writing a Plugin](#writing-a-plugin)\n  - [Migrating to Spire](#migrating-to-spire)\n  - [Using without Git](#using-without-git)\n  - [Using in monorepos](#using-in-monorepos)\n- [API](#api)\n  - [CLI](#cli)\n  - [`spire`](#spire)\n  - [`context`](#context)\n- [References](#references)\n- [License](#license)\n\n<!-- END doctoc generated TOC please keep comment here to allow auto update -->\n\n## Motivation\n\n**Problem:** Maintaining tools and configurations for linting, testing and\nbuilding your code is hard. The more projects you have, the more time it takes\nto keep your setup consistent and up-to-date.\n\n**Solution:** Spire is a pluggable CLI tool which allows you to abstract all of\nyour tools and configurations into reusable plugins and presets. Think of it as\n“babel for infrastructure”.\n\n## Quick Start\n\n1. Install `spire`:\n\n```sh\n# yarn\nyarn add --dev spire\n\n# npm\nnpm install --save-dev spire\n```\n\n2. Start using in your project:\n\n```sh\n# npx\nnpx spire --help\n\n# yarn\nyarn spire --help\n```\n\n3. Depending on your tech stack, you can start using Spire as zero-config tool.\n   See [spire-config-default] for a list of default tools and\n   [configuration section](#configuration) for how to customise it.\n\n- _Using yarn? Consider installing [spire-plugin-yarn] for few power features._\n\n- _Want to have automated release w/ changelog generation? Check out\n  [spire-plugin-semantic-release] and [spire-plugin-lerna-release] for lerna\n  monorepos._\n\n## Configuration\n\nSpire is based on config presets, which is the same concept for tools like\n[Babel](https://babeljs.io/) and [ESLint](https://eslint.org/). Configs are a\nset of predefined plugins and their options. Configs can also extend a chain of\nother configs. By default, Spire is shipped with [spire-config-default].\n\n### Using a Custom Preset\n\nTo use your preferred configuration, install it as dev dependency and reference\nit by module name in [`extends` property](#writing-a-config). To extend multiple\nconfigs, provide it as an array. You can also use individual plugins along with\nconfigs with [`plugins` property](#writing-a-config).\n\n<details open>\n  <summary>via <code>package.json#spire</code> (recommended)</summary>\n\n```json\n{\n  \"name\": \"acme-project\",\n  \"devDependencies\": {\n    \"spire\": \"^1.0.0\",\n    \"spire-config-acme\": \"^1.0.0\"\n  },\n  \"spire\": {\n    \"extends\": \"spire-config-acme\"\n  }\n}\n```\n\n</details>\n\n<details>\n  <summary>via <code>spire.config.js</code></summary>\n\n```js\nmodule.exports = {\n  extends: 'spire-config-acme',\n};\n```\n\n</details>\n\n<details>\n  <summary>via <code>.spirerc</code></summary>\n\n```js\n{\n  \"extends\": \"spire-config-acme\",\n}\n```\n\n</details>\n\n### Using a Local Preset\n\n_Note: It is recommended to enable Local Presets only for development._\n\nYou can reference a Local Preset or plugin using `<rootDir>` placeholder which\npoints to the current project directory:\n\n```json\n{\n  \"spire\": {\n    \"extends\": \"<rootDir>/spire-config.js\",\n    \"plugins\": [\"<rootDir>/spire-plugin.js\"]\n  }\n}\n```\n\n### Passing Options\n\nIf the config preset or plugin you're using supports customisation, you can pass\noptions to it:\n\n```json\n{\n  \"spire\": {\n    \"extends\": [[\"spire-config-acme\", { \"fictional\": false }]],\n    \"plugins\": [[\"spire-plugin-acme\", { \"company\": true }]]\n  }\n}\n```\n\n## Guides\n\n### Writing a Config\n\nA Config is a module which exports a function returning an object.\n\n- `config` \\<[function]([Object], [Object])\\>\n  - `spire` \\<[Object]\\> Spire [API object](#spire).\n  - `options` \\<[Object]\\> User-provided config options.\n- returns: \\<[Object]\\>\n  - `extends` \\<[string]|\\<[Array]\\<[string]\\>\\>\\> Config or an array of config\n    presets to extend.\n  - `plugins` \\<[Array]\\<[string]\\>\\> Array of plugins to include.\n\nExample:\n\n```js\nmodule.exports = (spire, options) => {\n  return {\n    extends: ['spire-config-first', 'spire-config-second'],\n    plugins: ['spire-plugin'],\n  };\n};\n```\n\nYou can dynamically change the behaviour of your preset based on `options` or\n`spire` APIs, but it's recommended to keep it explicit. Check\n[spire-config-default](https://github.com/researchgate/spire/blob/master/packages/spire-config-default/index.js)\nfor a reference.\n\n### Writing a Plugin\n\nA Plugin is a key component of Spire. After it resolves the config, Spire\naccumulates all plugins in chronological order and runs them. A Plugin is a\nfunction returning an object:\n\n_Note: It is recommended to keep plugins scoped to a single feature or tool._\n\n- `plugin` \\<[function]([Object], [Object])\\>\n  - `spire` \\<[Object]\\> Spire [API object](#spire).\n  - `options` \\<[Object]\\> User-provided plugin options.\n- returns: \\<[Object]\\>\n  - `name` \\<[string]\\> Name of the plugin (recommended).\n  - `command` \\<[string]\\> Optional name of command. Leaving it empty will\n    ignore `run` hook completly.\n  - `description` \\<[string]\\> Optional human-readable command description.\n  - `preinstall` \\<[function]\\([Context]\\): [Promise]\\> Executed before\n    `yarn install` or `npm install`\n  - `postinstall` \\<[function]\\([Context]\\): [Promise]\\> Executed after\n    `yarn install` or `npm install`.\n  - `postmerge` \\<[function]\\([Context]\\): [Promise]\\> Executed on `git pull`.\n  - `precommit` \\<[function]\\([Context]\\): [Promise]\\> Executed on `git commit`.\n  - `setup` \\<[function]\\([Context]\\): [Promise]\\> Executed before `run` hook.\n    Use it to prepare arguments or config for your tools. If it fails, Spire\n    stops futher hooks from being executed.\n  - `run` \\<[function]\\([Context]\\): [Promise]\\> Executed as the main logic of\n    the plugin. Use this hook to run the CLI tool or process long-running task.\n  - `teardown` \\<[function]\\([Context]\\): [Promise]\\> Executed after `run` hook,\n    even if it has failed. Use this hook to cleanup locally or to collect some\n    stats.\n  - `preuninstall` \\<[function]\\([Context]\\): [Promise]\\> Executed before\n    `yarn uninstall` or `npm uninstall`. Run it to cleanup external data.\n\nExample:\n\n```js\nmodule.exports = (spire, options) => {\n  return {\n    name: 'my-awesome-tool',\n    command: 'my-tool',\n    description: 'run my awesome tool',\n    async run({ logger }) {\n      logger.log('Hi from my awesome tool!');\n    },\n  };\n};\n```\n\nCheck [spire-plugin-clean], [spire-plugin-doctoc] and [spire-plugin-eslint] for\nmore plugin examples.\n\n### Migrating to Spire\n\n**Identify your tools:** To get started, gather a list of shared tools in your\nexisting projects. This will help to identify which plugins you'll need.\n\n**Pick preset or plugin:** Check if there's already a default or community\nplugin for that.\n[Search for `spire-plugin-*`](https://www.npmjs.com/search?q=spire-plugin-) on\nnpm for individual tools and\n[`spire-config-*`](https://www.npmjs.com/search?q=spire-config-) for specific\necosystems and tech stacks. In case if there's no suitable option for your,\ncheck on how to [write a custom plugin](#writing-a-plugin).\n\n**Make your own preset**: If you find that an existing or default preset works\nfor you, skip this step. If not, create a new module with a name matching\n`spire-config-*`. It can be specific for your personal projects, your company or\na tech stack. Check [writing a config](#writing-a-config) for instructions on\nhow to do this.\n\n**Migrate your projects**: Once you've got a preset ready, go through your\nprojects and [setup Spire](#quick-start) with it. Make sure to delete the\ndependencies it replaces. At this point you're done!\n\n### Using without Git\n\nAt the moment Spire has a hard dependency on a Git repository to resolve\nmonorepo project root. This most likely to be reviewed in the future, but\nmeanwhile it is part of the core, you can export `SKIP_PREFLIGHT_CHECK=true`\nenvironment variable to disable this check. The idea and name of this flag is\nborrowed from [create-react-app].\n\n### Using in monorepos\n\nIt is recommended to install Spire on the root level of a monorepo and run all\ncommands from there. The main motivation behind this is performance and\nconsistency reasons. You can still though run commands in an indivudual package.\nBelow is an example of how to run `spire lint` in a specific monorepo package:\n\n- With [yarn workspaces]:\n  ```sh\n  yarn workspace <pkg-name> spire lint\n  ```\n- With [lerna]:\n  ```sh\n  npx lerna --scope <pkg-name> exec spire lint\n  ```\n\n## API\n\n### CLI\n\nEach plugin can extend a list of available commands and their options. The list\nbelow only includes basic commands.\n\n- `npx spire --help` Prints the list of available commands.\n- `npx spire --version` Prints the current version of Spire.\n- `npx spire <cmd>` Runs a specific command defined by plugins.\n- `npx spire --debug <cmd>` Outputs additional debug information.\n- _(hidden)_ `npx spire hook <name>` Runs specific git or npm plugin hooks.\n  Available hooks are `postinstall`, `preuninstall`, `precommit` and\n  `postmerge`. Use this to test or debug your plugins.\n\n### `spire`\n\nSpire is an object which is passed as the first argument to both configs and\nplugins.\n\n- `spire`\n  - `setState` \\<[function]\\([Object]|[function]\\)\\> Sets state by merging it\n    with previous one (shallow).\n    - `state` \\<[Object]|[function]\\> New state as an object or a function which\n      recevies the previous state and returns an object. Usefull to avoid\n      `getState()` calls.\n  - `getState` \\<[function]\\(\\): [Object]\\> Returns current state.\n  - `hasFile` \\<[function]\\([string]\\): [Promise]\\<[boolean]\\>\\> Checks if\n    current projects contains specific file.\n  - `hasPackageProp` \\<[function]\\([string]\\): [Promise]\\<[boolean]\\>\\> Check if\n    current project's `package.json` contains specific prop.\n\n### `context`\n\nContext is an object which is passed as the first argument to plugin hooks. It's\ndesigned to be read-only. If you want to pass some data futher, consider using\n[`spire.setState` instead](#spire).\n\n- `context`\n  - `argv` \\<[Array]\\<[string]\\>\\> Array of arguments Spire was called with.\n    Defaults to `process.argv.slice(2)`.\n  - `cli` \\<[Object]\\> Instance of [yargs](http://yargs.js.org/) for adding\n    custom commands.\n  - `cwd` \\<[string]\\> Directory Spire is executed in. Defaults to\n    `process.cwd()`.\n  - `env` \\<[Object]\\> Set of environment variables. Defaults to `process.env`.\n  - `logger` \\<[Object]\\> Instance of\n    [Signale](https://github.com/klauscfhq/signale). Use `logger.debug()` to\n    print debug info which is only shown with `--debug` flag.\n  - `config` \\<[Object]\\> Parsed and normalised [config](#writing-a-config).\n  - `options` \\<[Object]\\> Parsed yargs options. Available only after `setup`\n    hook.\n\n## References\n\nThis project is inspired by the great work of JavaScript open source community\n(without particular order):\n\n- [Kent C. Dodds: Tools without config 🛠📦](https://blog.kentcdodds.com/automation-without-config-412ab5e47229)\n- [Dan Abramov: The Melting Pot of JavaScript](https://www.youtube.com/watch?v=nl30vWYKs9A)\n- [Jamie Kyle: Tools 4 Tools 4 Tools](https://www.youtube.com/watch?v=itI5xGyvtho)\n- [semantic-release](https://github.com/semantic-release/semantic-release)\n- [react-scripts](https://github.com/facebook/create-react-app/tree/next/packages/react-scripts)\n- [kcd-scripts](https://github.com/kentcdodds/kcd-scripts)\n- [bolt](https://github.com/boltpkg/bolt)\n\n## License\n\nMIT &copy; [ResearchGate](https://github.com/researchgate)\n\n[context]: #context\n[spire-config-default]:\n  https://github.com/researchgate/spire/blob/master/packages/spire-config-default\n[spire-plugin-yarn]:\n  https://github.com/researchgate/spire/blob/master/packages/spire-plugin-yarn\n[spire-plugin-clean]:\n  https://github.com/researchgate/spire/blob/master/packages/spire-plugin-clean\n[spire-plugin-doctoc]:\n  https://github.com/researchgate/spire/blob/master/packages/spire-plugin-doctoc\n[spire-plugin-eslint]:\n  https://github.com/researchgate/spire/blob/master/packages/spire-plugin-eslint\n[spire-plugin-semantic-release]:\n  https://github.com/researchgate/spire/blob/master/packages/spire-plugin-semantic-release\n[spire-plugin-lerna-release]:\n  https://github.com/researchgate/spire/blob/master/packages/spire-plugin-lerna-release\n[boolean]:\n  https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Boolean_type\n[string]:\n  https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type\n[array]:\n  https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array\n[object]:\n  https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object\n[function]:\n  https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function\n[promise]:\n  https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise\n[symbol]:\n  https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol\n[create-react-app]: https://github.com/facebook/create-react-app\n[yarn workspaces]: https://yarnpkg.com/lang/en/docs/workspaces/\n[lerna]: https://github.com/lerna/lerna\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/researchgate/spire/issues"},"homepage":"https://github.com/researchgate/spire#readme","_id":"spire@1.7.4-next.32","_nodeVersion":"12.13.0","_npmVersion":"lerna/3.18.3/node@v12.13.0+x64 (linux)","dist":{"integrity":"sha512-4LzDZJPKOBDw58gA8sdL7Xnwzt7zjSf6EeLMeGYZDzuBCmQaVsUwh9cH7fWfe7GeZoxfBo2jT3C+ZgyQoiVTfg==","shasum":"0092ce35f4f2c2f5f47d3696d2dae2434ba65cef","tarball":"https://registry.npmjs.org/spire/-/spire-1.7.4-next.32.tgz","fileCount":19,"unpackedSize":37010,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdzCzgCRA9TVsSAnZWagAABBcQAIorg+hPAB/WxVuaX7qY\nhCvvVGREps9jiBsz3SW3WWYv1OdJQPkkZVB+td8b0UV13NiTpi0ZojCtQerM\nzYr+hwl2v/o4qwgKnQvdbsf5ZPNkbEU4PJ35uiA7EiONp27HSzJMIo4dwdcd\nKhWBHNd1Axg4Zeqo/bTfgr8tzUxh3NNrK98JEoGEs/4Y1GTe5K8woqUHkFY9\nDmNLAsZBAnCOP/+UR8MoP+Yn4Sb0SJaouzevHIUClFjQhCnazs2u75RHBlwB\n2mR/k0TRtHgiUr5u2CGY6hiZlW2QaADu9S84CEPi5KN8oxN4wcws52bDksSZ\n5nudAA5z00rRdojJSilz7lIwP0Jq0a0BW9LFXiWfq87iiMphqV4Oulw7wlvP\n5exjuJT3blmuflQ/DHcStw3kJmIM17RZ+ZrE6wtF8oKH9jP/VbA+Ud5Fvvz1\nec9v/6SBgNiFBZkdR+y7VkINNmFsoucC8WdxcU15L6+gA45ePf6a0CZgTFIl\nmpgwpLDW7vEyH0WyoXascCf8zYQ8vZLu3U8oOv3AY6p7RNHCsp5KMkq8XWsU\ntU8RUFEB/pOK+y3aUWlOVSBYtVJ+lJjBkls0sGItb0X2+1dW1/xq8vNo8t2Z\nHzOc1KLowAGciscHkFDnb7go7on/Px82oK2kxPJwgzPQPaTya4u08CfmT3LR\npKRU\r\n=xVU7\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIH8FmgN1eNf0t0xJ8ZvWe3tJoLY8ULcBSrCfdXS9UFUkAiBueIz+tz+UH9dKtnybxyGwTUlaL0te1dcrUcyvxVb+4Q=="}]},"maintainers":[{"email":"daniel@tschinder.de","name":"danez"},{"email":"justnvdm@gmail.com","name":"justinvdm"},{"email":"sebastian.jerie@researchgate.net","name":"researchgate-bot"},{"email":"sergey@bekrin.me","name":"sbekrin"},{"email":"info@weaintplastic.com","name":"weaintplastic"}],"_npmUser":{"name":"researchgate-bot","email":"stefan.hoth@researchgate.net"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/spire_1.7.4-next.32_1573661920228_0.29910601838002115"},"_hasShrinkwrap":false},"1.7.4-next.33":{"name":"spire","version":"1.7.4-next.33","description":"Extensible CLI toolkit managment tool","main":"index.js","repository":{"type":"git","url":"git+https://github.com/researchgate/spire.git"},"author":{"name":"Sergey Bekrin","email":"sergey@bekrin.me","url":"https://bekrin.me"},"license":"MIT","bin":{"spire":"./bin/spire.js"},"engines":{"node":">=8.3"},"scripts":{"postinstall":"./bin/spire.js hook postinstall","preuninstall":"./bin/spire.js hook preuninstall"},"dependencies":{"cosmiconfig":"^6.0.0","fs-extra":"^8.1.0","import-from":"^3.0.0","invariant":"^2.2.4","pretty-format":"^24.7.0","signale":"^1.4.0","spire-config-default":"^1.8.0","yargs":"^14.2.0"},"devDependencies":{"spire-test-utils":"^1.8.0"},"prettier":"spire-plugin-prettier/config","gitHead":"5b133997edb6f1fc4250e8859bf08737ea7dccbd","readme":"# 🗼 Spire\n\nExtensible JavaScript toolbox management.\n\n<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->\n\n- [Motivation](#motivation)\n- [Quick Start](#quick-start)\n- [Configuration](#configuration)\n  - [Using a Custom Preset](#using-a-custom-preset)\n  - [Using a Local Preset](#using-a-local-preset)\n  - [Passing Options](#passing-options)\n- [Guides](#guides)\n  - [Writing a Config](#writing-a-config)\n  - [Writing a Plugin](#writing-a-plugin)\n  - [Migrating to Spire](#migrating-to-spire)\n  - [Using without Git](#using-without-git)\n  - [Using in monorepos](#using-in-monorepos)\n- [API](#api)\n  - [CLI](#cli)\n  - [`spire`](#spire)\n  - [`context`](#context)\n- [References](#references)\n- [License](#license)\n\n<!-- END doctoc generated TOC please keep comment here to allow auto update -->\n\n## Motivation\n\n**Problem:** Maintaining tools and configurations for linting, testing and\nbuilding your code is hard. The more projects you have, the more time it takes\nto keep your setup consistent and up-to-date.\n\n**Solution:** Spire is a pluggable CLI tool which allows you to abstract all of\nyour tools and configurations into reusable plugins and presets. Think of it as\n“babel for infrastructure”.\n\n## Quick Start\n\n1. Install `spire`:\n\n```sh\n# yarn\nyarn add --dev spire\n\n# npm\nnpm install --save-dev spire\n```\n\n2. Start using in your project:\n\n```sh\n# npx\nnpx spire --help\n\n# yarn\nyarn spire --help\n```\n\n3. Depending on your tech stack, you can start using Spire as zero-config tool.\n   See [spire-config-default] for a list of default tools and\n   [configuration section](#configuration) for how to customise it.\n\n- _Using yarn? Consider installing [spire-plugin-yarn] for few power features._\n\n- _Want to have automated release w/ changelog generation? Check out\n  [spire-plugin-semantic-release] and [spire-plugin-lerna-release] for lerna\n  monorepos._\n\n## Configuration\n\nSpire is based on config presets, which is the same concept for tools like\n[Babel](https://babeljs.io/) and [ESLint](https://eslint.org/). Configs are a\nset of predefined plugins and their options. Configs can also extend a chain of\nother configs. By default, Spire is shipped with [spire-config-default].\n\n### Using a Custom Preset\n\nTo use your preferred configuration, install it as dev dependency and reference\nit by module name in [`extends` property](#writing-a-config). To extend multiple\nconfigs, provide it as an array. You can also use individual plugins along with\nconfigs with [`plugins` property](#writing-a-config).\n\n<details open>\n  <summary>via <code>package.json#spire</code> (recommended)</summary>\n\n```json\n{\n  \"name\": \"acme-project\",\n  \"devDependencies\": {\n    \"spire\": \"^1.0.0\",\n    \"spire-config-acme\": \"^1.0.0\"\n  },\n  \"spire\": {\n    \"extends\": \"spire-config-acme\"\n  }\n}\n```\n\n</details>\n\n<details>\n  <summary>via <code>spire.config.js</code></summary>\n\n```js\nmodule.exports = {\n  extends: 'spire-config-acme',\n};\n```\n\n</details>\n\n<details>\n  <summary>via <code>.spirerc</code></summary>\n\n```js\n{\n  \"extends\": \"spire-config-acme\",\n}\n```\n\n</details>\n\n### Using a Local Preset\n\n_Note: It is recommended to enable Local Presets only for development._\n\nYou can reference a Local Preset or plugin using `<rootDir>` placeholder which\npoints to the current project directory:\n\n```json\n{\n  \"spire\": {\n    \"extends\": \"<rootDir>/spire-config.js\",\n    \"plugins\": [\"<rootDir>/spire-plugin.js\"]\n  }\n}\n```\n\n### Passing Options\n\nIf the config preset or plugin you're using supports customisation, you can pass\noptions to it:\n\n```json\n{\n  \"spire\": {\n    \"extends\": [[\"spire-config-acme\", { \"fictional\": false }]],\n    \"plugins\": [[\"spire-plugin-acme\", { \"company\": true }]]\n  }\n}\n```\n\n## Guides\n\n### Writing a Config\n\nA Config is a module which exports a function returning an object.\n\n- `config` \\<[function]([Object], [Object])\\>\n  - `spire` \\<[Object]\\> Spire [API object](#spire).\n  - `options` \\<[Object]\\> User-provided config options.\n- returns: \\<[Object]\\>\n  - `extends` \\<[string]|\\<[Array]\\<[string]\\>\\>\\> Config or an array of config\n    presets to extend.\n  - `plugins` \\<[Array]\\<[string]\\>\\> Array of plugins to include.\n\nExample:\n\n```js\nmodule.exports = (spire, options) => {\n  return {\n    extends: ['spire-config-first', 'spire-config-second'],\n    plugins: ['spire-plugin'],\n  };\n};\n```\n\nYou can dynamically change the behaviour of your preset based on `options` or\n`spire` APIs, but it's recommended to keep it explicit. Check\n[spire-config-default](https://github.com/researchgate/spire/blob/master/packages/spire-config-default/index.js)\nfor a reference.\n\n### Writing a Plugin\n\nA Plugin is a key component of Spire. After it resolves the config, Spire\naccumulates all plugins in chronological order and runs them. A Plugin is a\nfunction returning an object:\n\n_Note: It is recommended to keep plugins scoped to a single feature or tool._\n\n- `plugin` \\<[function]([Object], [Object])\\>\n  - `spire` \\<[Object]\\> Spire [API object](#spire).\n  - `options` \\<[Object]\\> User-provided plugin options.\n- returns: \\<[Object]\\>\n  - `name` \\<[string]\\> Name of the plugin (recommended).\n  - `command` \\<[string]\\> Optional name of command. Leaving it empty will\n    ignore `run` hook completly.\n  - `description` \\<[string]\\> Optional human-readable command description.\n  - `preinstall` \\<[function]\\([Context]\\): [Promise]\\> Executed before\n    `yarn install` or `npm install`\n  - `postinstall` \\<[function]\\([Context]\\): [Promise]\\> Executed after\n    `yarn install` or `npm install`.\n  - `postmerge` \\<[function]\\([Context]\\): [Promise]\\> Executed on `git pull`.\n  - `precommit` \\<[function]\\([Context]\\): [Promise]\\> Executed on `git commit`.\n  - `setup` \\<[function]\\([Context]\\): [Promise]\\> Executed before `run` hook.\n    Use it to prepare arguments or config for your tools. If it fails, Spire\n    stops futher hooks from being executed.\n  - `run` \\<[function]\\([Context]\\): [Promise]\\> Executed as the main logic of\n    the plugin. Use this hook to run the CLI tool or process long-running task.\n  - `teardown` \\<[function]\\([Context]\\): [Promise]\\> Executed after `run` hook,\n    even if it has failed. Use this hook to cleanup locally or to collect some\n    stats.\n  - `preuninstall` \\<[function]\\([Context]\\): [Promise]\\> Executed before\n    `yarn uninstall` or `npm uninstall`. Run it to cleanup external data.\n\nExample:\n\n```js\nmodule.exports = (spire, options) => {\n  return {\n    name: 'my-awesome-tool',\n    command: 'my-tool',\n    description: 'run my awesome tool',\n    async run({ logger }) {\n      logger.log('Hi from my awesome tool!');\n    },\n  };\n};\n```\n\nCheck [spire-plugin-clean], [spire-plugin-doctoc] and [spire-plugin-eslint] for\nmore plugin examples.\n\n### Migrating to Spire\n\n**Identify your tools:** To get started, gather a list of shared tools in your\nexisting projects. This will help to identify which plugins you'll need.\n\n**Pick preset or plugin:** Check if there's already a default or community\nplugin for that.\n[Search for `spire-plugin-*`](https://www.npmjs.com/search?q=spire-plugin-) on\nnpm for individual tools and\n[`spire-config-*`](https://www.npmjs.com/search?q=spire-config-) for specific\necosystems and tech stacks. In case if there's no suitable option for your,\ncheck on how to [write a custom plugin](#writing-a-plugin).\n\n**Make your own preset**: If you find that an existing or default preset works\nfor you, skip this step. If not, create a new module with a name matching\n`spire-config-*`. It can be specific for your personal projects, your company or\na tech stack. Check [writing a config](#writing-a-config) for instructions on\nhow to do this.\n\n**Migrate your projects**: Once you've got a preset ready, go through your\nprojects and [setup Spire](#quick-start) with it. Make sure to delete the\ndependencies it replaces. At this point you're done!\n\n### Using without Git\n\nAt the moment Spire has a hard dependency on a Git repository to resolve\nmonorepo project root. This most likely to be reviewed in the future, but\nmeanwhile it is part of the core, you can export `SKIP_PREFLIGHT_CHECK=true`\nenvironment variable to disable this check. The idea and name of this flag is\nborrowed from [create-react-app].\n\n### Using in monorepos\n\nIt is recommended to install Spire on the root level of a monorepo and run all\ncommands from there. The main motivation behind this is performance and\nconsistency reasons. You can still though run commands in an indivudual package.\nBelow is an example of how to run `spire lint` in a specific monorepo package:\n\n- With [yarn workspaces]:\n  ```sh\n  yarn workspace <pkg-name> spire lint\n  ```\n- With [lerna]:\n  ```sh\n  npx lerna --scope <pkg-name> exec spire lint\n  ```\n\n## API\n\n### CLI\n\nEach plugin can extend a list of available commands and their options. The list\nbelow only includes basic commands.\n\n- `npx spire --help` Prints the list of available commands.\n- `npx spire --version` Prints the current version of Spire.\n- `npx spire <cmd>` Runs a specific command defined by plugins.\n- `npx spire --debug <cmd>` Outputs additional debug information.\n- _(hidden)_ `npx spire hook <name>` Runs specific git or npm plugin hooks.\n  Available hooks are `postinstall`, `preuninstall`, `precommit` and\n  `postmerge`. Use this to test or debug your plugins.\n\n### `spire`\n\nSpire is an object which is passed as the first argument to both configs and\nplugins.\n\n- `spire`\n  - `setState` \\<[function]\\([Object]|[function]\\)\\> Sets state by merging it\n    with previous one (shallow).\n    - `state` \\<[Object]|[function]\\> New state as an object or a function which\n      recevies the previous state and returns an object. Usefull to avoid\n      `getState()` calls.\n  - `getState` \\<[function]\\(\\): [Object]\\> Returns current state.\n  - `hasFile` \\<[function]\\([string]\\): [Promise]\\<[boolean]\\>\\> Checks if\n    current projects contains specific file.\n  - `hasPackageProp` \\<[function]\\([string]\\): [Promise]\\<[boolean]\\>\\> Check if\n    current project's `package.json` contains specific prop.\n\n### `context`\n\nContext is an object which is passed as the first argument to plugin hooks. It's\ndesigned to be read-only. If you want to pass some data futher, consider using\n[`spire.setState` instead](#spire).\n\n- `context`\n  - `argv` \\<[Array]\\<[string]\\>\\> Array of arguments Spire was called with.\n    Defaults to `process.argv.slice(2)`.\n  - `cli` \\<[Object]\\> Instance of [yargs](http://yargs.js.org/) for adding\n    custom commands.\n  - `cwd` \\<[string]\\> Directory Spire is executed in. Defaults to\n    `process.cwd()`.\n  - `env` \\<[Object]\\> Set of environment variables. Defaults to `process.env`.\n  - `logger` \\<[Object]\\> Instance of\n    [Signale](https://github.com/klauscfhq/signale). Use `logger.debug()` to\n    print debug info which is only shown with `--debug` flag.\n  - `config` \\<[Object]\\> Parsed and normalised [config](#writing-a-config).\n  - `options` \\<[Object]\\> Parsed yargs options. Available only after `setup`\n    hook.\n\n## References\n\nThis project is inspired by the great work of JavaScript open source community\n(without particular order):\n\n- [Kent C. Dodds: Tools without config 🛠📦](https://blog.kentcdodds.com/automation-without-config-412ab5e47229)\n- [Dan Abramov: The Melting Pot of JavaScript](https://www.youtube.com/watch?v=nl30vWYKs9A)\n- [Jamie Kyle: Tools 4 Tools 4 Tools](https://www.youtube.com/watch?v=itI5xGyvtho)\n- [semantic-release](https://github.com/semantic-release/semantic-release)\n- [react-scripts](https://github.com/facebook/create-react-app/tree/next/packages/react-scripts)\n- [kcd-scripts](https://github.com/kentcdodds/kcd-scripts)\n- [bolt](https://github.com/boltpkg/bolt)\n\n## License\n\nMIT &copy; [ResearchGate](https://github.com/researchgate)\n\n[context]: #context\n[spire-config-default]:\n  https://github.com/researchgate/spire/blob/master/packages/spire-config-default\n[spire-plugin-yarn]:\n  https://github.com/researchgate/spire/blob/master/packages/spire-plugin-yarn\n[spire-plugin-clean]:\n  https://github.com/researchgate/spire/blob/master/packages/spire-plugin-clean\n[spire-plugin-doctoc]:\n  https://github.com/researchgate/spire/blob/master/packages/spire-plugin-doctoc\n[spire-plugin-eslint]:\n  https://github.com/researchgate/spire/blob/master/packages/spire-plugin-eslint\n[spire-plugin-semantic-release]:\n  https://github.com/researchgate/spire/blob/master/packages/spire-plugin-semantic-release\n[spire-plugin-lerna-release]:\n  https://github.com/researchgate/spire/blob/master/packages/spire-plugin-lerna-release\n[boolean]:\n  https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Boolean_type\n[string]:\n  https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type\n[array]:\n  https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array\n[object]:\n  https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object\n[function]:\n  https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function\n[promise]:\n  https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise\n[symbol]:\n  https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol\n[create-react-app]: https://github.com/facebook/create-react-app\n[yarn workspaces]: https://yarnpkg.com/lang/en/docs/workspaces/\n[lerna]: https://github.com/lerna/lerna\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/researchgate/spire/issues"},"homepage":"https://github.com/researchgate/spire#readme","_id":"spire@1.7.4-next.33","_nodeVersion":"12.13.0","_npmVersion":"lerna/3.18.3/node@v12.13.0+x64 (linux)","dist":{"integrity":"sha512-xtN0RyMmfPvLIu7RN+enGoIxUtF96fPJlvqquj4xL0rPwDJfu2Exg5BXJs0msb9mwksU880SsVRtsLWQN3Yfdg==","shasum":"d2de4b71c31f771a866faa3696299430b72a3308","tarball":"https://registry.npmjs.org/spire/-/spire-1.7.4-next.33.tgz","fileCount":19,"unpackedSize":37014,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdzDcCCRA9TVsSAnZWagAAuDEP/1wKb4qfg3if/wpnGtJu\n8+FHyLrrvyNmK7UPbEE8+gCFrt3+Mr7DVeZNOQ7Whqi/BocjlfKiy558YFUd\n+3gA35xJFpzQ2/64syG100lfXnnQLUivB9NKyUORLd9FJUJ3fXrG3f7RcO7n\nCNkaHTUzo4R3KCqynYmW6f5ZNTh8cJhlUOLi2ECz/TbH10pHOWfWr2PkGjd2\nq18rtgT9tpItb177DiEHNxB/hnUtpUsi/XMjPimAx9GD0ysBcTBfmS5uhQAM\n3ezBGJu+hwy4+fvRb7NOS0SEie8UUzzoSu/8VJvgv0WQzXGCsQFzkIiM/LdH\nL7VJ1djkU2VPecmPYswhfRnZwg04xDxKHw2Ss6zEzVspABE+8NgqjEWjWW/n\nzzFL2VFckQH4V5NUlba2bwLXQq0AaXtcH1eoRUi17HKL7mOYdS9UQ8qugOEL\nHl1ad2GWaJTpyf+2DeTdE0EZN9UPomr3vr3Svkmjcy9EWP6S7kkn7pc7dX7N\nIORm94Po+s2b0tokkUUYMg7i9/hw2mzgG47qy9fD66raDx7qnteLvoqWjf3r\nMupJFolfqjAiCuS133G2tw5guQwY6PSM+6wtSTQQl27rHElkxTMjOKJPdn1S\nOnW7uDkVWpe3EUV3qsOlKA5M2aW2dXoR48bdfyyeSxhoxa/Pzf3Liy+nZMkO\nIHza\r\n=jjcF\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIF/WifIMCjMq+BWVI/x1yAMdSKLOz4nz7ry+s2osu0w9AiEAvg/pMxodZhDp/MFEcMASFvu9td0YwTxiKj3xrk8DHj8="}]},"maintainers":[{"email":"daniel@tschinder.de","name":"danez"},{"email":"justnvdm@gmail.com","name":"justinvdm"},{"email":"sebastian.jerie@researchgate.net","name":"researchgate-bot"},{"email":"sergey@bekrin.me","name":"sbekrin"},{"email":"info@weaintplastic.com","name":"weaintplastic"}],"_npmUser":{"name":"researchgate-bot","email":"stefan.hoth@researchgate.net"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/spire_1.7.4-next.33_1573664513718_0.9638184365984421"},"_hasShrinkwrap":false},"1.8.2":{"name":"spire","version":"1.8.2","description":"Extensible CLI toolkit managment tool","main":"index.js","repository":{"type":"git","url":"git+https://github.com/researchgate/spire.git"},"author":{"name":"Sergey Bekrin","email":"sergey@bekrin.me","url":"https://bekrin.me"},"license":"MIT","bin":{"spire":"./bin/spire.js"},"engines":{"node":">=8.3"},"scripts":{"postinstall":"./bin/spire.js hook postinstall","preuninstall":"./bin/spire.js hook preuninstall"},"dependencies":{"cosmiconfig":"^5.2.0","fs-extra":"^8.1.0","import-from":"^3.0.0","invariant":"^2.2.4","pretty-format":"^24.7.0","signale":"^1.4.0","spire-config-default":"^1.8.2","yargs":"^13.2.4"},"devDependencies":{"spire-test-utils":"^1.8.2"},"gitHead":"0e1b14ffc0b9425011fa8fdb808d2eb5f2520f00","bugs":{"url":"https://github.com/researchgate/spire/issues"},"homepage":"https://github.com/researchgate/spire#readme","_id":"spire@1.8.2","_nodeVersion":"12.13.0","_npmVersion":"lerna/3.15.0/node@v12.13.0+x64 (darwin)","dist":{"integrity":"sha512-mtZmaZEC7nNe3+Gsm61rQ3mJqMfQjeC6bdeGWnuhJhsyaDWv2ZzgjD7gSr8IrutFimZ7KSSa92Zsn+6L2+B/Xg==","shasum":"68c278f98dc77949e60cb11b6362988e8a6e323c","tarball":"https://registry.npmjs.org/spire/-/spire-1.8.2.tgz","fileCount":19,"unpackedSize":37063,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdzo0BCRA9TVsSAnZWagAAp1sP/ibeahoboK+OlRamBofg\nIMl7BPl8H7ArWogsgY0bi8memxP/cY+cCag/73N5OwmgVz4errbMiRt4dDKe\nhvfuE2QOY7wBnHEbY18VDznPK3HO6GxLyaY6XYOqrdgeMfH6LP5wlVneny67\n/+wL0ib2vENNC77mmHKNI86Go51e07ykiEI66a0zE1FYS+b1iFrk0uZSeqhg\n4To4JrD6RKoWSTN1YvqX40e6z2xXl4NC4tQDegi4Ou0Hh6GGO+7N2zazijAv\naoq0/mRRzUrNQPPLMG8UV2x+bAT8e+ogicsAYuAfNfHB4MCwC8pW+30SfT4K\nDk2YL6byGkUzqD1WXvlXjP00PIZrcVZ2AnD2JdeAqWLTOjdYmR4QmGkmQMYQ\nugje8+POKtUmMhUVXXeVgV8XgVyVyaTODDitwdCWEkOkMYd78c9IfU1zHyvb\nIOzcuCwQKrFOAc1pYU1PBFWvIawn3I7rfhR/4WZR/iuq7RH/1mTZxJvSOxUT\nbSCYCwkbCxq9OrzWKJHCvHGo93ieSCqCU1wek9ue1uDEaz1p11DbGJ21ESl9\n7nvkI12O1c3RH7rCZhgKB3FZfxLYCgALsEpWCKvD044vAXmdGG9YXtrqLdcs\nloafNhnT48afkg6bvDWFiAMqoAdAWrHcuvmCqT4YQblSwCONNwNUlBYzHCU1\nihYI\r\n=EsHV\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDvXmqul6JVqYZGZROjp+nwjaLCTpQJzxHEk8PX10fVMwIhAMhpo5tOurlilCy6pZIQAmMT6RuI9BWGsFr5x2NtXqLC"}]},"maintainers":[{"email":"daniel@tschinder.de","name":"danez"},{"email":"justnvdm@gmail.com","name":"justinvdm"},{"email":"sebastian.jerie@researchgate.net","name":"researchgate-bot"},{"email":"sergey@bekrin.me","name":"sbekrin"},{"email":"info@weaintplastic.com","name":"weaintplastic"}],"_npmUser":{"name":"danez","email":"daniel@tschinder.de"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/spire_1.8.2_1573817601470_0.7149450404869482"},"_hasShrinkwrap":false},"1.8.3":{"name":"spire","version":"1.8.3","description":"Extensible CLI toolkit managment tool","main":"index.js","repository":{"type":"git","url":"git+https://github.com/researchgate/spire.git"},"author":{"name":"Sergey Bekrin","email":"sergey@bekrin.me","url":"https://bekrin.me"},"license":"MIT","bin":{"spire":"./bin/spire.js"},"engines":{"node":">=8.3"},"scripts":{"postinstall":"./bin/spire.js hook postinstall","preuninstall":"./bin/spire.js hook preuninstall"},"dependencies":{"cosmiconfig":"^5.2.0","fs-extra":"^8.1.0","import-from":"^3.0.0","invariant":"^2.2.4","pretty-format":"^24.7.0","signale":"^1.4.0","spire-config-default":"^1.8.3","yargs":"^13.2.4"},"devDependencies":{"spire-test-utils":"^1.8.2"},"gitHead":"f4edac615eada7a03ae4e29146c67449990f3b16","bugs":{"url":"https://github.com/researchgate/spire/issues"},"homepage":"https://github.com/researchgate/spire#readme","_id":"spire@1.8.3","_nodeVersion":"12.13.0","_npmVersion":"lerna/3.15.0/node@v12.13.0+x64 (darwin)","dist":{"integrity":"sha512-usw55/3HgFtJxYCeqWpRr+YZKF50ztkSg+lsK5YI1lSiv2eQIQ1i7D2DZqRsQE7Pu0DPStYmcEWKaOp3AkcEOg==","shasum":"b1928f2abddafcedf73d66283bd5f9bd09d06d52","tarball":"https://registry.npmjs.org/spire/-/spire-1.8.3.tgz","fileCount":19,"unpackedSize":37202,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdzpD5CRA9TVsSAnZWagAA2UwP/3UgN0bU9L4mLh07TdUa\nwUJ8jjDn+Cv07Fr8vDZOzX+0i/XinEuhMtvxnmrVul7nWUXYRegmwJRPeKwR\nAohJt7eiDfJJvUO9TB/wZbMwDoJfYxeWZC3HuhWen1KwHsvb4KmVxeKpvNou\nBaTzG0fraR6bB7edesKLsNKRvTyqar6sRVB0AC80CxePkC1ESw5QoGgyWtez\no9llcZEGeNDX/aA7P9Khh9D4gbAO+NtDKhsPFsj7hJuugWdT03N4XDQDLPC0\nWHHncij/z83Bcpl6y8rG4+oiG9j4QAPIzVvvHCl6G1v3n3Yezv/NXZzJe11l\n9C/okOTjFCIOx7b9pRy/sSrzfNjmdjDXMbJ+yZ+miY7l2ob46QjnL7w0JHwY\njkxqpWTJZq4l3xM5zp+CZggIyaZG+Dl4g+hAZyjDHSt2DuWehEfICJNfqVV7\nIvr8vk6WR9t1IAZxJmv2q2MuXrt1C62ktm/MIczMvDEww9Uw8p4a1j9n7yu+\nC4UaY5BqGLkWCHi1cz3jIVrSJl4E2fZyIIpKZRhLHgiq3cgBeMVT88hdJ8yo\nrt0DLxwqaIZparLwkJisA3HOAX0WlVFhiOpXyYP/zB2soQqvpIuuyqJRPkSF\nNZiPCPaWaUBvqQ6KPXPqCNnsBszlahUNGZbEn7wTPXc/WHjgvNBX2NMbAkq4\nbROq\r\n=tOt5\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICrEGri9d8GwO21m0RIj8THd6z26mCqy0SaNjowI1iFBAiEAxzG/Kpzqdk+petdfNBVk/RsR5wwDU7KTBPw7ZJEgBME="}]},"maintainers":[{"email":"daniel@tschinder.de","name":"danez"},{"email":"justnvdm@gmail.com","name":"justinvdm"},{"email":"sebastian.jerie@researchgate.net","name":"researchgate-bot"},{"email":"sergey@bekrin.me","name":"sbekrin"},{"email":"info@weaintplastic.com","name":"weaintplastic"}],"_npmUser":{"name":"danez","email":"daniel@tschinder.de"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/spire_1.8.3_1573818616730_0.00863135411486815"},"_hasShrinkwrap":false},"1.8.4-next.27":{"name":"spire","version":"1.8.4-next.27","description":"Extensible CLI toolkit managment tool","main":"index.js","repository":{"type":"git","url":"git+https://github.com/researchgate/spire.git"},"author":{"name":"Sergey Bekrin","email":"sergey@bekrin.me","url":"https://bekrin.me"},"license":"MIT","bin":{"spire":"./bin/spire.js"},"engines":{"node":">=8.3"},"scripts":{"postinstall":"./bin/spire.js hook postinstall","preuninstall":"./bin/spire.js hook preuninstall"},"dependencies":{"cosmiconfig":"^6.0.0","fs-extra":"^8.1.0","import-from":"^3.0.0","invariant":"^2.2.4","pretty-format":"^24.7.0","signale":"^1.4.0","spire-config-default":"^1.8.4-next.27+5a31a90","yargs":"^14.2.0"},"devDependencies":{"spire-test-utils":"^1.8.4-next.27+5a31a90"},"prettier":"spire-plugin-prettier/config","gitHead":"5a31a909fb1f8f99b06a4490a1fd668719196e67","readme":"# 🗼 Spire\n\nExtensible JavaScript toolbox management.\n\n<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->\n\n- [Motivation](#motivation)\n- [Quick Start](#quick-start)\n- [Configuration](#configuration)\n  - [Using a Custom Preset](#using-a-custom-preset)\n  - [Using a Local Preset](#using-a-local-preset)\n  - [Passing Options](#passing-options)\n- [Guides](#guides)\n  - [Writing a Config](#writing-a-config)\n  - [Writing a Plugin](#writing-a-plugin)\n  - [Migrating to Spire](#migrating-to-spire)\n  - [Using without Git](#using-without-git)\n  - [Using in monorepos](#using-in-monorepos)\n- [API](#api)\n  - [CLI](#cli)\n  - [`spire`](#spire)\n  - [`context`](#context)\n- [References](#references)\n- [License](#license)\n\n<!-- END doctoc generated TOC please keep comment here to allow auto update -->\n\n## Motivation\n\n**Problem:** Maintaining tools and configurations for linting, testing and\nbuilding your code is hard. The more projects you have, the more time it takes\nto keep your setup consistent and up-to-date.\n\n**Solution:** Spire is a pluggable CLI tool which allows you to abstract all of\nyour tools and configurations into reusable plugins and presets. Think of it as\n“babel for infrastructure”.\n\n## Quick Start\n\n1. Install `spire`:\n\n```sh\n# yarn\nyarn add --dev spire\n\n# npm\nnpm install --save-dev spire\n```\n\n2. Start using in your project:\n\n```sh\n# npx\nnpx spire --help\n\n# yarn\nyarn spire --help\n```\n\n3. Depending on your tech stack, you can start using Spire as zero-config tool.\n   See [spire-config-default] for a list of default tools and\n   [configuration section](#configuration) for how to customise it.\n\n- _Using yarn? Consider installing [spire-plugin-yarn] for few power features._\n\n- _Want to have automated release w/ changelog generation? Check out\n  [spire-plugin-semantic-release] and [spire-plugin-lerna-release] for lerna\n  monorepos._\n\n## Configuration\n\nSpire is based on config presets, which is the same concept for tools like\n[Babel](https://babeljs.io/) and [ESLint](https://eslint.org/). Configs are a\nset of predefined plugins and their options. Configs can also extend a chain of\nother configs. By default, Spire is shipped with [spire-config-default].\n\n### Using a Custom Preset\n\nTo use your preferred configuration, install it as dev dependency and reference\nit by module name in [`extends` property](#writing-a-config). To extend multiple\nconfigs, provide it as an array. You can also use individual plugins along with\nconfigs with [`plugins` property](#writing-a-config).\n\n<details open>\n  <summary>via <code>package.json#spire</code> (recommended)</summary>\n\n```json\n{\n  \"name\": \"acme-project\",\n  \"devDependencies\": {\n    \"spire\": \"^1.0.0\",\n    \"spire-config-acme\": \"^1.0.0\"\n  },\n  \"spire\": {\n    \"extends\": \"spire-config-acme\"\n  }\n}\n```\n\n</details>\n\n<details>\n  <summary>via <code>spire.config.js</code></summary>\n\n```js\nmodule.exports = {\n  extends: 'spire-config-acme',\n};\n```\n\n</details>\n\n<details>\n  <summary>via <code>.spirerc</code></summary>\n\n```js\n{\n  \"extends\": \"spire-config-acme\",\n}\n```\n\n</details>\n\n### Using a Local Preset\n\n_Note: It is recommended to enable Local Presets only for development._\n\nYou can reference a Local Preset or plugin using `<rootDir>` placeholder which\npoints to the current project directory:\n\n```json\n{\n  \"spire\": {\n    \"extends\": \"<rootDir>/spire-config.js\",\n    \"plugins\": [\"<rootDir>/spire-plugin.js\"]\n  }\n}\n```\n\n### Passing Options\n\nIf the config preset or plugin you're using supports customisation, you can pass\noptions to it:\n\n```json\n{\n  \"spire\": {\n    \"extends\": [[\"spire-config-acme\", { \"fictional\": false }]],\n    \"plugins\": [[\"spire-plugin-acme\", { \"company\": true }]]\n  }\n}\n```\n\n## Guides\n\n### Writing a Config\n\nA Config is a module which exports a function returning an object.\n\n- `config` \\<[function]([Object], [Object])\\>\n  - `spire` \\<[Object]\\> Spire [API object](#spire).\n  - `options` \\<[Object]\\> User-provided config options.\n- returns: \\<[Object]\\>\n  - `extends` \\<[string]|\\<[Array]\\<[string]\\>\\>\\> Config or an array of config\n    presets to extend.\n  - `plugins` \\<[Array]\\<[string]\\>\\> Array of plugins to include.\n\nExample:\n\n```js\nmodule.exports = (spire, options) => {\n  return {\n    extends: ['spire-config-first', 'spire-config-second'],\n    plugins: ['spire-plugin'],\n  };\n};\n```\n\nYou can dynamically change the behaviour of your preset based on `options` or\n`spire` APIs, but it's recommended to keep it explicit. Check\n[spire-config-default](https://github.com/researchgate/spire/blob/master/packages/spire-config-default/index.js)\nfor a reference.\n\n### Writing a Plugin\n\nA Plugin is a key component of Spire. After it resolves the config, Spire\naccumulates all plugins in chronological order and runs them. A Plugin is a\nfunction returning an object:\n\n_Note: It is recommended to keep plugins scoped to a single feature or tool._\n\n- `plugin` \\<[function]([Object], [Object])\\>\n  - `spire` \\<[Object]\\> Spire [API object](#spire).\n  - `options` \\<[Object]\\> User-provided plugin options.\n- returns: \\<[Object]\\>\n  - `name` \\<[string]\\> Name of the plugin (recommended).\n  - `command` \\<[string]\\> Optional name of command. Leaving it empty will\n    ignore `run` hook completly.\n  - `description` \\<[string]\\> Optional human-readable command description.\n  - `preinstall` \\<[function]\\([Context]\\): [Promise]\\> Executed before\n    `yarn install` or `npm install`\n  - `postinstall` \\<[function]\\([Context]\\): [Promise]\\> Executed after\n    `yarn install` or `npm install`.\n  - `postmerge` \\<[function]\\([Context]\\): [Promise]\\> Executed on `git pull`.\n  - `precommit` \\<[function]\\([Context]\\): [Promise]\\> Executed on `git commit`.\n  - `setup` \\<[function]\\([Context]\\): [Promise]\\> Executed before `run` hook.\n    Use it to prepare arguments or config for your tools. If it fails, Spire\n    stops futher hooks from being executed.\n  - `run` \\<[function]\\([Context]\\): [Promise]\\> Executed as the main logic of\n    the plugin. Use this hook to run the CLI tool or process long-running task.\n  - `teardown` \\<[function]\\([Context]\\): [Promise]\\> Executed after `run` hook,\n    even if it has failed. Use this hook to cleanup locally or to collect some\n    stats.\n  - `preuninstall` \\<[function]\\([Context]\\): [Promise]\\> Executed before\n    `yarn uninstall` or `npm uninstall`. Run it to cleanup external data.\n\nExample:\n\n```js\nmodule.exports = (spire, options) => {\n  return {\n    name: 'my-awesome-tool',\n    command: 'my-tool',\n    description: 'run my awesome tool',\n    async run({ logger }) {\n      logger.log('Hi from my awesome tool!');\n    },\n  };\n};\n```\n\nCheck [spire-plugin-clean], [spire-plugin-doctoc] and [spire-plugin-eslint] for\nmore plugin examples.\n\n### Migrating to Spire\n\n**Identify your tools:** To get started, gather a list of shared tools in your\nexisting projects. This will help to identify which plugins you'll need.\n\n**Pick preset or plugin:** Check if there's already a default or community\nplugin for that.\n[Search for `spire-plugin-*`](https://www.npmjs.com/search?q=spire-plugin-) on\nnpm for individual tools and\n[`spire-config-*`](https://www.npmjs.com/search?q=spire-config-) for specific\necosystems and tech stacks. In case if there's no suitable option for your,\ncheck on how to [write a custom plugin](#writing-a-plugin).\n\n**Make your own preset**: If you find that an existing or default preset works\nfor you, skip this step. If not, create a new module with a name matching\n`spire-config-*`. It can be specific for your personal projects, your company or\na tech stack. Check [writing a config](#writing-a-config) for instructions on\nhow to do this.\n\n**Migrate your projects**: Once you've got a preset ready, go through your\nprojects and [setup Spire](#quick-start) with it. Make sure to delete the\ndependencies it replaces. At this point you're done!\n\n### Using without Git\n\nAt the moment Spire has a hard dependency on a Git repository to resolve\nmonorepo project root. This most likely to be reviewed in the future, but\nmeanwhile it is part of the core, you can export `SKIP_PREFLIGHT_CHECK=true`\nenvironment variable to disable this check. The idea and name of this flag is\nborrowed from [create-react-app].\n\n### Using in monorepos\n\nIt is recommended to install Spire on the root level of a monorepo and run all\ncommands from there. The main motivation behind this is performance and\nconsistency reasons. You can still though run commands in an indivudual package.\nBelow is an example of how to run `spire lint` in a specific monorepo package:\n\n- With [yarn workspaces]:\n  ```sh\n  yarn workspace <pkg-name> spire lint\n  ```\n- With [lerna]:\n  ```sh\n  npx lerna --scope <pkg-name> exec spire lint\n  ```\n\n## API\n\n### CLI\n\nEach plugin can extend a list of available commands and their options. The list\nbelow only includes basic commands.\n\n- `npx spire --help` Prints the list of available commands.\n- `npx spire --version` Prints the current version of Spire.\n- `npx spire <cmd>` Runs a specific command defined by plugins.\n- `npx spire --debug <cmd>` Outputs additional debug information.\n- _(hidden)_ `npx spire hook <name>` Runs specific git or npm plugin hooks.\n  Available hooks are `postinstall`, `preuninstall`, `precommit` and\n  `postmerge`. Use this to test or debug your plugins.\n\n### `spire`\n\nSpire is an object which is passed as the first argument to both configs and\nplugins.\n\n- `spire`\n  - `setState` \\<[function]\\([Object]|[function]\\)\\> Sets state by merging it\n    with previous one (shallow).\n    - `state` \\<[Object]|[function]\\> New state as an object or a function which\n      recevies the previous state and returns an object. Usefull to avoid\n      `getState()` calls.\n  - `getState` \\<[function]\\(\\): [Object]\\> Returns current state.\n  - `hasFile` \\<[function]\\([string]\\): [Promise]\\<[boolean]\\>\\> Checks if\n    current projects contains specific file.\n  - `hasPackageProp` \\<[function]\\([string]\\): [Promise]\\<[boolean]\\>\\> Check if\n    current project's `package.json` contains specific prop.\n\n### `context`\n\nContext is an object which is passed as the first argument to plugin hooks. It's\ndesigned to be read-only. If you want to pass some data futher, consider using\n[`spire.setState` instead](#spire).\n\n- `context`\n  - `argv` \\<[Array]\\<[string]\\>\\> Array of arguments Spire was called with.\n    Defaults to `process.argv.slice(2)`.\n  - `cli` \\<[Object]\\> Instance of [yargs](http://yargs.js.org/) for adding\n    custom commands.\n  - `cwd` \\<[string]\\> Directory Spire is executed in. Defaults to\n    `process.cwd()`.\n  - `env` \\<[Object]\\> Set of environment variables. Defaults to `process.env`.\n  - `logger` \\<[Object]\\> Instance of\n    [Signale](https://github.com/klauscfhq/signale). Use `logger.debug()` to\n    print debug info which is only shown with `--debug` flag.\n  - `config` \\<[Object]\\> Parsed and normalised [config](#writing-a-config).\n  - `options` \\<[Object]\\> Parsed yargs options. Available only after `setup`\n    hook.\n\n## References\n\nThis project is inspired by the great work of JavaScript open source community\n(without particular order):\n\n- [Kent C. Dodds: Tools without config 🛠📦](https://blog.kentcdodds.com/automation-without-config-412ab5e47229)\n- [Dan Abramov: The Melting Pot of JavaScript](https://www.youtube.com/watch?v=nl30vWYKs9A)\n- [Jamie Kyle: Tools 4 Tools 4 Tools](https://www.youtube.com/watch?v=itI5xGyvtho)\n- [semantic-release](https://github.com/semantic-release/semantic-release)\n- [react-scripts](https://github.com/facebook/create-react-app/tree/next/packages/react-scripts)\n- [kcd-scripts](https://github.com/kentcdodds/kcd-scripts)\n- [bolt](https://github.com/boltpkg/bolt)\n\n## License\n\nMIT &copy; [ResearchGate](https://github.com/researchgate)\n\n[context]: #context\n[spire-config-default]:\n  https://github.com/researchgate/spire/blob/master/packages/spire-config-default\n[spire-plugin-yarn]:\n  https://github.com/researchgate/spire/blob/master/packages/spire-plugin-yarn\n[spire-plugin-clean]:\n  https://github.com/researchgate/spire/blob/master/packages/spire-plugin-clean\n[spire-plugin-doctoc]:\n  https://github.com/researchgate/spire/blob/master/packages/spire-plugin-doctoc\n[spire-plugin-eslint]:\n  https://github.com/researchgate/spire/blob/master/packages/spire-plugin-eslint\n[spire-plugin-semantic-release]:\n  https://github.com/researchgate/spire/blob/master/packages/spire-plugin-semantic-release\n[spire-plugin-lerna-release]:\n  https://github.com/researchgate/spire/blob/master/packages/spire-plugin-lerna-release\n[boolean]:\n  https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Boolean_type\n[string]:\n  https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type\n[array]:\n  https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array\n[object]:\n  https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object\n[function]:\n  https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function\n[promise]:\n  https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise\n[symbol]:\n  https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol\n[create-react-app]: https://github.com/facebook/create-react-app\n[yarn workspaces]: https://yarnpkg.com/lang/en/docs/workspaces/\n[lerna]: https://github.com/lerna/lerna\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/researchgate/spire/issues"},"homepage":"https://github.com/researchgate/spire#readme","_id":"spire@1.8.4-next.27","_nodeVersion":"12.13.0","_npmVersion":"lerna/3.18.3/node@v12.13.0+x64 (linux)","dist":{"integrity":"sha512-szNYhSztmEfgau2HR5NNnbGuJ1r1ziON/PKqZ56k427njhHfIsSueepsducVGr0iboR2duf1UzOfeyHUsdpjtQ==","shasum":"4ccfe47ad224c5f0b9133c89b69d9b21e0c82fc2","tarball":"https://registry.npmjs.org/spire/-/spire-1.8.4-next.27.tgz","fileCount":19,"unpackedSize":37503,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdzpeICRA9TVsSAnZWagAAA8YP/0vvTU/A9yM366Lr+UL4\ngngQs1k9lSEsHvyVzuJ/3X6gwzt1AKkI5aStH0WiZ3hD5470YsEOmVbDylHn\nKNgsD3f1nRsTChanx682Hr3pRkIb9F3Ln31Qhs8zJd06bX9muLZ96zoSNeDy\nxbPJs01y0e0LtWtmH0xLQNTRXfflMkOcbbPxmPsh3T/5USGmuxCRrbpJmJ6y\n0YWLV7dCudK06ZDMUOWtXFFAp+1iHAEu3G8TqcB3D4SVQY4xaCli5SQR/jrL\nmb+RIraYH16UruTEoSo/jyT5fAaQ/oOi3Y2QKNPnYopgCkZ/YCU58E0udk33\nDghTBkrqNYzfaKshsYUSD6gvsT0akAVZhsVumAYUygqvWTuJyywwyx4XySzT\n8sZMjEHXVdWvnGMQshAbZoPUqfChmHjarviYlke1G5NDRhs9ieiSZi/SbPlO\nhHIOr9ZrQ2VHyQXkbfAiH8SPXNNusCURmZKXsjjOfkLXbUeQNeBA6OPOXjJF\nqBr5FiiSWbVtqoeLnFd51IIrKGmIAbOXrC8X1SQAsdmXUb5F23nawRj9s96m\nYLWe/QR+Ra4N2PtHKZF7PwQYd4AXJBUUkhvfyN9iRo9GpvE5IczG/o5IsmQg\n4vYBDQFRvOtQ+oiYoxjYOx4lTqwDAsgNjgU5ccekysjyv67WFvwrnZITVl7x\n1fJm\r\n=W87u\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQD+RcyKakShDfOJCZZirNKo5t+x54rb31ilhQN/mwyVvwIhANxdv9mlW6U6LPDMTVamE+ahb0ZlB6kqtqYhGp686Qx6"}]},"maintainers":[{"email":"daniel@tschinder.de","name":"danez"},{"email":"justnvdm@gmail.com","name":"justinvdm"},{"email":"sebastian.jerie@researchgate.net","name":"researchgate-bot"},{"email":"sergey@bekrin.me","name":"sbekrin"},{"email":"info@weaintplastic.com","name":"weaintplastic"}],"_npmUser":{"name":"researchgate-bot","email":"stefan.hoth@researchgate.net"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/spire_1.8.4-next.27_1573820295678_0.358590488452702"},"_hasShrinkwrap":false},"1.8.4-next.33":{"name":"spire","version":"1.8.4-next.33","description":"Extensible CLI toolkit managment tool","main":"index.js","repository":{"type":"git","url":"git+https://github.com/researchgate/spire.git"},"author":{"name":"Sergey Bekrin","email":"sergey@bekrin.me","url":"https://bekrin.me"},"license":"MIT","bin":{"spire":"./bin/spire.js"},"engines":{"node":">=8.3"},"scripts":{"postinstall":"./bin/spire.js hook postinstall","preuninstall":"./bin/spire.js hook preuninstall"},"dependencies":{"cosmiconfig":"^6.0.0","fs-extra":"^8.1.0","import-from":"^3.0.0","invariant":"^2.2.4","pretty-format":"^24.7.0","signale":"^1.4.0","spire-config-default":"^1.8.4-next.33+baa1714","yargs":"^14.2.0"},"devDependencies":{"spire-test-utils":"^1.8.2"},"prettier":"spire-plugin-prettier/config","gitHead":"baa171441511177d82354307faa8d886dd9ea95f","readme":"# 🗼 Spire\n\nExtensible JavaScript toolbox management.\n\n<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->\n\n- [Motivation](#motivation)\n- [Quick Start](#quick-start)\n- [Configuration](#configuration)\n  - [Using a Custom Preset](#using-a-custom-preset)\n  - [Using a Local Preset](#using-a-local-preset)\n  - [Passing Options](#passing-options)\n- [Guides](#guides)\n  - [Writing a Config](#writing-a-config)\n  - [Writing a Plugin](#writing-a-plugin)\n  - [Migrating to Spire](#migrating-to-spire)\n  - [Using without Git](#using-without-git)\n  - [Using in monorepos](#using-in-monorepos)\n- [API](#api)\n  - [CLI](#cli)\n  - [`spire`](#spire)\n  - [`context`](#context)\n- [References](#references)\n- [License](#license)\n\n<!-- END doctoc generated TOC please keep comment here to allow auto update -->\n\n## Motivation\n\n**Problem:** Maintaining tools and configurations for linting, testing and\nbuilding your code is hard. The more projects you have, the more time it takes\nto keep your setup consistent and up-to-date.\n\n**Solution:** Spire is a pluggable CLI tool which allows you to abstract all of\nyour tools and configurations into reusable plugins and presets. Think of it as\n“babel for infrastructure”.\n\n## Quick Start\n\n1. Install `spire`:\n\n```sh\n# yarn\nyarn add --dev spire\n\n# npm\nnpm install --save-dev spire\n```\n\n2. Start using in your project:\n\n```sh\n# npx\nnpx spire --help\n\n# yarn\nyarn spire --help\n```\n\n3. Depending on your tech stack, you can start using Spire as zero-config tool.\n   See [spire-config-default] for a list of default tools and\n   [configuration section](#configuration) for how to customise it.\n\n- _Using yarn? Consider installing [spire-plugin-yarn] for few power features._\n\n- _Want to have automated release w/ changelog generation? Check out\n  [spire-plugin-semantic-release] and [spire-plugin-lerna-release] for lerna\n  monorepos._\n\n## Configuration\n\nSpire is based on config presets, which is the same concept for tools like\n[Babel](https://babeljs.io/) and [ESLint](https://eslint.org/). Configs are a\nset of predefined plugins and their options. Configs can also extend a chain of\nother configs. By default, Spire is shipped with [spire-config-default].\n\n### Using a Custom Preset\n\nTo use your preferred configuration, install it as dev dependency and reference\nit by module name in [`extends` property](#writing-a-config). To extend multiple\nconfigs, provide it as an array. You can also use individual plugins along with\nconfigs with [`plugins` property](#writing-a-config).\n\n<details open>\n  <summary>via <code>package.json#spire</code> (recommended)</summary>\n\n```json\n{\n  \"name\": \"acme-project\",\n  \"devDependencies\": {\n    \"spire\": \"^1.0.0\",\n    \"spire-config-acme\": \"^1.0.0\"\n  },\n  \"spire\": {\n    \"extends\": \"spire-config-acme\"\n  }\n}\n```\n\n</details>\n\n<details>\n  <summary>via <code>spire.config.js</code></summary>\n\n```js\nmodule.exports = {\n  extends: 'spire-config-acme',\n};\n```\n\n</details>\n\n<details>\n  <summary>via <code>.spirerc</code></summary>\n\n```js\n{\n  \"extends\": \"spire-config-acme\",\n}\n```\n\n</details>\n\n### Using a Local Preset\n\n_Note: It is recommended to enable Local Presets only for development._\n\nYou can reference a Local Preset or plugin using `<rootDir>` placeholder which\npoints to the current project directory:\n\n```json\n{\n  \"spire\": {\n    \"extends\": \"<rootDir>/spire-config.js\",\n    \"plugins\": [\"<rootDir>/spire-plugin.js\"]\n  }\n}\n```\n\n### Passing Options\n\nIf the config preset or plugin you're using supports customisation, you can pass\noptions to it:\n\n```json\n{\n  \"spire\": {\n    \"extends\": [[\"spire-config-acme\", { \"fictional\": false }]],\n    \"plugins\": [[\"spire-plugin-acme\", { \"company\": true }]]\n  }\n}\n```\n\n## Guides\n\n### Writing a Config\n\nA Config is a module which exports a function returning an object.\n\n- `config` \\<[function]([Object], [Object])\\>\n  - `spire` \\<[Object]\\> Spire [API object](#spire).\n  - `options` \\<[Object]\\> User-provided config options.\n- returns: \\<[Object]\\>\n  - `extends` \\<[string]|\\<[Array]\\<[string]\\>\\>\\> Config or an array of config\n    presets to extend.\n  - `plugins` \\<[Array]\\<[string]\\>\\> Array of plugins to include.\n\nExample:\n\n```js\nmodule.exports = (spire, options) => {\n  return {\n    extends: ['spire-config-first', 'spire-config-second'],\n    plugins: ['spire-plugin'],\n  };\n};\n```\n\nYou can dynamically change the behaviour of your preset based on `options` or\n`spire` APIs, but it's recommended to keep it explicit. Check\n[spire-config-default](https://github.com/researchgate/spire/blob/master/packages/spire-config-default/index.js)\nfor a reference.\n\n### Writing a Plugin\n\nA Plugin is a key component of Spire. After it resolves the config, Spire\naccumulates all plugins in chronological order and runs them. A Plugin is a\nfunction returning an object:\n\n_Note: It is recommended to keep plugins scoped to a single feature or tool._\n\n- `plugin` \\<[function]([Object], [Object])\\>\n  - `spire` \\<[Object]\\> Spire [API object](#spire).\n  - `options` \\<[Object]\\> User-provided plugin options.\n- returns: \\<[Object]\\>\n  - `name` \\<[string]\\> Name of the plugin (recommended).\n  - `command` \\<[string]\\> Optional name of command. Leaving it empty will\n    ignore `run` hook completly.\n  - `description` \\<[string]\\> Optional human-readable command description.\n  - `preinstall` \\<[function]\\([Context]\\): [Promise]\\> Executed before\n    `yarn install` or `npm install`\n  - `postinstall` \\<[function]\\([Context]\\): [Promise]\\> Executed after\n    `yarn install` or `npm install`.\n  - `postmerge` \\<[function]\\([Context]\\): [Promise]\\> Executed on `git pull`.\n  - `precommit` \\<[function]\\([Context]\\): [Promise]\\> Executed on `git commit`.\n  - `setup` \\<[function]\\([Context]\\): [Promise]\\> Executed before `run` hook.\n    Use it to prepare arguments or config for your tools. If it fails, Spire\n    stops futher hooks from being executed.\n  - `run` \\<[function]\\([Context]\\): [Promise]\\> Executed as the main logic of\n    the plugin. Use this hook to run the CLI tool or process long-running task.\n  - `teardown` \\<[function]\\([Context]\\): [Promise]\\> Executed after `run` hook,\n    even if it has failed. Use this hook to cleanup locally or to collect some\n    stats.\n  - `preuninstall` \\<[function]\\([Context]\\): [Promise]\\> Executed before\n    `yarn uninstall` or `npm uninstall`. Run it to cleanup external data.\n\nExample:\n\n```js\nmodule.exports = (spire, options) => {\n  return {\n    name: 'my-awesome-tool',\n    command: 'my-tool',\n    description: 'run my awesome tool',\n    async run({ logger }) {\n      logger.log('Hi from my awesome tool!');\n    },\n  };\n};\n```\n\nCheck [spire-plugin-clean], [spire-plugin-doctoc] and [spire-plugin-eslint] for\nmore plugin examples.\n\n### Migrating to Spire\n\n**Identify your tools:** To get started, gather a list of shared tools in your\nexisting projects. This will help to identify which plugins you'll need.\n\n**Pick preset or plugin:** Check if there's already a default or community\nplugin for that.\n[Search for `spire-plugin-*`](https://www.npmjs.com/search?q=spire-plugin-) on\nnpm for individual tools and\n[`spire-config-*`](https://www.npmjs.com/search?q=spire-config-) for specific\necosystems and tech stacks. In case if there's no suitable option for your,\ncheck on how to [write a custom plugin](#writing-a-plugin).\n\n**Make your own preset**: If you find that an existing or default preset works\nfor you, skip this step. If not, create a new module with a name matching\n`spire-config-*`. It can be specific for your personal projects, your company or\na tech stack. Check [writing a config](#writing-a-config) for instructions on\nhow to do this.\n\n**Migrate your projects**: Once you've got a preset ready, go through your\nprojects and [setup Spire](#quick-start) with it. Make sure to delete the\ndependencies it replaces. At this point you're done!\n\n### Using without Git\n\nAt the moment Spire has a hard dependency on a Git repository to resolve\nmonorepo project root. This most likely to be reviewed in the future, but\nmeanwhile it is part of the core, you can export `SKIP_PREFLIGHT_CHECK=true`\nenvironment variable to disable this check. The idea and name of this flag is\nborrowed from [create-react-app].\n\n### Using in monorepos\n\nIt is recommended to install Spire on the root level of a monorepo and run all\ncommands from there. The main motivation behind this is performance and\nconsistency reasons. You can still though run commands in an indivudual package.\nBelow is an example of how to run `spire lint` in a specific monorepo package:\n\n- With [yarn workspaces]:\n  ```sh\n  yarn workspace <pkg-name> spire lint\n  ```\n- With [lerna]:\n  ```sh\n  npx lerna --scope <pkg-name> exec spire lint\n  ```\n\n## API\n\n### CLI\n\nEach plugin can extend a list of available commands and their options. The list\nbelow only includes basic commands.\n\n- `npx spire --help` Prints the list of available commands.\n- `npx spire --version` Prints the current version of Spire.\n- `npx spire <cmd>` Runs a specific command defined by plugins.\n- `npx spire --debug <cmd>` Outputs additional debug information.\n- _(hidden)_ `npx spire hook <name>` Runs specific git or npm plugin hooks.\n  Available hooks are `postinstall`, `preuninstall`, `precommit` and\n  `postmerge`. Use this to test or debug your plugins.\n\n### `spire`\n\nSpire is an object which is passed as the first argument to both configs and\nplugins.\n\n- `spire`\n  - `setState` \\<[function]\\([Object]|[function]\\)\\> Sets state by merging it\n    with previous one (shallow).\n    - `state` \\<[Object]|[function]\\> New state as an object or a function which\n      recevies the previous state and returns an object. Usefull to avoid\n      `getState()` calls.\n  - `getState` \\<[function]\\(\\): [Object]\\> Returns current state.\n  - `hasFile` \\<[function]\\([string]\\): [Promise]\\<[boolean]\\>\\> Checks if\n    current projects contains specific file.\n  - `hasPackageProp` \\<[function]\\([string]\\): [Promise]\\<[boolean]\\>\\> Check if\n    current project's `package.json` contains specific prop.\n\n### `context`\n\nContext is an object which is passed as the first argument to plugin hooks. It's\ndesigned to be read-only. If you want to pass some data futher, consider using\n[`spire.setState` instead](#spire).\n\n- `context`\n  - `argv` \\<[Array]\\<[string]\\>\\> Array of arguments Spire was called with.\n    Defaults to `process.argv.slice(2)`.\n  - `cli` \\<[Object]\\> Instance of [yargs](http://yargs.js.org/) for adding\n    custom commands.\n  - `cwd` \\<[string]\\> Directory Spire is executed in. Defaults to\n    `process.cwd()`.\n  - `env` \\<[Object]\\> Set of environment variables. Defaults to `process.env`.\n  - `logger` \\<[Object]\\> Instance of\n    [Signale](https://github.com/klauscfhq/signale). Use `logger.debug()` to\n    print debug info which is only shown with `--debug` flag.\n  - `config` \\<[Object]\\> Parsed and normalised [config](#writing-a-config).\n  - `options` \\<[Object]\\> Parsed yargs options. Available only after `setup`\n    hook.\n\n## References\n\nThis project is inspired by the great work of JavaScript open source community\n(without particular order):\n\n- [Kent C. Dodds: Tools without config 🛠📦](https://blog.kentcdodds.com/automation-without-config-412ab5e47229)\n- [Dan Abramov: The Melting Pot of JavaScript](https://www.youtube.com/watch?v=nl30vWYKs9A)\n- [Jamie Kyle: Tools 4 Tools 4 Tools](https://www.youtube.com/watch?v=itI5xGyvtho)\n- [semantic-release](https://github.com/semantic-release/semantic-release)\n- [react-scripts](https://github.com/facebook/create-react-app/tree/next/packages/react-scripts)\n- [kcd-scripts](https://github.com/kentcdodds/kcd-scripts)\n- [bolt](https://github.com/boltpkg/bolt)\n\n## License\n\nMIT &copy; [ResearchGate](https://github.com/researchgate)\n\n[context]: #context\n[spire-config-default]:\n  https://github.com/researchgate/spire/blob/master/packages/spire-config-default\n[spire-plugin-yarn]:\n  https://github.com/researchgate/spire/blob/master/packages/spire-plugin-yarn\n[spire-plugin-clean]:\n  https://github.com/researchgate/spire/blob/master/packages/spire-plugin-clean\n[spire-plugin-doctoc]:\n  https://github.com/researchgate/spire/blob/master/packages/spire-plugin-doctoc\n[spire-plugin-eslint]:\n  https://github.com/researchgate/spire/blob/master/packages/spire-plugin-eslint\n[spire-plugin-semantic-release]:\n  https://github.com/researchgate/spire/blob/master/packages/spire-plugin-semantic-release\n[spire-plugin-lerna-release]:\n  https://github.com/researchgate/spire/blob/master/packages/spire-plugin-lerna-release\n[boolean]:\n  https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Boolean_type\n[string]:\n  https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type\n[array]:\n  https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array\n[object]:\n  https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object\n[function]:\n  https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function\n[promise]:\n  https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise\n[symbol]:\n  https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol\n[create-react-app]: https://github.com/facebook/create-react-app\n[yarn workspaces]: https://yarnpkg.com/lang/en/docs/workspaces/\n[lerna]: https://github.com/lerna/lerna\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/researchgate/spire/issues"},"homepage":"https://github.com/researchgate/spire#readme","_id":"spire@1.8.4-next.33","_nodeVersion":"12.13.1","_npmVersion":"lerna/3.18.3/node@v12.13.1+x64 (linux)","dist":{"integrity":"sha512-au9AkFHxKBKpwnvXGC9OyT0nBj8aEr4JUUmFDIIdnT5SuPxCkQQCg8Cw6chb3j6ZusDVXmc/S9aft81wtkKYXg==","shasum":"baf75172ca048e8bdecbf001c977896a1ec9c728","tarball":"https://registry.npmjs.org/spire/-/spire-1.8.4-next.33.tgz","fileCount":19,"unpackedSize":37524,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJd4TFuCRA9TVsSAnZWagAA2hcQAI3O0A6l6xBjZyutxqkB\nqABLg/Vf9N1hbI8yeJvmkY6IOfFt39FAgGqveaNIIu18+1olkDv+t3NgY7lR\npgvf6vhJRch36NaTAYUHSYj1y7TKm1tOVsg8A/hsfda82H2OEIJVZd897wMj\n95ybNBFtBDm3leDTOQugsD0v08mVgBddCD0FvRynCIgXxiBN8NXkSY5G3pn7\nR5QIK5THg1yjLvWSOOMkmDHRk6WamA0msdkTfPm9CQtqNc6wVA4VFP59CYJ5\ntp4u+hPzGvUKbvWsTlnVxR5hRXw1o2ALgaPxx68p8K/uw3WHO58JPlZeqZUa\nC95Vi0lCT2svF+f7ed3DeyAGq2zVVBs3XlX/MnVmsfpdFfBA0R3MTZo1ZcGr\nzLwEaBmEZLKFrMj35i2RQ2p4ZqBTz5JMD0QVMP6cXi098EfyI/vfaQX5HjVM\nZVtvgqCoU3ZJqEirJJEA+PTqm9SYFk11UFga/5yVb2AnvqBUq0Y7uLEeBH22\naZym74ag4F67qjwrsZMt6RkUD5Wvl4MeUiPPVRm9rCuR1kmjmmHOeFQ3/IgK\nnIpYAbWxhpuqlv0+OCijeutOpzv8QGthbTGhPZe9Esz/NsCWSGrO0OOuq76D\n3xR3C+ahToyiAbyENF00TUcFTSjWDpV5GOPFNRita6G9dkJWTgO0/yLzoZku\nBd7N\r\n=hPnv\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDV2OF+Lv+pxl48avthpD4y4RGQbn7BeTiOtbw44HPWWQIgEbALTebc6G45v6gUnx2R+QsbtUxwrQi9cSKVCKXcdAc="}]},"maintainers":[{"email":"daniel@tschinder.de","name":"danez"},{"email":"justnvdm@gmail.com","name":"justinvdm"},{"email":"sebastian.jerie@researchgate.net","name":"researchgate-bot"},{"email":"sergey@bekrin.me","name":"sbekrin"},{"email":"info@weaintplastic.com","name":"weaintplastic"}],"_npmUser":{"name":"researchgate-bot","email":"stefan.hoth@researchgate.net"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/spire_1.8.4-next.33_1575039341721_0.11108884358530235"},"_hasShrinkwrap":false},"1.8.4-next.34":{"name":"spire","version":"1.8.4-next.34","description":"Extensible CLI toolkit managment tool","main":"index.js","repository":{"type":"git","url":"git+https://github.com/researchgate/spire.git"},"author":{"name":"Sergey Bekrin","email":"sergey@bekrin.me","url":"https://bekrin.me"},"license":"MIT","bin":{"spire":"./bin/spire.js"},"engines":{"node":">=8.3"},"scripts":{"postinstall":"./bin/spire.js hook postinstall","preuninstall":"./bin/spire.js hook preuninstall"},"dependencies":{"cosmiconfig":"^6.0.0","detect-indent":"^6.0.0","fs-extra":"^8.1.0","import-from":"^3.0.0","invariant":"^2.2.4","pretty-format":"^24.7.0","signale":"^1.4.0","spire-config-default":"^1.8.3","yargs":"^14.2.0"},"devDependencies":{"spire-test-utils":"^1.8.2"},"prettier":"spire-plugin-prettier/config","gitHead":"39521b5575831052fa4216ce85cc1a0cbe1b6dd2","readme":"# 🗼 Spire\n\nExtensible JavaScript toolbox management.\n\n<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->\n\n- [Motivation](#motivation)\n- [Quick Start](#quick-start)\n- [Configuration](#configuration)\n  - [Using a Custom Preset](#using-a-custom-preset)\n  - [Using a Local Preset](#using-a-local-preset)\n  - [Passing Options](#passing-options)\n- [Guides](#guides)\n  - [Writing a Config](#writing-a-config)\n  - [Writing a Plugin](#writing-a-plugin)\n  - [Migrating to Spire](#migrating-to-spire)\n  - [Using without Git](#using-without-git)\n  - [Using in monorepos](#using-in-monorepos)\n- [API](#api)\n  - [CLI](#cli)\n  - [`spire`](#spire)\n  - [`context`](#context)\n- [References](#references)\n- [License](#license)\n\n<!-- END doctoc generated TOC please keep comment here to allow auto update -->\n\n## Motivation\n\n**Problem:** Maintaining tools and configurations for linting, testing and\nbuilding your code is hard. The more projects you have, the more time it takes\nto keep your setup consistent and up-to-date.\n\n**Solution:** Spire is a pluggable CLI tool which allows you to abstract all of\nyour tools and configurations into reusable plugins and presets. Think of it as\n“babel for infrastructure”.\n\n## Quick Start\n\n1. Install `spire`:\n\n```sh\n# yarn\nyarn add --dev spire\n\n# npm\nnpm install --save-dev spire\n```\n\n2. Start using in your project:\n\n```sh\n# npx\nnpx spire --help\n\n# yarn\nyarn spire --help\n```\n\n3. Depending on your tech stack, you can start using Spire as zero-config tool.\n   See [spire-config-default] for a list of default tools and\n   [configuration section](#configuration) for how to customise it.\n\n- _Using yarn? Consider installing [spire-plugin-yarn] for few power features._\n\n- _Want to have automated release w/ changelog generation? Check out\n  [spire-plugin-semantic-release] and [spire-plugin-lerna-release] for lerna\n  monorepos._\n\n## Configuration\n\nSpire is based on config presets, which is the same concept for tools like\n[Babel](https://babeljs.io/) and [ESLint](https://eslint.org/). Configs are a\nset of predefined plugins and their options. Configs can also extend a chain of\nother configs. By default, Spire is shipped with [spire-config-default].\n\n### Using a Custom Preset\n\nTo use your preferred configuration, install it as dev dependency and reference\nit by module name in [`extends` property](#writing-a-config). To extend multiple\nconfigs, provide it as an array. You can also use individual plugins along with\nconfigs with [`plugins` property](#writing-a-config).\n\n<details open>\n  <summary>via <code>package.json#spire</code> (recommended)</summary>\n\n```json\n{\n  \"name\": \"acme-project\",\n  \"devDependencies\": {\n    \"spire\": \"^1.0.0\",\n    \"spire-config-acme\": \"^1.0.0\"\n  },\n  \"spire\": {\n    \"extends\": \"spire-config-acme\"\n  }\n}\n```\n\n</details>\n\n<details>\n  <summary>via <code>spire.config.js</code></summary>\n\n```js\nmodule.exports = {\n  extends: 'spire-config-acme',\n};\n```\n\n</details>\n\n<details>\n  <summary>via <code>.spirerc</code></summary>\n\n```js\n{\n  \"extends\": \"spire-config-acme\",\n}\n```\n\n</details>\n\n### Using a Local Preset\n\n_Note: It is recommended to enable Local Presets only for development._\n\nYou can reference a Local Preset or plugin using `<rootDir>` placeholder which\npoints to the current project directory:\n\n```json\n{\n  \"spire\": {\n    \"extends\": \"<rootDir>/spire-config.js\",\n    \"plugins\": [\"<rootDir>/spire-plugin.js\"]\n  }\n}\n```\n\n### Passing Options\n\nIf the config preset or plugin you're using supports customisation, you can pass\noptions to it:\n\n```json\n{\n  \"spire\": {\n    \"extends\": [[\"spire-config-acme\", { \"fictional\": false }]],\n    \"plugins\": [[\"spire-plugin-acme\", { \"company\": true }]]\n  }\n}\n```\n\n## Guides\n\n### Writing a Config\n\nA Config is a module which exports a function returning an object.\n\n- `config` \\<[function]([Object], [Object])\\>\n  - `spire` \\<[Object]\\> Spire [API object](#spire).\n  - `options` \\<[Object]\\> User-provided config options.\n- returns: \\<[Object]\\>\n  - `extends` \\<[string]|\\<[Array]\\<[string]\\>\\>\\> Config or an array of config\n    presets to extend.\n  - `plugins` \\<[Array]\\<[string]\\>\\> Array of plugins to include.\n\nExample:\n\n```js\nmodule.exports = (spire, options) => {\n  return {\n    extends: ['spire-config-first', 'spire-config-second'],\n    plugins: ['spire-plugin'],\n  };\n};\n```\n\nYou can dynamically change the behaviour of your preset based on `options` or\n`spire` APIs, but it's recommended to keep it explicit. Check\n[spire-config-default](https://github.com/researchgate/spire/blob/master/packages/spire-config-default/index.js)\nfor a reference.\n\n### Writing a Plugin\n\nA Plugin is a key component of Spire. After it resolves the config, Spire\naccumulates all plugins in chronological order and runs them. A Plugin is a\nfunction returning an object:\n\n_Note: It is recommended to keep plugins scoped to a single feature or tool._\n\n- `plugin` \\<[function]([Object], [Object])\\>\n  - `spire` \\<[Object]\\> Spire [API object](#spire).\n  - `options` \\<[Object]\\> User-provided plugin options.\n- returns: \\<[Object]\\>\n  - `name` \\<[string]\\> Name of the plugin (recommended).\n  - `command` \\<[string]\\> Optional name of command. Leaving it empty will\n    ignore `run` hook completly.\n  - `description` \\<[string]\\> Optional human-readable command description.\n  - `preinstall` \\<[function]\\([Context]\\): [Promise]\\> Executed before\n    `yarn install` or `npm install`\n  - `postinstall` \\<[function]\\([Context]\\): [Promise]\\> Executed after\n    `yarn install` or `npm install`.\n  - `postmerge` \\<[function]\\([Context]\\): [Promise]\\> Executed on `git pull`.\n  - `precommit` \\<[function]\\([Context]\\): [Promise]\\> Executed on `git commit`.\n  - `setup` \\<[function]\\([Context]\\): [Promise]\\> Executed before `run` hook.\n    Use it to prepare arguments or config for your tools. If it fails, Spire\n    stops futher hooks from being executed.\n  - `run` \\<[function]\\([Context]\\): [Promise]\\> Executed as the main logic of\n    the plugin. Use this hook to run the CLI tool or process long-running task.\n  - `teardown` \\<[function]\\([Context]\\): [Promise]\\> Executed after `run` hook,\n    even if it has failed. Use this hook to cleanup locally or to collect some\n    stats.\n  - `preuninstall` \\<[function]\\([Context]\\): [Promise]\\> Executed before\n    `yarn uninstall` or `npm uninstall`. Run it to cleanup external data.\n\nExample:\n\n```js\nmodule.exports = (spire, options) => {\n  return {\n    name: 'my-awesome-tool',\n    command: 'my-tool',\n    description: 'run my awesome tool',\n    async run({ logger }) {\n      logger.log('Hi from my awesome tool!');\n    },\n  };\n};\n```\n\nCheck [spire-plugin-clean], [spire-plugin-doctoc] and [spire-plugin-eslint] for\nmore plugin examples.\n\n### Migrating to Spire\n\n**Identify your tools:** To get started, gather a list of shared tools in your\nexisting projects. This will help to identify which plugins you'll need.\n\n**Pick preset or plugin:** Check if there's already a default or community\nplugin for that.\n[Search for `spire-plugin-*`](https://www.npmjs.com/search?q=spire-plugin-) on\nnpm for individual tools and\n[`spire-config-*`](https://www.npmjs.com/search?q=spire-config-) for specific\necosystems and tech stacks. In case if there's no suitable option for your,\ncheck on how to [write a custom plugin](#writing-a-plugin).\n\n**Make your own preset**: If you find that an existing or default preset works\nfor you, skip this step. If not, create a new module with a name matching\n`spire-config-*`. It can be specific for your personal projects, your company or\na tech stack. Check [writing a config](#writing-a-config) for instructions on\nhow to do this.\n\n**Migrate your projects**: Once you've got a preset ready, go through your\nprojects and [setup Spire](#quick-start) with it. Make sure to delete the\ndependencies it replaces. At this point you're done!\n\n### Using without Git\n\nAt the moment Spire has a hard dependency on a Git repository to resolve\nmonorepo project root. This most likely to be reviewed in the future, but\nmeanwhile it is part of the core, you can export `SKIP_PREFLIGHT_CHECK=true`\nenvironment variable to disable this check. The idea and name of this flag is\nborrowed from [create-react-app].\n\n### Using in monorepos\n\nIt is recommended to install Spire on the root level of a monorepo and run all\ncommands from there. The main motivation behind this is performance and\nconsistency reasons. You can still though run commands in an indivudual package.\nBelow is an example of how to run `spire lint` in a specific monorepo package:\n\n- With [yarn workspaces]:\n  ```sh\n  yarn workspace <pkg-name> spire lint\n  ```\n- With [lerna]:\n  ```sh\n  npx lerna --scope <pkg-name> exec spire lint\n  ```\n\n## API\n\n### CLI\n\nEach plugin can extend a list of available commands and their options. The list\nbelow only includes basic commands.\n\n- `npx spire --help` Prints the list of available commands.\n- `npx spire --version` Prints the current version of Spire.\n- `npx spire <cmd>` Runs a specific command defined by plugins.\n- `npx spire --debug <cmd>` Outputs additional debug information.\n- _(hidden)_ `npx spire hook <name>` Runs specific git or npm plugin hooks.\n  Available hooks are `postinstall`, `preuninstall`, `precommit` and\n  `postmerge`. Use this to test or debug your plugins.\n\n### `spire`\n\nSpire is an object which is passed as the first argument to both configs and\nplugins.\n\n- `spire`\n  - `setState` \\<[function]\\([Object]|[function]\\)\\> Sets state by merging it\n    with previous one (shallow).\n    - `state` \\<[Object]|[function]\\> New state as an object or a function which\n      recevies the previous state and returns an object. Usefull to avoid\n      `getState()` calls.\n  - `getState` \\<[function]\\(\\): [Object]\\> Returns current state.\n  - `hasFile` \\<[function]\\([string]\\): [Promise]\\<[boolean]\\>\\> Checks if\n    current projects contains specific file.\n  - `hasPackageProp` \\<[function]\\([string]\\): [Promise]\\<[boolean]\\>\\> Check if\n    current project's `package.json` contains specific prop.\n\n### `context`\n\nContext is an object which is passed as the first argument to plugin hooks. It's\ndesigned to be read-only. If you want to pass some data futher, consider using\n[`spire.setState` instead](#spire).\n\n- `context`\n  - `argv` \\<[Array]\\<[string]\\>\\> Array of arguments Spire was called with.\n    Defaults to `process.argv.slice(2)`.\n  - `cli` \\<[Object]\\> Instance of [yargs](http://yargs.js.org/) for adding\n    custom commands.\n  - `cwd` \\<[string]\\> Directory Spire is executed in. Defaults to\n    `process.cwd()`.\n  - `env` \\<[Object]\\> Set of environment variables. Defaults to `process.env`.\n  - `logger` \\<[Object]\\> Instance of\n    [Signale](https://github.com/klauscfhq/signale). Use `logger.debug()` to\n    print debug info which is only shown with `--debug` flag.\n  - `config` \\<[Object]\\> Parsed and normalised [config](#writing-a-config).\n  - `options` \\<[Object]\\> Parsed yargs options. Available only after `setup`\n    hook.\n\n## References\n\nThis project is inspired by the great work of JavaScript open source community\n(without particular order):\n\n- [Kent C. Dodds: Tools without config 🛠📦](https://blog.kentcdodds.com/automation-without-config-412ab5e47229)\n- [Dan Abramov: The Melting Pot of JavaScript](https://www.youtube.com/watch?v=nl30vWYKs9A)\n- [Jamie Kyle: Tools 4 Tools 4 Tools](https://www.youtube.com/watch?v=itI5xGyvtho)\n- [semantic-release](https://github.com/semantic-release/semantic-release)\n- [react-scripts](https://github.com/facebook/create-react-app/tree/next/packages/react-scripts)\n- [kcd-scripts](https://github.com/kentcdodds/kcd-scripts)\n- [bolt](https://github.com/boltpkg/bolt)\n\n## License\n\nMIT &copy; [ResearchGate](https://github.com/researchgate)\n\n[context]: #context\n[spire-config-default]:\n  https://github.com/researchgate/spire/blob/master/packages/spire-config-default\n[spire-plugin-yarn]:\n  https://github.com/researchgate/spire/blob/master/packages/spire-plugin-yarn\n[spire-plugin-clean]:\n  https://github.com/researchgate/spire/blob/master/packages/spire-plugin-clean\n[spire-plugin-doctoc]:\n  https://github.com/researchgate/spire/blob/master/packages/spire-plugin-doctoc\n[spire-plugin-eslint]:\n  https://github.com/researchgate/spire/blob/master/packages/spire-plugin-eslint\n[spire-plugin-semantic-release]:\n  https://github.com/researchgate/spire/blob/master/packages/spire-plugin-semantic-release\n[spire-plugin-lerna-release]:\n  https://github.com/researchgate/spire/blob/master/packages/spire-plugin-lerna-release\n[boolean]:\n  https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Boolean_type\n[string]:\n  https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type\n[array]:\n  https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array\n[object]:\n  https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object\n[function]:\n  https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function\n[promise]:\n  https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise\n[symbol]:\n  https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol\n[create-react-app]: https://github.com/facebook/create-react-app\n[yarn workspaces]: https://yarnpkg.com/lang/en/docs/workspaces/\n[lerna]: https://github.com/lerna/lerna\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/researchgate/spire/issues"},"homepage":"https://github.com/researchgate/spire#readme","_id":"spire@1.8.4-next.34","_nodeVersion":"12.13.1","_npmVersion":"lerna/3.18.3/node@v12.13.1+x64 (linux)","dist":{"integrity":"sha512-v5rXuyAmSoiS0tYvtNNu9Kbs2dVIyMuXO8TLZ5FuszqEe679p63OiU0jywtjlnH4OG7jhucdH1NoCCFh7XMmNA==","shasum":"36507cbc5788a778cdc91140702624994408e79e","tarball":"https://registry.npmjs.org/spire/-/spire-1.8.4-next.34.tgz","fileCount":20,"unpackedSize":38592,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJd4UWNCRA9TVsSAnZWagAAGTEP/3lRkv6lPrL80V4vi0hJ\n6RqaXVFySoOHsnnYCyA/1PQBtTBFx+78ZPoPA7NsoAnyjAjZvoey3yZkYYkL\nvS6CWgjjesQyBOsL710alvyUlnTiCSdYajsGAfP4LRSGZj5wB5CgOKDaTZsh\nQowDdD7ZKNlZszU1Kd5S6QgRUgtl6OeYc+2FryRuQ2oV8qh9OH+NXayQFdat\n6HvGtW36Lz+0rO05Lw+xWkmj//q6s9FWuYIqDkoO23sKhfSL/mJZ6Ngv5NSf\neorNl5pJv8xQET3tmOS5p0sk3PLr1/YN53ziat2lLjfwNOkm2785C4PhsHcg\ntjbwMYTD9U1AZquKSKNxl+x2wBVwUWtK9Djeo1LCCO+ugsmaJgOxy7lJQNdZ\nVY2rzSV6Z0AuHl70aqduLEZgFnxW1CKbFtlLwZYWMAPRSzUFUfVbvwmvv4FX\nHSdsCsCUZYsjz5yUln6X8hE64hQ/oqp4H2poPv8EXGN/s9eWeGfzeMLytA0y\nyWCN/2RtRBW/scCHCb0EPyw8Xvi+U0iqD7LSYdGSpeQaJh9i3z4n3iSlSNTQ\nX0fXTd+yIDEWN62mnTtQUD8bpSO/CZj4MRql8fJB16joiq7niFt4CiegTY4Z\nBF6QTd2c5r01JfTow5nu/uS6Uyxv82UX5ztdGpb/6abgAPFXDMF8fbWRYtTU\n/dvA\r\n=GGks\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCzRsXfh0wguoT8hGByFQrcww9YD+XNjsM/6ZznUigE6wIgIDH5i7O2yRzPWVfkFL+B45hNuHcsooDJMkWoV+y26y8="}]},"maintainers":[{"email":"daniel@tschinder.de","name":"danez"},{"email":"justnvdm@gmail.com","name":"justinvdm"},{"email":"sebastian.jerie@researchgate.net","name":"researchgate-bot"},{"email":"sergey@bekrin.me","name":"sbekrin"},{"email":"info@weaintplastic.com","name":"weaintplastic"}],"_npmUser":{"name":"researchgate-bot","email":"stefan.hoth@researchgate.net"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/spire_1.8.4-next.34_1575044492650_0.7217013559508878"},"_hasShrinkwrap":false},"1.8.4-next.36":{"name":"spire","version":"1.8.4-next.36","description":"Extensible CLI toolkit managment tool","main":"index.js","repository":{"type":"git","url":"git+https://github.com/researchgate/spire.git"},"author":{"name":"Sergey Bekrin","email":"sergey@bekrin.me","url":"https://bekrin.me"},"license":"MIT","bin":{"spire":"./bin/spire.js"},"engines":{"node":">=8.3"},"scripts":{"postinstall":"./bin/spire.js hook postinstall","preuninstall":"./bin/spire.js hook preuninstall"},"dependencies":{"cosmiconfig":"^6.0.0","detect-indent":"^6.0.0","fs-extra":"^8.1.0","import-from":"^3.0.0","invariant":"^2.2.4","pretty-format":"^24.7.0","signale":"^1.4.0","spire-config-default":"^1.8.3","yargs":"^15.0.0"},"devDependencies":{"spire-test-utils":"^1.8.2"},"prettier":"spire-plugin-prettier/config","gitHead":"f5ae5884bfa71c47c6d1ff32c2f717594dae3e92","readme":"# 🗼 Spire\n\nExtensible JavaScript toolbox management.\n\n<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->\n\n- [Motivation](#motivation)\n- [Quick Start](#quick-start)\n- [Configuration](#configuration)\n  - [Using a Custom Preset](#using-a-custom-preset)\n  - [Using a Local Preset](#using-a-local-preset)\n  - [Passing Options](#passing-options)\n- [Guides](#guides)\n  - [Writing a Config](#writing-a-config)\n  - [Writing a Plugin](#writing-a-plugin)\n  - [Migrating to Spire](#migrating-to-spire)\n  - [Using without Git](#using-without-git)\n  - [Using in monorepos](#using-in-monorepos)\n- [API](#api)\n  - [CLI](#cli)\n  - [`spire`](#spire)\n  - [`context`](#context)\n- [References](#references)\n- [License](#license)\n\n<!-- END doctoc generated TOC please keep comment here to allow auto update -->\n\n## Motivation\n\n**Problem:** Maintaining tools and configurations for linting, testing and\nbuilding your code is hard. The more projects you have, the more time it takes\nto keep your setup consistent and up-to-date.\n\n**Solution:** Spire is a pluggable CLI tool which allows you to abstract all of\nyour tools and configurations into reusable plugins and presets. Think of it as\n“babel for infrastructure”.\n\n## Quick Start\n\n1. Install `spire`:\n\n```sh\n# yarn\nyarn add --dev spire\n\n# npm\nnpm install --save-dev spire\n```\n\n2. Start using in your project:\n\n```sh\n# npx\nnpx spire --help\n\n# yarn\nyarn spire --help\n```\n\n3. Depending on your tech stack, you can start using Spire as zero-config tool.\n   See [spire-config-default] for a list of default tools and\n   [configuration section](#configuration) for how to customise it.\n\n- _Using yarn? Consider installing [spire-plugin-yarn] for few power features._\n\n- _Want to have automated release w/ changelog generation? Check out\n  [spire-plugin-semantic-release] and [spire-plugin-lerna-release] for lerna\n  monorepos._\n\n## Configuration\n\nSpire is based on config presets, which is the same concept for tools like\n[Babel](https://babeljs.io/) and [ESLint](https://eslint.org/). Configs are a\nset of predefined plugins and their options. Configs can also extend a chain of\nother configs. By default, Spire is shipped with [spire-config-default].\n\n### Using a Custom Preset\n\nTo use your preferred configuration, install it as dev dependency and reference\nit by module name in [`extends` property](#writing-a-config). To extend multiple\nconfigs, provide it as an array. You can also use individual plugins along with\nconfigs with [`plugins` property](#writing-a-config).\n\n<details open>\n  <summary>via <code>package.json#spire</code> (recommended)</summary>\n\n```json\n{\n  \"name\": \"acme-project\",\n  \"devDependencies\": {\n    \"spire\": \"^1.0.0\",\n    \"spire-config-acme\": \"^1.0.0\"\n  },\n  \"spire\": {\n    \"extends\": \"spire-config-acme\"\n  }\n}\n```\n\n</details>\n\n<details>\n  <summary>via <code>spire.config.js</code></summary>\n\n```js\nmodule.exports = {\n  extends: 'spire-config-acme',\n};\n```\n\n</details>\n\n<details>\n  <summary>via <code>.spirerc</code></summary>\n\n```js\n{\n  \"extends\": \"spire-config-acme\",\n}\n```\n\n</details>\n\n### Using a Local Preset\n\n_Note: It is recommended to enable Local Presets only for development._\n\nYou can reference a Local Preset or plugin using `<rootDir>` placeholder which\npoints to the current project directory:\n\n```json\n{\n  \"spire\": {\n    \"extends\": \"<rootDir>/spire-config.js\",\n    \"plugins\": [\"<rootDir>/spire-plugin.js\"]\n  }\n}\n```\n\n### Passing Options\n\nIf the config preset or plugin you're using supports customisation, you can pass\noptions to it:\n\n```json\n{\n  \"spire\": {\n    \"extends\": [[\"spire-config-acme\", { \"fictional\": false }]],\n    \"plugins\": [[\"spire-plugin-acme\", { \"company\": true }]]\n  }\n}\n```\n\n## Guides\n\n### Writing a Config\n\nA Config is a module which exports a function returning an object.\n\n- `config` \\<[function]([Object], [Object])\\>\n  - `spire` \\<[Object]\\> Spire [API object](#spire).\n  - `options` \\<[Object]\\> User-provided config options.\n- returns: \\<[Object]\\>\n  - `extends` \\<[string]|\\<[Array]\\<[string]\\>\\>\\> Config or an array of config\n    presets to extend.\n  - `plugins` \\<[Array]\\<[string]\\>\\> Array of plugins to include.\n\nExample:\n\n```js\nmodule.exports = (spire, options) => {\n  return {\n    extends: ['spire-config-first', 'spire-config-second'],\n    plugins: ['spire-plugin'],\n  };\n};\n```\n\nYou can dynamically change the behaviour of your preset based on `options` or\n`spire` APIs, but it's recommended to keep it explicit. Check\n[spire-config-default](https://github.com/researchgate/spire/blob/master/packages/spire-config-default/index.js)\nfor a reference.\n\n### Writing a Plugin\n\nA Plugin is a key component of Spire. After it resolves the config, Spire\naccumulates all plugins in chronological order and runs them. A Plugin is a\nfunction returning an object:\n\n_Note: It is recommended to keep plugins scoped to a single feature or tool._\n\n- `plugin` \\<[function]([Object], [Object])\\>\n  - `spire` \\<[Object]\\> Spire [API object](#spire).\n  - `options` \\<[Object]\\> User-provided plugin options.\n- returns: \\<[Object]\\>\n  - `name` \\<[string]\\> Name of the plugin (recommended).\n  - `command` \\<[string]\\> Optional name of command. Leaving it empty will\n    ignore `run` hook completly.\n  - `description` \\<[string]\\> Optional human-readable command description.\n  - `preinstall` \\<[function]\\([Context]\\): [Promise]\\> Executed before\n    `yarn install` or `npm install`\n  - `postinstall` \\<[function]\\([Context]\\): [Promise]\\> Executed after\n    `yarn install` or `npm install`.\n  - `postmerge` \\<[function]\\([Context]\\): [Promise]\\> Executed on `git pull`.\n  - `precommit` \\<[function]\\([Context]\\): [Promise]\\> Executed on `git commit`.\n  - `setup` \\<[function]\\([Context]\\): [Promise]\\> Executed before `run` hook.\n    Use it to prepare arguments or config for your tools. If it fails, Spire\n    stops futher hooks from being executed.\n  - `run` \\<[function]\\([Context]\\): [Promise]\\> Executed as the main logic of\n    the plugin. Use this hook to run the CLI tool or process long-running task.\n  - `teardown` \\<[function]\\([Context]\\): [Promise]\\> Executed after `run` hook,\n    even if it has failed. Use this hook to cleanup locally or to collect some\n    stats.\n  - `preuninstall` \\<[function]\\([Context]\\): [Promise]\\> Executed before\n    `yarn uninstall` or `npm uninstall`. Run it to cleanup external data.\n\nExample:\n\n```js\nmodule.exports = (spire, options) => {\n  return {\n    name: 'my-awesome-tool',\n    command: 'my-tool',\n    description: 'run my awesome tool',\n    async run({ logger }) {\n      logger.log('Hi from my awesome tool!');\n    },\n  };\n};\n```\n\nCheck [spire-plugin-clean], [spire-plugin-doctoc] and [spire-plugin-eslint] for\nmore plugin examples.\n\n### Migrating to Spire\n\n**Identify your tools:** To get started, gather a list of shared tools in your\nexisting projects. This will help to identify which plugins you'll need.\n\n**Pick preset or plugin:** Check if there's already a default or community\nplugin for that.\n[Search for `spire-plugin-*`](https://www.npmjs.com/search?q=spire-plugin-) on\nnpm for individual tools and\n[`spire-config-*`](https://www.npmjs.com/search?q=spire-config-) for specific\necosystems and tech stacks. In case if there's no suitable option for your,\ncheck on how to [write a custom plugin](#writing-a-plugin).\n\n**Make your own preset**: If you find that an existing or default preset works\nfor you, skip this step. If not, create a new module with a name matching\n`spire-config-*`. It can be specific for your personal projects, your company or\na tech stack. Check [writing a config](#writing-a-config) for instructions on\nhow to do this.\n\n**Migrate your projects**: Once you've got a preset ready, go through your\nprojects and [setup Spire](#quick-start) with it. Make sure to delete the\ndependencies it replaces. At this point you're done!\n\n### Using without Git\n\nAt the moment Spire has a hard dependency on a Git repository to resolve\nmonorepo project root. This most likely to be reviewed in the future, but\nmeanwhile it is part of the core, you can export `SKIP_PREFLIGHT_CHECK=true`\nenvironment variable to disable this check. The idea and name of this flag is\nborrowed from [create-react-app].\n\n### Using in monorepos\n\nIt is recommended to install Spire on the root level of a monorepo and run all\ncommands from there. The main motivation behind this is performance and\nconsistency reasons. You can still though run commands in an indivudual package.\nBelow is an example of how to run `spire lint` in a specific monorepo package:\n\n- With [yarn workspaces]:\n  ```sh\n  yarn workspace <pkg-name> spire lint\n  ```\n- With [lerna]:\n  ```sh\n  npx lerna --scope <pkg-name> exec spire lint\n  ```\n\n## API\n\n### CLI\n\nEach plugin can extend a list of available commands and their options. The list\nbelow only includes basic commands.\n\n- `npx spire --help` Prints the list of available commands.\n- `npx spire --version` Prints the current version of Spire.\n- `npx spire <cmd>` Runs a specific command defined by plugins.\n- `npx spire --debug <cmd>` Outputs additional debug information.\n- _(hidden)_ `npx spire hook <name>` Runs specific git or npm plugin hooks.\n  Available hooks are `postinstall`, `preuninstall`, `precommit` and\n  `postmerge`. Use this to test or debug your plugins.\n\n### `spire`\n\nSpire is an object which is passed as the first argument to both configs and\nplugins.\n\n- `spire`\n  - `setState` \\<[function]\\([Object]|[function]\\)\\> Sets state by merging it\n    with previous one (shallow).\n    - `state` \\<[Object]|[function]\\> New state as an object or a function which\n      recevies the previous state and returns an object. Usefull to avoid\n      `getState()` calls.\n  - `getState` \\<[function]\\(\\): [Object]\\> Returns current state.\n  - `hasFile` \\<[function]\\([string]\\): [Promise]\\<[boolean]\\>\\> Checks if\n    current projects contains specific file.\n  - `hasPackageProp` \\<[function]\\([string]\\): [Promise]\\<[boolean]\\>\\> Check if\n    current project's `package.json` contains specific prop.\n\n### `context`\n\nContext is an object which is passed as the first argument to plugin hooks. It's\ndesigned to be read-only. If you want to pass some data futher, consider using\n[`spire.setState` instead](#spire).\n\n- `context`\n  - `argv` \\<[Array]\\<[string]\\>\\> Array of arguments Spire was called with.\n    Defaults to `process.argv.slice(2)`.\n  - `cli` \\<[Object]\\> Instance of [yargs](http://yargs.js.org/) for adding\n    custom commands.\n  - `cwd` \\<[string]\\> Directory Spire is executed in. Defaults to\n    `process.cwd()`.\n  - `env` \\<[Object]\\> Set of environment variables. Defaults to `process.env`.\n  - `logger` \\<[Object]\\> Instance of\n    [Signale](https://github.com/klauscfhq/signale). Use `logger.debug()` to\n    print debug info which is only shown with `--debug` flag.\n  - `config` \\<[Object]\\> Parsed and normalised [config](#writing-a-config).\n  - `options` \\<[Object]\\> Parsed yargs options. Available only after `setup`\n    hook.\n\n## References\n\nThis project is inspired by the great work of JavaScript open source community\n(without particular order):\n\n- [Kent C. Dodds: Tools without config 🛠📦](https://blog.kentcdodds.com/automation-without-config-412ab5e47229)\n- [Dan Abramov: The Melting Pot of JavaScript](https://www.youtube.com/watch?v=nl30vWYKs9A)\n- [Jamie Kyle: Tools 4 Tools 4 Tools](https://www.youtube.com/watch?v=itI5xGyvtho)\n- [semantic-release](https://github.com/semantic-release/semantic-release)\n- [react-scripts](https://github.com/facebook/create-react-app/tree/next/packages/react-scripts)\n- [kcd-scripts](https://github.com/kentcdodds/kcd-scripts)\n- [bolt](https://github.com/boltpkg/bolt)\n\n## License\n\nMIT &copy; [ResearchGate](https://github.com/researchgate)\n\n[context]: #context\n[spire-config-default]:\n  https://github.com/researchgate/spire/blob/master/packages/spire-config-default\n[spire-plugin-yarn]:\n  https://github.com/researchgate/spire/blob/master/packages/spire-plugin-yarn\n[spire-plugin-clean]:\n  https://github.com/researchgate/spire/blob/master/packages/spire-plugin-clean\n[spire-plugin-doctoc]:\n  https://github.com/researchgate/spire/blob/master/packages/spire-plugin-doctoc\n[spire-plugin-eslint]:\n  https://github.com/researchgate/spire/blob/master/packages/spire-plugin-eslint\n[spire-plugin-semantic-release]:\n  https://github.com/researchgate/spire/blob/master/packages/spire-plugin-semantic-release\n[spire-plugin-lerna-release]:\n  https://github.com/researchgate/spire/blob/master/packages/spire-plugin-lerna-release\n[boolean]:\n  https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Boolean_type\n[string]:\n  https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type\n[array]:\n  https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array\n[object]:\n  https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object\n[function]:\n  https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function\n[promise]:\n  https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise\n[symbol]:\n  https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol\n[create-react-app]: https://github.com/facebook/create-react-app\n[yarn workspaces]: https://yarnpkg.com/lang/en/docs/workspaces/\n[lerna]: https://github.com/lerna/lerna\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/researchgate/spire/issues"},"homepage":"https://github.com/researchgate/spire#readme","_id":"spire@1.8.4-next.36","_nodeVersion":"12.13.1","_npmVersion":"lerna/3.18.3/node@v12.13.1+x64 (linux)","dist":{"integrity":"sha512-THJmbDRs2g6Af2f0YO/Mor8EfstxzufgFOZe3O2ciS6ERFUUjuLbwBtoDO98Ov31qJlowJ1O1zp1WZkbJpmWtA==","shasum":"2301fd4e1b57ccf792da557feafe4c8dc37be0a5","tarball":"https://registry.npmjs.org/spire/-/spire-1.8.4-next.36.tgz","fileCount":20,"unpackedSize":38631,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJd4UY4CRA9TVsSAnZWagAA/VUQAKIgMezxUomqMMFnsRn7\nYOwvEzt2aVUW/0kkp6CrWMmVOY+7afMrpES5ieaRFhGk+HmHo2r7a1O4ZQ2J\nsECcM1/caiuDAcRLXHphK4tqgXSOwPyCpzEUYSLz0k4h51AfN+ojFVE0LM7U\nj2JQu0BPNgxLaaCposo/ktSXntnRRDYXOd36IHrlWHY4GZuXtNfo68DitrhR\nMWy27HGUyiFa8rEjVVEMWVu/V1XPRGcQ2QLHrkpA/3R3jX8ZFQJbhEoBfN2Y\nd8UcxcoEXl70vKTFj01t0Zq4qRvmQzUCC2657xfUXuOSni+Q3cWnjtY77oob\n7pnSjyIpN+cJs9KVeBfUF8Bb1g53zlu+vQfGefSEs2xi9jTGqa53XOJr3MhN\ny89k8oCj4UsggkUNOzhNstJqlXl1gFs/G3OQ5+X2drcrr1x1+SR9UB/mKTCs\noaRB4X5lWaJe0jpDGusEIQU/ArshgImTZ8nIRSNunEUtNOFbKC21sKnHCOsL\njOrizr8VdTTPqMbcb6lOfAx7VgGTlLbuyh68jj+jCsgI8Bt2wYT15ZZ9Lxv3\noZ+j8ett4AGr+YNbuZoTuEIlewT2F3xegJMn0WTpxR1a9HVOu/GUvWQKnxnC\nZv7xNfxu5T6g26B43QCiI9dU9DhbWfEryMxrq8+axPAP0/K/MoijmKc4hi1C\nKUKe\r\n=gdbs\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDkGc+uMCVSej2rCVmz5wrVQxeMq/B2r+/xT+Ki+HB49QIgbv2LSvDDS7v4PBEWnp19Kd/UiRCeqiG7IRJdM7XHW0s="}]},"maintainers":[{"email":"daniel@tschinder.de","name":"danez"},{"email":"justnvdm@gmail.com","name":"justinvdm"},{"email":"sebastian.jerie@researchgate.net","name":"researchgate-bot"},{"email":"sergey@bekrin.me","name":"sbekrin"},{"email":"info@weaintplastic.com","name":"weaintplastic"}],"_npmUser":{"name":"researchgate-bot","email":"stefan.hoth@researchgate.net"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/spire_1.8.4-next.36_1575044663796_0.9882321121941522"},"_hasShrinkwrap":false},"1.8.4-next.38":{"name":"spire","version":"1.8.4-next.38","description":"Extensible CLI toolkit managment tool","main":"index.js","repository":{"type":"git","url":"git+https://github.com/researchgate/spire.git"},"author":{"name":"Sergey Bekrin","email":"sergey@bekrin.me","url":"https://bekrin.me"},"license":"MIT","bin":{"spire":"./bin/spire.js"},"engines":{"node":">=8.3"},"scripts":{"postinstall":"./bin/spire.js hook postinstall","preuninstall":"./bin/spire.js hook preuninstall"},"dependencies":{"cosmiconfig":"^6.0.0","detect-indent":"^6.0.0","fs-extra":"^8.1.0","import-from":"^3.0.0","invariant":"^2.2.4","pretty-format":"^24.7.0","signale":"^1.4.0","spire-config-default":"^1.8.3","yargs":"^15.0.0"},"devDependencies":{"spire-test-utils":"^1.8.2"},"prettier":"spire-plugin-prettier/config","gitHead":"4e86a2c40be58e4476f29ae4c2bfeda96bafee0e","readme":"# 🗼 Spire\n\nExtensible JavaScript toolbox management.\n\n<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->\n\n- [Motivation](#motivation)\n- [Quick Start](#quick-start)\n- [Configuration](#configuration)\n  - [Using a Custom Preset](#using-a-custom-preset)\n  - [Using a Local Preset](#using-a-local-preset)\n  - [Passing Options](#passing-options)\n- [Guides](#guides)\n  - [Writing a Config](#writing-a-config)\n  - [Writing a Plugin](#writing-a-plugin)\n  - [Migrating to Spire](#migrating-to-spire)\n  - [Using without Git](#using-without-git)\n  - [Using in monorepos](#using-in-monorepos)\n- [API](#api)\n  - [CLI](#cli)\n  - [`spire`](#spire)\n  - [`context`](#context)\n- [References](#references)\n- [License](#license)\n\n<!-- END doctoc generated TOC please keep comment here to allow auto update -->\n\n## Motivation\n\n**Problem:** Maintaining tools and configurations for linting, testing and\nbuilding your code is hard. The more projects you have, the more time it takes\nto keep your setup consistent and up-to-date.\n\n**Solution:** Spire is a pluggable CLI tool which allows you to abstract all of\nyour tools and configurations into reusable plugins and presets. Think of it as\n“babel for infrastructure”.\n\n## Quick Start\n\n1. Install `spire`:\n\n```sh\n# yarn\nyarn add --dev spire\n\n# npm\nnpm install --save-dev spire\n```\n\n2. Start using in your project:\n\n```sh\n# npx\nnpx spire --help\n\n# yarn\nyarn spire --help\n```\n\n3. Depending on your tech stack, you can start using Spire as zero-config tool.\n   See [spire-config-default] for a list of default tools and\n   [configuration section](#configuration) for how to customise it.\n\n- _Using yarn? Consider installing [spire-plugin-yarn] for few power features._\n\n- _Want to have automated release w/ changelog generation? Check out\n  [spire-plugin-semantic-release] and [spire-plugin-lerna-release] for lerna\n  monorepos._\n\n## Configuration\n\nSpire is based on config presets, which is the same concept for tools like\n[Babel](https://babeljs.io/) and [ESLint](https://eslint.org/). Configs are a\nset of predefined plugins and their options. Configs can also extend a chain of\nother configs. By default, Spire is shipped with [spire-config-default].\n\n### Using a Custom Preset\n\nTo use your preferred configuration, install it as dev dependency and reference\nit by module name in [`extends` property](#writing-a-config). To extend multiple\nconfigs, provide it as an array. You can also use individual plugins along with\nconfigs with [`plugins` property](#writing-a-config).\n\n<details open>\n  <summary>via <code>package.json#spire</code> (recommended)</summary>\n\n```json\n{\n  \"name\": \"acme-project\",\n  \"devDependencies\": {\n    \"spire\": \"^1.0.0\",\n    \"spire-config-acme\": \"^1.0.0\"\n  },\n  \"spire\": {\n    \"extends\": \"spire-config-acme\"\n  }\n}\n```\n\n</details>\n\n<details>\n  <summary>via <code>spire.config.js</code></summary>\n\n```js\nmodule.exports = {\n  extends: 'spire-config-acme',\n};\n```\n\n</details>\n\n<details>\n  <summary>via <code>.spirerc</code></summary>\n\n```js\n{\n  \"extends\": \"spire-config-acme\",\n}\n```\n\n</details>\n\n### Using a Local Preset\n\n_Note: It is recommended to enable Local Presets only for development._\n\nYou can reference a Local Preset or plugin using `<rootDir>` placeholder which\npoints to the current project directory:\n\n```json\n{\n  \"spire\": {\n    \"extends\": \"<rootDir>/spire-config.js\",\n    \"plugins\": [\"<rootDir>/spire-plugin.js\"]\n  }\n}\n```\n\n### Passing Options\n\nIf the config preset or plugin you're using supports customisation, you can pass\noptions to it:\n\n```json\n{\n  \"spire\": {\n    \"extends\": [[\"spire-config-acme\", { \"fictional\": false }]],\n    \"plugins\": [[\"spire-plugin-acme\", { \"company\": true }]]\n  }\n}\n```\n\n## Guides\n\n### Writing a Config\n\nA Config is a module which exports a function returning an object.\n\n- `config` \\<[function]([Object], [Object])\\>\n  - `spire` \\<[Object]\\> Spire [API object](#spire).\n  - `options` \\<[Object]\\> User-provided config options.\n- returns: \\<[Object]\\>\n  - `extends` \\<[string]|\\<[Array]\\<[string]\\>\\>\\> Config or an array of config\n    presets to extend.\n  - `plugins` \\<[Array]\\<[string]\\>\\> Array of plugins to include.\n\nExample:\n\n```js\nmodule.exports = (spire, options) => {\n  return {\n    extends: ['spire-config-first', 'spire-config-second'],\n    plugins: ['spire-plugin'],\n  };\n};\n```\n\nYou can dynamically change the behaviour of your preset based on `options` or\n`spire` APIs, but it's recommended to keep it explicit. Check\n[spire-config-default](https://github.com/researchgate/spire/blob/master/packages/spire-config-default/index.js)\nfor a reference.\n\n### Writing a Plugin\n\nA Plugin is a key component of Spire. After it resolves the config, Spire\naccumulates all plugins in chronological order and runs them. A Plugin is a\nfunction returning an object:\n\n_Note: It is recommended to keep plugins scoped to a single feature or tool._\n\n- `plugin` \\<[function]([Object], [Object])\\>\n  - `spire` \\<[Object]\\> Spire [API object](#spire).\n  - `options` \\<[Object]\\> User-provided plugin options.\n- returns: \\<[Object]\\>\n  - `name` \\<[string]\\> Name of the plugin (recommended).\n  - `command` \\<[string]\\> Optional name of command. Leaving it empty will\n    ignore `run` hook completly.\n  - `description` \\<[string]\\> Optional human-readable command description.\n  - `preinstall` \\<[function]\\([Context]\\): [Promise]\\> Executed before\n    `yarn install` or `npm install`\n  - `postinstall` \\<[function]\\([Context]\\): [Promise]\\> Executed after\n    `yarn install` or `npm install`.\n  - `postmerge` \\<[function]\\([Context]\\): [Promise]\\> Executed on `git pull`.\n  - `precommit` \\<[function]\\([Context]\\): [Promise]\\> Executed on `git commit`.\n  - `setup` \\<[function]\\([Context]\\): [Promise]\\> Executed before `run` hook.\n    Use it to prepare arguments or config for your tools. If it fails, Spire\n    stops futher hooks from being executed.\n  - `run` \\<[function]\\([Context]\\): [Promise]\\> Executed as the main logic of\n    the plugin. Use this hook to run the CLI tool or process long-running task.\n  - `teardown` \\<[function]\\([Context]\\): [Promise]\\> Executed after `run` hook,\n    even if it has failed. Use this hook to cleanup locally or to collect some\n    stats.\n  - `preuninstall` \\<[function]\\([Context]\\): [Promise]\\> Executed before\n    `yarn uninstall` or `npm uninstall`. Run it to cleanup external data.\n\nExample:\n\n```js\nmodule.exports = (spire, options) => {\n  return {\n    name: 'my-awesome-tool',\n    command: 'my-tool',\n    description: 'run my awesome tool',\n    async run({ logger }) {\n      logger.log('Hi from my awesome tool!');\n    },\n  };\n};\n```\n\nCheck [spire-plugin-clean], [spire-plugin-doctoc] and [spire-plugin-eslint] for\nmore plugin examples.\n\n### Migrating to Spire\n\n**Identify your tools:** To get started, gather a list of shared tools in your\nexisting projects. This will help to identify which plugins you'll need.\n\n**Pick preset or plugin:** Check if there's already a default or community\nplugin for that.\n[Search for `spire-plugin-*`](https://www.npmjs.com/search?q=spire-plugin-) on\nnpm for individual tools and\n[`spire-config-*`](https://www.npmjs.com/search?q=spire-config-) for specific\necosystems and tech stacks. In case if there's no suitable option for your,\ncheck on how to [write a custom plugin](#writing-a-plugin).\n\n**Make your own preset**: If you find that an existing or default preset works\nfor you, skip this step. If not, create a new module with a name matching\n`spire-config-*`. It can be specific for your personal projects, your company or\na tech stack. Check [writing a config](#writing-a-config) for instructions on\nhow to do this.\n\n**Migrate your projects**: Once you've got a preset ready, go through your\nprojects and [setup Spire](#quick-start) with it. Make sure to delete the\ndependencies it replaces. At this point you're done!\n\n### Using without Git\n\nAt the moment Spire has a hard dependency on a Git repository to resolve\nmonorepo project root. This most likely to be reviewed in the future, but\nmeanwhile it is part of the core, you can export `SKIP_PREFLIGHT_CHECK=true`\nenvironment variable to disable this check. The idea and name of this flag is\nborrowed from [create-react-app].\n\n### Using in monorepos\n\nIt is recommended to install Spire on the root level of a monorepo and run all\ncommands from there. The main motivation behind this is performance and\nconsistency reasons. You can still though run commands in an indivudual package.\nBelow is an example of how to run `spire lint` in a specific monorepo package:\n\n- With [yarn workspaces]:\n  ```sh\n  yarn workspace <pkg-name> spire lint\n  ```\n- With [lerna]:\n  ```sh\n  npx lerna --scope <pkg-name> exec spire lint\n  ```\n\n## API\n\n### CLI\n\nEach plugin can extend a list of available commands and their options. The list\nbelow only includes basic commands.\n\n- `npx spire --help` Prints the list of available commands.\n- `npx spire --version` Prints the current version of Spire.\n- `npx spire <cmd>` Runs a specific command defined by plugins.\n- `npx spire --debug <cmd>` Outputs additional debug information.\n- _(hidden)_ `npx spire hook <name>` Runs specific git or npm plugin hooks.\n  Available hooks are `postinstall`, `preuninstall`, `precommit` and\n  `postmerge`. Use this to test or debug your plugins.\n\n### `spire`\n\nSpire is an object which is passed as the first argument to both configs and\nplugins.\n\n- `spire`\n  - `setState` \\<[function]\\([Object]|[function]\\)\\> Sets state by merging it\n    with previous one (shallow).\n    - `state` \\<[Object]|[function]\\> New state as an object or a function which\n      recevies the previous state and returns an object. Usefull to avoid\n      `getState()` calls.\n  - `getState` \\<[function]\\(\\): [Object]\\> Returns current state.\n  - `hasFile` \\<[function]\\([string]\\): [Promise]\\<[boolean]\\>\\> Checks if\n    current projects contains specific file.\n  - `hasPackageProp` \\<[function]\\([string]\\): [Promise]\\<[boolean]\\>\\> Check if\n    current project's `package.json` contains specific prop.\n\n### `context`\n\nContext is an object which is passed as the first argument to plugin hooks. It's\ndesigned to be read-only. If you want to pass some data futher, consider using\n[`spire.setState` instead](#spire).\n\n- `context`\n  - `argv` \\<[Array]\\<[string]\\>\\> Array of arguments Spire was called with.\n    Defaults to `process.argv.slice(2)`.\n  - `cli` \\<[Object]\\> Instance of [yargs](http://yargs.js.org/) for adding\n    custom commands.\n  - `cwd` \\<[string]\\> Directory Spire is executed in. Defaults to\n    `process.cwd()`.\n  - `env` \\<[Object]\\> Set of environment variables. Defaults to `process.env`.\n  - `logger` \\<[Object]\\> Instance of\n    [Signale](https://github.com/klauscfhq/signale). Use `logger.debug()` to\n    print debug info which is only shown with `--debug` flag.\n  - `config` \\<[Object]\\> Parsed and normalised [config](#writing-a-config).\n  - `options` \\<[Object]\\> Parsed yargs options. Available only after `setup`\n    hook.\n\n## References\n\nThis project is inspired by the great work of JavaScript open source community\n(without particular order):\n\n- [Kent C. Dodds: Tools without config 🛠📦](https://blog.kentcdodds.com/automation-without-config-412ab5e47229)\n- [Dan Abramov: The Melting Pot of JavaScript](https://www.youtube.com/watch?v=nl30vWYKs9A)\n- [Jamie Kyle: Tools 4 Tools 4 Tools](https://www.youtube.com/watch?v=itI5xGyvtho)\n- [semantic-release](https://github.com/semantic-release/semantic-release)\n- [react-scripts](https://github.com/facebook/create-react-app/tree/next/packages/react-scripts)\n- [kcd-scripts](https://github.com/kentcdodds/kcd-scripts)\n- [bolt](https://github.com/boltpkg/bolt)\n\n## License\n\nMIT &copy; [ResearchGate](https://github.com/researchgate)\n\n[context]: #context\n[spire-config-default]:\n  https://github.com/researchgate/spire/blob/master/packages/spire-config-default\n[spire-plugin-yarn]:\n  https://github.com/researchgate/spire/blob/master/packages/spire-plugin-yarn\n[spire-plugin-clean]:\n  https://github.com/researchgate/spire/blob/master/packages/spire-plugin-clean\n[spire-plugin-doctoc]:\n  https://github.com/researchgate/spire/blob/master/packages/spire-plugin-doctoc\n[spire-plugin-eslint]:\n  https://github.com/researchgate/spire/blob/master/packages/spire-plugin-eslint\n[spire-plugin-semantic-release]:\n  https://github.com/researchgate/spire/blob/master/packages/spire-plugin-semantic-release\n[spire-plugin-lerna-release]:\n  https://github.com/researchgate/spire/blob/master/packages/spire-plugin-lerna-release\n[boolean]:\n  https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Boolean_type\n[string]:\n  https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type\n[array]:\n  https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array\n[object]:\n  https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object\n[function]:\n  https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function\n[promise]:\n  https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise\n[symbol]:\n  https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol\n[create-react-app]: https://github.com/facebook/create-react-app\n[yarn workspaces]: https://yarnpkg.com/lang/en/docs/workspaces/\n[lerna]: https://github.com/lerna/lerna\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/researchgate/spire/issues"},"homepage":"https://github.com/researchgate/spire#readme","_id":"spire@1.8.4-next.38","_nodeVersion":"12.13.1","_npmVersion":"lerna/3.19.0/node@v12.13.1+x64 (linux)","dist":{"integrity":"sha512-8lSjqq4GJ56GCf3fVZ790ybhzL2pX8ztHHFB//EmMuCoW+OwARY48X05zN9zUz1fmmhzvoLA3YA7aSWdzSgYiA==","shasum":"6e20a3ccfe3c3da09343a0627f1ddf132ba6ec3d","tarball":"https://registry.npmjs.org/spire/-/spire-1.8.4-next.38.tgz","fileCount":20,"unpackedSize":38659,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJd746ICRA9TVsSAnZWagAA0C8QAIxtq2XVp5MU4ZuKXeyj\nR7Q9CIHo5Rq2fthkL0vQnqD2rElozWo+AHj2jNCGJXDhJW4QV4+NveSe4VwY\nhYQckx6jSMaWWdKz8YSWHzLEBbHovEaMKggo8+6+BdLFyurg3wcBn1fRRl7b\nyxJ8n7ZG/iY6G4jZSd89AX9o1x2qgBdXt1HFD59nKsRSLTrVnHME+hPuVjg7\nPymql67jMcR+aUigcki3DCACDezx9lpGhPjPsYk+n0BjA3Bq0bgZ5atz6MaB\nVlH7YdIG/SbJArSPWjRxac+hK7LcB6O/wrLfvS7BHM6j9I2pYlfFcHRn420j\nLJ17pfpOxujSh4FtCLnrzuS+fUCqPlm6OL0R4/8pcn6rm86lHU5EJRwUzRIa\nq0D3OMnhWuJDs5wwgmPODY1cvi8rm6jMVUW4HGxVmz9RMKRilhnyU23mUN+d\nnz67Frz680C1Ts+dJPFcYqB+440516bj9/3At3MpLmZZRM590lxKTyw4OmbJ\nFl5waZsUA0tSdTaNyI/fHdqKkbIOGneHb7ZYJC/bv22vFl4sxDZIf8tSIGf+\n6mXfVfb38XduQ3uvvdVjDrpcua99frIZL6P386303DKC8ckRscviUHKrVt76\nuEwjVJ4RB4luKgLjwaamDarWs5xirw/SuBPLcVNFvleSIsvDc4UVLNq2re/A\nDT5m\r\n=C9Ol\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIG7C71BPLBz9QwjQSb7wT/iQdYGDB2G9efHS7KMEC6asAiA+Bf69xUGb3ZEGs9j2+Yh7KuMkjYA89MtxVZxkw2wshQ=="}]},"maintainers":[{"email":"daniel@tschinder.de","name":"danez"},{"email":"justnvdm@gmail.com","name":"justinvdm"},{"email":"sebastian.jerie@researchgate.net","name":"researchgate-bot"},{"email":"sergey@bekrin.me","name":"sbekrin"},{"email":"info@weaintplastic.com","name":"weaintplastic"}],"_npmUser":{"name":"researchgate-bot","email":"stefan.hoth@researchgate.net"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/spire_1.8.4-next.38_1575980679645_0.14129292224262113"},"_hasShrinkwrap":false},"1.8.4-next.41":{"name":"spire","version":"1.8.4-next.41","description":"Extensible CLI toolkit managment tool","main":"index.js","repository":{"type":"git","url":"git+https://github.com/researchgate/spire.git"},"author":{"name":"Sergey Bekrin","email":"sergey@bekrin.me","url":"https://bekrin.me"},"license":"MIT","bin":{"spire":"bin/spire.js"},"engines":{"node":">=10"},"scripts":{"postinstall":"./bin/spire.js hook postinstall","preuninstall":"./bin/spire.js hook preuninstall"},"dependencies":{"cosmiconfig":"^6.0.0","detect-indent":"^6.0.0","fs-extra":"^8.1.0","import-from":"^3.0.0","invariant":"^2.2.4","pretty-format":"^24.7.0","signale":"^1.4.0","spire-config-default":"^1.8.3","yargs":"^15.0.0"},"devDependencies":{"spire-test-utils":"^1.8.2"},"prettier":"spire-plugin-prettier/config","gitHead":"9fc401958e59f21e12a4081482bcf81b5ec15a2e","readme":"# 🗼 Spire\n\nExtensible JavaScript toolbox management.\n\n<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->\n\n- [Motivation](#motivation)\n- [Quick Start](#quick-start)\n- [Configuration](#configuration)\n  - [Using a Custom Preset](#using-a-custom-preset)\n  - [Using a Local Preset](#using-a-local-preset)\n  - [Passing Options](#passing-options)\n- [Guides](#guides)\n  - [Writing a Config](#writing-a-config)\n  - [Writing a Plugin](#writing-a-plugin)\n  - [Migrating to Spire](#migrating-to-spire)\n  - [Using without Git](#using-without-git)\n  - [Using in monorepos](#using-in-monorepos)\n- [API](#api)\n  - [CLI](#cli)\n  - [`spire`](#spire)\n  - [`context`](#context)\n- [References](#references)\n- [License](#license)\n\n<!-- END doctoc generated TOC please keep comment here to allow auto update -->\n\n## Motivation\n\n**Problem:** Maintaining tools and configurations for linting, testing and\nbuilding your code is hard. The more projects you have, the more time it takes\nto keep your setup consistent and up-to-date.\n\n**Solution:** Spire is a pluggable CLI tool which allows you to abstract all of\nyour tools and configurations into reusable plugins and presets. Think of it as\n“babel for infrastructure”.\n\n## Quick Start\n\n1. Install `spire`:\n\n```sh\n# yarn\nyarn add --dev spire\n\n# npm\nnpm install --save-dev spire\n```\n\n2. Start using in your project:\n\n```sh\n# npx\nnpx spire --help\n\n# yarn\nyarn spire --help\n```\n\n3. Depending on your tech stack, you can start using Spire as zero-config tool.\n   See [spire-config-default] for a list of default tools and\n   [configuration section](#configuration) for how to customise it.\n\n- _Using yarn? Consider installing [spire-plugin-yarn] for few power features._\n\n- _Want to have automated release w/ changelog generation? Check out\n  [spire-plugin-semantic-release] and [spire-plugin-lerna-release] for lerna\n  monorepos._\n\n## Configuration\n\nSpire is based on config presets, which is the same concept for tools like\n[Babel](https://babeljs.io/) and [ESLint](https://eslint.org/). Configs are a\nset of predefined plugins and their options. Configs can also extend a chain of\nother configs. By default, Spire is shipped with [spire-config-default].\n\n### Using a Custom Preset\n\nTo use your preferred configuration, install it as dev dependency and reference\nit by module name in [`extends` property](#writing-a-config). To extend multiple\nconfigs, provide it as an array. You can also use individual plugins along with\nconfigs with [`plugins` property](#writing-a-config).\n\n<details open>\n  <summary>via <code>package.json#spire</code> (recommended)</summary>\n\n```json\n{\n  \"name\": \"acme-project\",\n  \"devDependencies\": {\n    \"spire\": \"^1.0.0\",\n    \"spire-config-acme\": \"^1.0.0\"\n  },\n  \"spire\": {\n    \"extends\": \"spire-config-acme\"\n  }\n}\n```\n\n</details>\n\n<details>\n  <summary>via <code>spire.config.js</code></summary>\n\n```js\nmodule.exports = {\n  extends: 'spire-config-acme',\n};\n```\n\n</details>\n\n<details>\n  <summary>via <code>.spirerc</code></summary>\n\n```js\n{\n  \"extends\": \"spire-config-acme\",\n}\n```\n\n</details>\n\n### Using a Local Preset\n\n_Note: It is recommended to enable Local Presets only for development._\n\nYou can reference a Local Preset or plugin using `<rootDir>` placeholder which\npoints to the current project directory:\n\n```json\n{\n  \"spire\": {\n    \"extends\": \"<rootDir>/spire-config.js\",\n    \"plugins\": [\"<rootDir>/spire-plugin.js\"]\n  }\n}\n```\n\n### Passing Options\n\nIf the config preset or plugin you're using supports customisation, you can pass\noptions to it:\n\n```json\n{\n  \"spire\": {\n    \"extends\": [[\"spire-config-acme\", { \"fictional\": false }]],\n    \"plugins\": [[\"spire-plugin-acme\", { \"company\": true }]]\n  }\n}\n```\n\n## Guides\n\n### Writing a Config\n\nA Config is a module which exports a function returning an object.\n\n- `config` \\<[function]([Object], [Object])\\>\n  - `spire` \\<[Object]\\> Spire [API object](#spire).\n  - `options` \\<[Object]\\> User-provided config options.\n- returns: \\<[Object]\\>\n  - `extends` \\<[string]|\\<[Array]\\<[string]\\>\\>\\> Config or an array of config\n    presets to extend.\n  - `plugins` \\<[Array]\\<[string]\\>\\> Array of plugins to include.\n\nExample:\n\n```js\nmodule.exports = (spire, options) => {\n  return {\n    extends: ['spire-config-first', 'spire-config-second'],\n    plugins: ['spire-plugin'],\n  };\n};\n```\n\nYou can dynamically change the behaviour of your preset based on `options` or\n`spire` APIs, but it's recommended to keep it explicit. Check\n[spire-config-default](https://github.com/researchgate/spire/blob/master/packages/spire-config-default/index.js)\nfor a reference.\n\n### Writing a Plugin\n\nA Plugin is a key component of Spire. After it resolves the config, Spire\naccumulates all plugins in chronological order and runs them. A Plugin is a\nfunction returning an object:\n\n_Note: It is recommended to keep plugins scoped to a single feature or tool._\n\n- `plugin` \\<[function]([Object], [Object])\\>\n  - `spire` \\<[Object]\\> Spire [API object](#spire).\n  - `options` \\<[Object]\\> User-provided plugin options.\n- returns: \\<[Object]\\>\n  - `name` \\<[string]\\> Name of the plugin (recommended).\n  - `command` \\<[string]\\> Optional name of command. Leaving it empty will\n    ignore `run` hook completly.\n  - `description` \\<[string]\\> Optional human-readable command description.\n  - `preinstall` \\<[function]\\([Context]\\): [Promise]\\> Executed before\n    `yarn install` or `npm install`\n  - `postinstall` \\<[function]\\([Context]\\): [Promise]\\> Executed after\n    `yarn install` or `npm install`.\n  - `postmerge` \\<[function]\\([Context]\\): [Promise]\\> Executed on `git pull`.\n  - `precommit` \\<[function]\\([Context]\\): [Promise]\\> Executed on `git commit`.\n  - `setup` \\<[function]\\([Context]\\): [Promise]\\> Executed before `run` hook.\n    Use it to prepare arguments or config for your tools. If it fails, Spire\n    stops futher hooks from being executed.\n  - `run` \\<[function]\\([Context]\\): [Promise]\\> Executed as the main logic of\n    the plugin. Use this hook to run the CLI tool or process long-running task.\n  - `teardown` \\<[function]\\([Context]\\): [Promise]\\> Executed after `run` hook,\n    even if it has failed. Use this hook to cleanup locally or to collect some\n    stats.\n  - `preuninstall` \\<[function]\\([Context]\\): [Promise]\\> Executed before\n    `yarn uninstall` or `npm uninstall`. Run it to cleanup external data.\n\nExample:\n\n```js\nmodule.exports = (spire, options) => {\n  return {\n    name: 'my-awesome-tool',\n    command: 'my-tool',\n    description: 'run my awesome tool',\n    async run({ logger }) {\n      logger.log('Hi from my awesome tool!');\n    },\n  };\n};\n```\n\nCheck [spire-plugin-clean], [spire-plugin-doctoc] and [spire-plugin-eslint] for\nmore plugin examples.\n\n### Migrating to Spire\n\n**Identify your tools:** To get started, gather a list of shared tools in your\nexisting projects. This will help to identify which plugins you'll need.\n\n**Pick preset or plugin:** Check if there's already a default or community\nplugin for that.\n[Search for `spire-plugin-*`](https://www.npmjs.com/search?q=spire-plugin-) on\nnpm for individual tools and\n[`spire-config-*`](https://www.npmjs.com/search?q=spire-config-) for specific\necosystems and tech stacks. In case if there's no suitable option for your,\ncheck on how to [write a custom plugin](#writing-a-plugin).\n\n**Make your own preset**: If you find that an existing or default preset works\nfor you, skip this step. If not, create a new module with a name matching\n`spire-config-*`. It can be specific for your personal projects, your company or\na tech stack. Check [writing a config](#writing-a-config) for instructions on\nhow to do this.\n\n**Migrate your projects**: Once you've got a preset ready, go through your\nprojects and [setup Spire](#quick-start) with it. Make sure to delete the\ndependencies it replaces. At this point you're done!\n\n### Using without Git\n\nAt the moment Spire has a hard dependency on a Git repository to resolve\nmonorepo project root. This most likely to be reviewed in the future, but\nmeanwhile it is part of the core, you can export `SKIP_PREFLIGHT_CHECK=true`\nenvironment variable to disable this check. The idea and name of this flag is\nborrowed from [create-react-app].\n\n### Using in monorepos\n\nIt is recommended to install Spire on the root level of a monorepo and run all\ncommands from there. The main motivation behind this is performance and\nconsistency reasons. You can still though run commands in an indivudual package.\nBelow is an example of how to run `spire lint` in a specific monorepo package:\n\n- With [yarn workspaces]:\n  ```sh\n  yarn workspace <pkg-name> spire lint\n  ```\n- With [lerna]:\n  ```sh\n  npx lerna --scope <pkg-name> exec spire lint\n  ```\n\n## API\n\n### CLI\n\nEach plugin can extend a list of available commands and their options. The list\nbelow only includes basic commands.\n\n- `npx spire --help` Prints the list of available commands.\n- `npx spire --version` Prints the current version of Spire.\n- `npx spire <cmd>` Runs a specific command defined by plugins.\n- `npx spire --debug <cmd>` Outputs additional debug information.\n- _(hidden)_ `npx spire hook <name>` Runs specific git or npm plugin hooks.\n  Available hooks are `postinstall`, `preuninstall`, `precommit` and\n  `postmerge`. Use this to test or debug your plugins.\n\n### `spire`\n\nSpire is an object which is passed as the first argument to both configs and\nplugins.\n\n- `spire`\n  - `setState` \\<[function]\\([Object]|[function]\\)\\> Sets state by merging it\n    with previous one (shallow).\n    - `state` \\<[Object]|[function]\\> New state as an object or a function which\n      recevies the previous state and returns an object. Usefull to avoid\n      `getState()` calls.\n  - `getState` \\<[function]\\(\\): [Object]\\> Returns current state.\n  - `hasFile` \\<[function]\\([string]\\): [Promise]\\<[boolean]\\>\\> Checks if\n    current projects contains specific file.\n  - `hasPackageProp` \\<[function]\\([string]\\): [Promise]\\<[boolean]\\>\\> Check if\n    current project's `package.json` contains specific prop.\n\n### `context`\n\nContext is an object which is passed as the first argument to plugin hooks. It's\ndesigned to be read-only. If you want to pass some data futher, consider using\n[`spire.setState` instead](#spire).\n\n- `context`\n  - `argv` \\<[Array]\\<[string]\\>\\> Array of arguments Spire was called with.\n    Defaults to `process.argv.slice(2)`.\n  - `cli` \\<[Object]\\> Instance of [yargs](http://yargs.js.org/) for adding\n    custom commands.\n  - `cwd` \\<[string]\\> Directory Spire is executed in. Defaults to\n    `process.cwd()`.\n  - `env` \\<[Object]\\> Set of environment variables. Defaults to `process.env`.\n  - `logger` \\<[Object]\\> Instance of\n    [Signale](https://github.com/klauscfhq/signale). Use `logger.debug()` to\n    print debug info which is only shown with `--debug` flag.\n  - `config` \\<[Object]\\> Parsed and normalised [config](#writing-a-config).\n  - `options` \\<[Object]\\> Parsed yargs options. Available only after `setup`\n    hook.\n\n## References\n\nThis project is inspired by the great work of JavaScript open source community\n(without particular order):\n\n- [Kent C. Dodds: Tools without config 🛠📦](https://blog.kentcdodds.com/automation-without-config-412ab5e47229)\n- [Dan Abramov: The Melting Pot of JavaScript](https://www.youtube.com/watch?v=nl30vWYKs9A)\n- [Jamie Kyle: Tools 4 Tools 4 Tools](https://www.youtube.com/watch?v=itI5xGyvtho)\n- [semantic-release](https://github.com/semantic-release/semantic-release)\n- [react-scripts](https://github.com/facebook/create-react-app/tree/next/packages/react-scripts)\n- [kcd-scripts](https://github.com/kentcdodds/kcd-scripts)\n- [bolt](https://github.com/boltpkg/bolt)\n\n## License\n\nMIT &copy; [ResearchGate](https://github.com/researchgate)\n\n[context]: #context\n[spire-config-default]:\n  https://github.com/researchgate/spire/blob/master/packages/spire-config-default\n[spire-plugin-yarn]:\n  https://github.com/researchgate/spire/blob/master/packages/spire-plugin-yarn\n[spire-plugin-clean]:\n  https://github.com/researchgate/spire/blob/master/packages/spire-plugin-clean\n[spire-plugin-doctoc]:\n  https://github.com/researchgate/spire/blob/master/packages/spire-plugin-doctoc\n[spire-plugin-eslint]:\n  https://github.com/researchgate/spire/blob/master/packages/spire-plugin-eslint\n[spire-plugin-semantic-release]:\n  https://github.com/researchgate/spire/blob/master/packages/spire-plugin-semantic-release\n[spire-plugin-lerna-release]:\n  https://github.com/researchgate/spire/blob/master/packages/spire-plugin-lerna-release\n[boolean]:\n  https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Boolean_type\n[string]:\n  https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type\n[array]:\n  https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array\n[object]:\n  https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object\n[function]:\n  https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function\n[promise]:\n  https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise\n[symbol]:\n  https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol\n[create-react-app]: https://github.com/facebook/create-react-app\n[yarn workspaces]: https://yarnpkg.com/lang/en/docs/workspaces/\n[lerna]: https://github.com/lerna/lerna\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/researchgate/spire/issues"},"homepage":"https://github.com/researchgate/spire#readme","_id":"spire@1.8.4-next.41","_nodeVersion":"12.14.0","_npmVersion":"lerna/3.20.2/node@v12.14.0+x64 (linux)","dist":{"integrity":"sha512-qJ3qy1OxEfzD6A2H6GYFWm+x/TSKMktp43wQHZji4UkEjjSWljdkqIy2SEi0AVboC93IruX6GZ1/g00pJ4W7Yg==","shasum":"98c1570b7ec284b9d11dd6f0d281071ab08f8599","tarball":"https://registry.npmjs.org/spire/-/spire-1.8.4-next.41.tgz","fileCount":20,"unpackedSize":38650,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeEi95CRA9TVsSAnZWagAAlEkQAJbGAvyTXCCeqyMye5ld\nMG5TPKxLQ+VhYh5lj+Uu/jnGZvIcKZh/UiV/tZ/hgG/81ztR3h2q8TR0wWZb\nlFtiej3QXasiZUn1SuW+QsRLV4P2OOoO3KOWjTylFnobA0aVwP13ZxDY5WbB\nugE8Qehw/Nuws0YRsyxVMbarxMynxaZXomf7Ze91ThrQrUyCZbvxglaQ0p6P\niPMT/o7ZyUbt5axc5+kQ63AFWKr6wUBTEGmcB3H9oPIqECxsyfOMFCz2fmwn\nQ3XcEkz0+WULm/etWR3C9M+MEJ9yWOSmHEFem0XB4PKcW6+jAuG30pyrDrhA\nDogXzSXgS5tlkaem1sXFXQVYgWSAr7Un1y7eFqVLiaO0BgMNFd4spFkIdCO1\n2vpef14H6q+luA1JMRLOvFh9MW4pLkmW43DYQThBmiUvE4/HJC05BCsdX3Gt\nueac8qs7d/4ShVyoSnuaxxscl5LFyFQ1dVY5arFWoU6cfJZJ7RBveMFEaWaF\nzWy1ITjtkkWqJ9ZDLHgI77jOq4ATIodPPBPNoTJySnGMAumTCkHZKS3o31tl\nqRZag95EmdpwoKNicUC2V5AlL0KpZmUxGek70OtkHD+wi4MqiHqc7A7wH9hA\na+OGHiZ4emgfRR2jvKAYR4eHZpsrXdrEqNXmxgQNcLJKDkr1tKSX52ExnsDu\nfn8C\r\n=B5Kw\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCBF6ya+fbx6QHSJEIAl1KNu0Sc8kcb2bn4tbHjfeEX4gIhANIRzn61752uai93FWElrkBzT5weQkYFc4O6aixYDi8F"}]},"maintainers":[{"email":"daniel@tschinder.de","name":"danez"},{"email":"justnvdm@gmail.com","name":"justinvdm"},{"email":"sebastian.jerie@researchgate.net","name":"researchgate-bot"},{"email":"sergey@bekrin.me","name":"sbekrin"},{"email":"info@weaintplastic.com","name":"weaintplastic"}],"_npmUser":{"name":"researchgate-bot","email":"stefan.hoth@researchgate.net"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/spire_1.8.4-next.41_1578250105418_0.2719480086470323"},"_hasShrinkwrap":false},"1.8.4-next.42":{"name":"spire","version":"1.8.4-next.42","description":"Extensible CLI toolkit managment tool","main":"index.js","repository":{"type":"git","url":"git+https://github.com/researchgate/spire.git"},"author":{"name":"Sergey Bekrin","email":"sergey@bekrin.me","url":"https://bekrin.me"},"license":"MIT","bin":{"spire":"bin/spire.js"},"engines":{"node":">=10"},"scripts":{"postinstall":"./bin/spire.js hook postinstall","preuninstall":"./bin/spire.js hook preuninstall"},"dependencies":{"cosmiconfig":"^6.0.0","detect-indent":"^6.0.0","fs-extra":"^8.1.0","import-from":"^3.0.0","invariant":"^2.2.4","pretty-format":"^24.7.0","signale":"^1.4.0","spire-config-default":"^1.8.4-next.42+ea9e466","yargs":"^15.0.0"},"devDependencies":{"spire-test-utils":"^1.8.2"},"prettier":"spire-plugin-prettier/config","gitHead":"ea9e4661175ef269fad1893c4a93ee1134eb79f8","readme":"# 🗼 Spire\n\nExtensible JavaScript toolbox management.\n\n<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->\n\n- [Motivation](#motivation)\n- [Quick Start](#quick-start)\n- [Configuration](#configuration)\n  - [Using a Custom Preset](#using-a-custom-preset)\n  - [Using a Local Preset](#using-a-local-preset)\n  - [Passing Options](#passing-options)\n- [Guides](#guides)\n  - [Writing a Config](#writing-a-config)\n  - [Writing a Plugin](#writing-a-plugin)\n  - [Migrating to Spire](#migrating-to-spire)\n  - [Using without Git](#using-without-git)\n  - [Using in monorepos](#using-in-monorepos)\n- [API](#api)\n  - [CLI](#cli)\n  - [`spire`](#spire)\n  - [`context`](#context)\n- [References](#references)\n- [License](#license)\n\n<!-- END doctoc generated TOC please keep comment here to allow auto update -->\n\n## Motivation\n\n**Problem:** Maintaining tools and configurations for linting, testing and\nbuilding your code is hard. The more projects you have, the more time it takes\nto keep your setup consistent and up-to-date.\n\n**Solution:** Spire is a pluggable CLI tool which allows you to abstract all of\nyour tools and configurations into reusable plugins and presets. Think of it as\n“babel for infrastructure”.\n\n## Quick Start\n\n1. Install `spire`:\n\n```sh\n# yarn\nyarn add --dev spire\n\n# npm\nnpm install --save-dev spire\n```\n\n2. Start using in your project:\n\n```sh\n# npx\nnpx spire --help\n\n# yarn\nyarn spire --help\n```\n\n3. Depending on your tech stack, you can start using Spire as zero-config tool.\n   See [spire-config-default] for a list of default tools and\n   [configuration section](#configuration) for how to customise it.\n\n- _Using yarn? Consider installing [spire-plugin-yarn] for few power features._\n\n- _Want to have automated release w/ changelog generation? Check out\n  [spire-plugin-semantic-release] and [spire-plugin-lerna-release] for lerna\n  monorepos._\n\n## Configuration\n\nSpire is based on config presets, which is the same concept for tools like\n[Babel](https://babeljs.io/) and [ESLint](https://eslint.org/). Configs are a\nset of predefined plugins and their options. Configs can also extend a chain of\nother configs. By default, Spire is shipped with [spire-config-default].\n\n### Using a Custom Preset\n\nTo use your preferred configuration, install it as dev dependency and reference\nit by module name in [`extends` property](#writing-a-config). To extend multiple\nconfigs, provide it as an array. You can also use individual plugins along with\nconfigs with [`plugins` property](#writing-a-config).\n\n<details open>\n  <summary>via <code>package.json#spire</code> (recommended)</summary>\n\n```json\n{\n  \"name\": \"acme-project\",\n  \"devDependencies\": {\n    \"spire\": \"^1.0.0\",\n    \"spire-config-acme\": \"^1.0.0\"\n  },\n  \"spire\": {\n    \"extends\": \"spire-config-acme\"\n  }\n}\n```\n\n</details>\n\n<details>\n  <summary>via <code>spire.config.js</code></summary>\n\n```js\nmodule.exports = {\n  extends: 'spire-config-acme',\n};\n```\n\n</details>\n\n<details>\n  <summary>via <code>.spirerc</code></summary>\n\n```js\n{\n  \"extends\": \"spire-config-acme\",\n}\n```\n\n</details>\n\n### Using a Local Preset\n\n_Note: It is recommended to enable Local Presets only for development._\n\nYou can reference a Local Preset or plugin using `<rootDir>` placeholder which\npoints to the current project directory:\n\n```json\n{\n  \"spire\": {\n    \"extends\": \"<rootDir>/spire-config.js\",\n    \"plugins\": [\"<rootDir>/spire-plugin.js\"]\n  }\n}\n```\n\n### Passing Options\n\nIf the config preset or plugin you're using supports customisation, you can pass\noptions to it:\n\n```json\n{\n  \"spire\": {\n    \"extends\": [[\"spire-config-acme\", { \"fictional\": false }]],\n    \"plugins\": [[\"spire-plugin-acme\", { \"company\": true }]]\n  }\n}\n```\n\n## Guides\n\n### Writing a Config\n\nA Config is a module which exports a function returning an object.\n\n- `config` \\<[function]([Object], [Object])\\>\n  - `spire` \\<[Object]\\> Spire [API object](#spire).\n  - `options` \\<[Object]\\> User-provided config options.\n- returns: \\<[Object]\\>\n  - `extends` \\<[string]|\\<[Array]\\<[string]\\>\\>\\> Config or an array of config\n    presets to extend.\n  - `plugins` \\<[Array]\\<[string]\\>\\> Array of plugins to include.\n\nExample:\n\n```js\nmodule.exports = (spire, options) => {\n  return {\n    extends: ['spire-config-first', 'spire-config-second'],\n    plugins: ['spire-plugin'],\n  };\n};\n```\n\nYou can dynamically change the behaviour of your preset based on `options` or\n`spire` APIs, but it's recommended to keep it explicit. Check\n[spire-config-default](https://github.com/researchgate/spire/blob/master/packages/spire-config-default/index.js)\nfor a reference.\n\n### Writing a Plugin\n\nA Plugin is a key component of Spire. After it resolves the config, Spire\naccumulates all plugins in chronological order and runs them. A Plugin is a\nfunction returning an object:\n\n_Note: It is recommended to keep plugins scoped to a single feature or tool._\n\n- `plugin` \\<[function]([Object], [Object])\\>\n  - `spire` \\<[Object]\\> Spire [API object](#spire).\n  - `options` \\<[Object]\\> User-provided plugin options.\n- returns: \\<[Object]\\>\n  - `name` \\<[string]\\> Name of the plugin (recommended).\n  - `command` \\<[string]\\> Optional name of command. Leaving it empty will\n    ignore `run` hook completly.\n  - `description` \\<[string]\\> Optional human-readable command description.\n  - `preinstall` \\<[function]\\([Context]\\): [Promise]\\> Executed before\n    `yarn install` or `npm install`\n  - `postinstall` \\<[function]\\([Context]\\): [Promise]\\> Executed after\n    `yarn install` or `npm install`.\n  - `postmerge` \\<[function]\\([Context]\\): [Promise]\\> Executed on `git pull`.\n  - `precommit` \\<[function]\\([Context]\\): [Promise]\\> Executed on `git commit`.\n  - `setup` \\<[function]\\([Context]\\): [Promise]\\> Executed before `run` hook.\n    Use it to prepare arguments or config for your tools. If it fails, Spire\n    stops futher hooks from being executed.\n  - `run` \\<[function]\\([Context]\\): [Promise]\\> Executed as the main logic of\n    the plugin. Use this hook to run the CLI tool or process long-running task.\n  - `teardown` \\<[function]\\([Context]\\): [Promise]\\> Executed after `run` hook,\n    even if it has failed. Use this hook to cleanup locally or to collect some\n    stats.\n  - `preuninstall` \\<[function]\\([Context]\\): [Promise]\\> Executed before\n    `yarn uninstall` or `npm uninstall`. Run it to cleanup external data.\n\nExample:\n\n```js\nmodule.exports = (spire, options) => {\n  return {\n    name: 'my-awesome-tool',\n    command: 'my-tool',\n    description: 'run my awesome tool',\n    async run({ logger }) {\n      logger.log('Hi from my awesome tool!');\n    },\n  };\n};\n```\n\nCheck [spire-plugin-clean], [spire-plugin-doctoc] and [spire-plugin-eslint] for\nmore plugin examples.\n\n### Migrating to Spire\n\n**Identify your tools:** To get started, gather a list of shared tools in your\nexisting projects. This will help to identify which plugins you'll need.\n\n**Pick preset or plugin:** Check if there's already a default or community\nplugin for that.\n[Search for `spire-plugin-*`](https://www.npmjs.com/search?q=spire-plugin-) on\nnpm for individual tools and\n[`spire-config-*`](https://www.npmjs.com/search?q=spire-config-) for specific\necosystems and tech stacks. In case if there's no suitable option for your,\ncheck on how to [write a custom plugin](#writing-a-plugin).\n\n**Make your own preset**: If you find that an existing or default preset works\nfor you, skip this step. If not, create a new module with a name matching\n`spire-config-*`. It can be specific for your personal projects, your company or\na tech stack. Check [writing a config](#writing-a-config) for instructions on\nhow to do this.\n\n**Migrate your projects**: Once you've got a preset ready, go through your\nprojects and [setup Spire](#quick-start) with it. Make sure to delete the\ndependencies it replaces. At this point you're done!\n\n### Using without Git\n\nAt the moment Spire has a hard dependency on a Git repository to resolve\nmonorepo project root. This most likely to be reviewed in the future, but\nmeanwhile it is part of the core, you can export `SKIP_PREFLIGHT_CHECK=true`\nenvironment variable to disable this check. The idea and name of this flag is\nborrowed from [create-react-app].\n\n### Using in monorepos\n\nIt is recommended to install Spire on the root level of a monorepo and run all\ncommands from there. The main motivation behind this is performance and\nconsistency reasons. You can still though run commands in an indivudual package.\nBelow is an example of how to run `spire lint` in a specific monorepo package:\n\n- With [yarn workspaces]:\n  ```sh\n  yarn workspace <pkg-name> spire lint\n  ```\n- With [lerna]:\n  ```sh\n  npx lerna --scope <pkg-name> exec spire lint\n  ```\n\n## API\n\n### CLI\n\nEach plugin can extend a list of available commands and their options. The list\nbelow only includes basic commands.\n\n- `npx spire --help` Prints the list of available commands.\n- `npx spire --version` Prints the current version of Spire.\n- `npx spire <cmd>` Runs a specific command defined by plugins.\n- `npx spire --debug <cmd>` Outputs additional debug information.\n- _(hidden)_ `npx spire hook <name>` Runs specific git or npm plugin hooks.\n  Available hooks are `postinstall`, `preuninstall`, `precommit` and\n  `postmerge`. Use this to test or debug your plugins.\n\n### `spire`\n\nSpire is an object which is passed as the first argument to both configs and\nplugins.\n\n- `spire`\n  - `setState` \\<[function]\\([Object]|[function]\\)\\> Sets state by merging it\n    with previous one (shallow).\n    - `state` \\<[Object]|[function]\\> New state as an object or a function which\n      recevies the previous state and returns an object. Usefull to avoid\n      `getState()` calls.\n  - `getState` \\<[function]\\(\\): [Object]\\> Returns current state.\n  - `hasFile` \\<[function]\\([string]\\): [Promise]\\<[boolean]\\>\\> Checks if\n    current projects contains specific file.\n  - `hasPackageProp` \\<[function]\\([string]\\): [Promise]\\<[boolean]\\>\\> Check if\n    current project's `package.json` contains specific prop.\n\n### `context`\n\nContext is an object which is passed as the first argument to plugin hooks. It's\ndesigned to be read-only. If you want to pass some data futher, consider using\n[`spire.setState` instead](#spire).\n\n- `context`\n  - `argv` \\<[Array]\\<[string]\\>\\> Array of arguments Spire was called with.\n    Defaults to `process.argv.slice(2)`.\n  - `cli` \\<[Object]\\> Instance of [yargs](http://yargs.js.org/) for adding\n    custom commands.\n  - `cwd` \\<[string]\\> Directory Spire is executed in. Defaults to\n    `process.cwd()`.\n  - `env` \\<[Object]\\> Set of environment variables. Defaults to `process.env`.\n  - `logger` \\<[Object]\\> Instance of\n    [Signale](https://github.com/klauscfhq/signale). Use `logger.debug()` to\n    print debug info which is only shown with `--debug` flag.\n  - `config` \\<[Object]\\> Parsed and normalised [config](#writing-a-config).\n  - `options` \\<[Object]\\> Parsed yargs options. Available only after `setup`\n    hook.\n\n## References\n\nThis project is inspired by the great work of JavaScript open source community\n(without particular order):\n\n- [Kent C. Dodds: Tools without config 🛠📦](https://blog.kentcdodds.com/automation-without-config-412ab5e47229)\n- [Dan Abramov: The Melting Pot of JavaScript](https://www.youtube.com/watch?v=nl30vWYKs9A)\n- [Jamie Kyle: Tools 4 Tools 4 Tools](https://www.youtube.com/watch?v=itI5xGyvtho)\n- [semantic-release](https://github.com/semantic-release/semantic-release)\n- [react-scripts](https://github.com/facebook/create-react-app/tree/next/packages/react-scripts)\n- [kcd-scripts](https://github.com/kentcdodds/kcd-scripts)\n- [bolt](https://github.com/boltpkg/bolt)\n\n## License\n\nMIT &copy; [ResearchGate](https://github.com/researchgate)\n\n[context]: #context\n[spire-config-default]:\n  https://github.com/researchgate/spire/blob/master/packages/spire-config-default\n[spire-plugin-yarn]:\n  https://github.com/researchgate/spire/blob/master/packages/spire-plugin-yarn\n[spire-plugin-clean]:\n  https://github.com/researchgate/spire/blob/master/packages/spire-plugin-clean\n[spire-plugin-doctoc]:\n  https://github.com/researchgate/spire/blob/master/packages/spire-plugin-doctoc\n[spire-plugin-eslint]:\n  https://github.com/researchgate/spire/blob/master/packages/spire-plugin-eslint\n[spire-plugin-semantic-release]:\n  https://github.com/researchgate/spire/blob/master/packages/spire-plugin-semantic-release\n[spire-plugin-lerna-release]:\n  https://github.com/researchgate/spire/blob/master/packages/spire-plugin-lerna-release\n[boolean]:\n  https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Boolean_type\n[string]:\n  https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type\n[array]:\n  https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array\n[object]:\n  https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object\n[function]:\n  https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function\n[promise]:\n  https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise\n[symbol]:\n  https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol\n[create-react-app]: https://github.com/facebook/create-react-app\n[yarn workspaces]: https://yarnpkg.com/lang/en/docs/workspaces/\n[lerna]: https://github.com/lerna/lerna\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/researchgate/spire/issues"},"homepage":"https://github.com/researchgate/spire#readme","_id":"spire@1.8.4-next.42","_nodeVersion":"12.14.0","_npmVersion":"lerna/3.20.2/node@v12.14.0+x64 (linux)","dist":{"integrity":"sha512-ickz0pv/0IySmgjnRcRyLLzRK6u1Kc5+pzL9ro/WMGdNymha2SYDs75A0lz245uat6GKZLOeewHXx2UH15VV2w==","shasum":"da90f43805a4df60aed5605ee6972c2c378dd25b","tarball":"https://registry.npmjs.org/spire/-/spire-1.8.4-next.42.tgz","fileCount":20,"unpackedSize":38666,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeEjTWCRA9TVsSAnZWagAAYt0P/RvlRdPhCTN4tB4YqY4z\n8rfUKchvz638f5QXWjII1+K7xs/xLpG6izjEj/yejPkyC/mqbS1pHVzG+vus\n4tflU/jYhKVe8V2Nd1O6oCOSz3XwieeZNlF+SZbsf3ujR+8JCsFa3KYRP6il\nr4TnRZJIkclexRuR0BcwuGpw27H2RNtYznG80AiJLTbrAVgUj1POf5o/d5QU\nyG0tiN7EOFVv7kwVtQs8nbTPKa4M/4GFARv6zFMxOGrJb1sVhAtxpvpcEMqq\n0qitCTWAe0rfJmzWriius4sGVWkqcawm1Qvp87N9QLtVi8xHK1XB4prUmsW7\nIEZYJk3MRZjQ8P4WNZN8lpONi086iZLccf5F50O0hs4OMFUCk2bortsABVgu\nJg5uH7zK8C8fnqa6zqCHAR+i+8HyzTXbImxba78L3yTZGof8mOx/bf1+nqTa\nXErMhH0ltXCs3ahfRycNsGbQgUXMRFmPWKkFXlEjavszy1FgxrL0AAZhXHoc\nflvojxUVbh8XiGdpFMF3o0mqNK8sH8oS66p0MIW9jZIuyv/iz211KpCDc4IV\na6I8uwdKbrgaGPxVKQB1uNHM0PVIHxRj/zMrPpMw4N2HT9mKsHFBHZRp23sT\nki44jrHbZwl8J56KKCqiDt8q0TT5DbxjoGRqNR2aSDJiRMnnSinQvQfQk5a4\nIjvE\r\n=z+79\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGL9pHrIqMea2r98D1iA5xuYJF8pXQBN0wcco/RVEh9pAiEAuNn0+JWE1PnWnaUf0Nsq1ZSg4nkJ2A85RO/GfOUxcaE="}]},"maintainers":[{"email":"daniel@tschinder.de","name":"danez"},{"email":"justnvdm@gmail.com","name":"justinvdm"},{"email":"sebastian.jerie@researchgate.net","name":"researchgate-bot"},{"email":"sergey@bekrin.me","name":"sbekrin"},{"email":"info@weaintplastic.com","name":"weaintplastic"}],"_npmUser":{"name":"researchgate-bot","email":"stefan.hoth@researchgate.net"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/spire_1.8.4-next.42_1578251478220_0.9745051022657052"},"_hasShrinkwrap":false},"1.8.4-next.45":{"name":"spire","version":"1.8.4-next.45","description":"Extensible CLI toolkit managment tool","main":"index.js","repository":{"type":"git","url":"git+https://github.com/researchgate/spire.git"},"author":{"name":"Sergey Bekrin","email":"sergey@bekrin.me","url":"https://bekrin.me"},"license":"MIT","bin":{"spire":"bin/spire.js"},"engines":{"node":">=10"},"scripts":{"postinstall":"./bin/spire.js hook postinstall","preuninstall":"./bin/spire.js hook preuninstall"},"dependencies":{"cosmiconfig":"^6.0.0","detect-indent":"^6.0.0","fs-extra":"^8.1.0","import-from":"^3.0.0","invariant":"^2.2.4","pretty-format":"^24.7.0","signale":"^1.4.0","spire-config-default":"^1.8.4-next.45+e8af2bd","yargs":"^15.0.0"},"devDependencies":{"spire-test-utils":"^1.8.2"},"prettier":"spire-plugin-prettier/config","gitHead":"e8af2bdebe4300997e7a004f38fbaee5bcf22330","readme":"# 🗼 Spire\n\nExtensible JavaScript toolbox management.\n\n<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->\n\n- [Motivation](#motivation)\n- [Quick Start](#quick-start)\n- [Configuration](#configuration)\n  - [Using a Custom Preset](#using-a-custom-preset)\n  - [Using a Local Preset](#using-a-local-preset)\n  - [Passing Options](#passing-options)\n- [Guides](#guides)\n  - [Writing a Config](#writing-a-config)\n  - [Writing a Plugin](#writing-a-plugin)\n  - [Migrating to Spire](#migrating-to-spire)\n  - [Using without Git](#using-without-git)\n  - [Using in monorepos](#using-in-monorepos)\n- [API](#api)\n  - [CLI](#cli)\n  - [`spire`](#spire)\n  - [`context`](#context)\n- [References](#references)\n- [License](#license)\n\n<!-- END doctoc generated TOC please keep comment here to allow auto update -->\n\n## Motivation\n\n**Problem:** Maintaining tools and configurations for linting, testing and\nbuilding your code is hard. The more projects you have, the more time it takes\nto keep your setup consistent and up-to-date.\n\n**Solution:** Spire is a pluggable CLI tool which allows you to abstract all of\nyour tools and configurations into reusable plugins and presets. Think of it as\n“babel for infrastructure”.\n\n## Quick Start\n\n1. Install `spire`:\n\n```sh\n# yarn\nyarn add --dev spire\n\n# npm\nnpm install --save-dev spire\n```\n\n2. Start using in your project:\n\n```sh\n# npx\nnpx spire --help\n\n# yarn\nyarn spire --help\n```\n\n3. Depending on your tech stack, you can start using Spire as zero-config tool.\n   See [spire-config-default] for a list of default tools and\n   [configuration section](#configuration) for how to customise it.\n\n- _Using yarn? Consider installing [spire-plugin-yarn] for few power features._\n\n- _Want to have automated release w/ changelog generation? Check out\n  [spire-plugin-semantic-release] and [spire-plugin-lerna-release] for lerna\n  monorepos._\n\n## Configuration\n\nSpire is based on config presets, which is the same concept for tools like\n[Babel](https://babeljs.io/) and [ESLint](https://eslint.org/). Configs are a\nset of predefined plugins and their options. Configs can also extend a chain of\nother configs. By default, Spire is shipped with [spire-config-default].\n\n### Using a Custom Preset\n\nTo use your preferred configuration, install it as dev dependency and reference\nit by module name in [`extends` property](#writing-a-config). To extend multiple\nconfigs, provide it as an array. You can also use individual plugins along with\nconfigs with [`plugins` property](#writing-a-config).\n\n<details open>\n  <summary>via <code>package.json#spire</code> (recommended)</summary>\n\n```json\n{\n  \"name\": \"acme-project\",\n  \"devDependencies\": {\n    \"spire\": \"^1.0.0\",\n    \"spire-config-acme\": \"^1.0.0\"\n  },\n  \"spire\": {\n    \"extends\": \"spire-config-acme\"\n  }\n}\n```\n\n</details>\n\n<details>\n  <summary>via <code>spire.config.js</code></summary>\n\n```js\nmodule.exports = {\n  extends: 'spire-config-acme',\n};\n```\n\n</details>\n\n<details>\n  <summary>via <code>.spirerc</code></summary>\n\n```js\n{\n  \"extends\": \"spire-config-acme\",\n}\n```\n\n</details>\n\n### Using a Local Preset\n\n_Note: It is recommended to enable Local Presets only for development._\n\nYou can reference a Local Preset or plugin using `<rootDir>` placeholder which\npoints to the current project directory:\n\n```json\n{\n  \"spire\": {\n    \"extends\": \"<rootDir>/spire-config.js\",\n    \"plugins\": [\"<rootDir>/spire-plugin.js\"]\n  }\n}\n```\n\n### Passing Options\n\nIf the config preset or plugin you're using supports customisation, you can pass\noptions to it:\n\n```json\n{\n  \"spire\": {\n    \"extends\": [[\"spire-config-acme\", { \"fictional\": false }]],\n    \"plugins\": [[\"spire-plugin-acme\", { \"company\": true }]]\n  }\n}\n```\n\n## Guides\n\n### Writing a Config\n\nA Config is a module which exports a function returning an object.\n\n- `config` \\<[function]([Object], [Object])\\>\n  - `spire` \\<[Object]\\> Spire [API object](#spire).\n  - `options` \\<[Object]\\> User-provided config options.\n- returns: \\<[Object]\\>\n  - `extends` \\<[string]|\\<[Array]\\<[string]\\>\\>\\> Config or an array of config\n    presets to extend.\n  - `plugins` \\<[Array]\\<[string]\\>\\> Array of plugins to include.\n\nExample:\n\n```js\nmodule.exports = (spire, options) => {\n  return {\n    extends: ['spire-config-first', 'spire-config-second'],\n    plugins: ['spire-plugin'],\n  };\n};\n```\n\nYou can dynamically change the behaviour of your preset based on `options` or\n`spire` APIs, but it's recommended to keep it explicit. Check\n[spire-config-default](https://github.com/researchgate/spire/blob/master/packages/spire-config-default/index.js)\nfor a reference.\n\n### Writing a Plugin\n\nA Plugin is a key component of Spire. After it resolves the config, Spire\naccumulates all plugins in chronological order and runs them. A Plugin is a\nfunction returning an object:\n\n_Note: It is recommended to keep plugins scoped to a single feature or tool._\n\n- `plugin` \\<[function]([Object], [Object])\\>\n  - `spire` \\<[Object]\\> Spire [API object](#spire).\n  - `options` \\<[Object]\\> User-provided plugin options.\n- returns: \\<[Object]\\>\n  - `name` \\<[string]\\> Name of the plugin (recommended).\n  - `command` \\<[string]\\> Optional name of command. Leaving it empty will\n    ignore `run` hook completly.\n  - `description` \\<[string]\\> Optional human-readable command description.\n  - `preinstall` \\<[function]\\([Context]\\): [Promise]\\> Executed before\n    `yarn install` or `npm install`\n  - `postinstall` \\<[function]\\([Context]\\): [Promise]\\> Executed after\n    `yarn install` or `npm install`.\n  - `postmerge` \\<[function]\\([Context]\\): [Promise]\\> Executed on `git pull`.\n  - `precommit` \\<[function]\\([Context]\\): [Promise]\\> Executed on `git commit`.\n  - `setup` \\<[function]\\([Context]\\): [Promise]\\> Executed before `run` hook.\n    Use it to prepare arguments or config for your tools. If it fails, Spire\n    stops futher hooks from being executed.\n  - `run` \\<[function]\\([Context]\\): [Promise]\\> Executed as the main logic of\n    the plugin. Use this hook to run the CLI tool or process long-running task.\n  - `teardown` \\<[function]\\([Context]\\): [Promise]\\> Executed after `run` hook,\n    even if it has failed. Use this hook to cleanup locally or to collect some\n    stats.\n  - `preuninstall` \\<[function]\\([Context]\\): [Promise]\\> Executed before\n    `yarn uninstall` or `npm uninstall`. Run it to cleanup external data.\n\nExample:\n\n```js\nmodule.exports = (spire, options) => {\n  return {\n    name: 'my-awesome-tool',\n    command: 'my-tool',\n    description: 'run my awesome tool',\n    async run({ logger }) {\n      logger.log('Hi from my awesome tool!');\n    },\n  };\n};\n```\n\nCheck [spire-plugin-clean], [spire-plugin-doctoc] and [spire-plugin-eslint] for\nmore plugin examples.\n\n### Migrating to Spire\n\n**Identify your tools:** To get started, gather a list of shared tools in your\nexisting projects. This will help to identify which plugins you'll need.\n\n**Pick preset or plugin:** Check if there's already a default or community\nplugin for that.\n[Search for `spire-plugin-*`](https://www.npmjs.com/search?q=spire-plugin-) on\nnpm for individual tools and\n[`spire-config-*`](https://www.npmjs.com/search?q=spire-config-) for specific\necosystems and tech stacks. In case if there's no suitable option for your,\ncheck on how to [write a custom plugin](#writing-a-plugin).\n\n**Make your own preset**: If you find that an existing or default preset works\nfor you, skip this step. If not, create a new module with a name matching\n`spire-config-*`. It can be specific for your personal projects, your company or\na tech stack. Check [writing a config](#writing-a-config) for instructions on\nhow to do this.\n\n**Migrate your projects**: Once you've got a preset ready, go through your\nprojects and [setup Spire](#quick-start) with it. Make sure to delete the\ndependencies it replaces. At this point you're done!\n\n### Using without Git\n\nAt the moment Spire has a hard dependency on a Git repository to resolve\nmonorepo project root. This most likely to be reviewed in the future, but\nmeanwhile it is part of the core, you can export `SKIP_PREFLIGHT_CHECK=true`\nenvironment variable to disable this check. The idea and name of this flag is\nborrowed from [create-react-app].\n\n### Using in monorepos\n\nIt is recommended to install Spire on the root level of a monorepo and run all\ncommands from there. The main motivation behind this is performance and\nconsistency reasons. You can still though run commands in an indivudual package.\nBelow is an example of how to run `spire lint` in a specific monorepo package:\n\n- With [yarn workspaces]:\n  ```sh\n  yarn workspace <pkg-name> spire lint\n  ```\n- With [lerna]:\n  ```sh\n  npx lerna --scope <pkg-name> exec spire lint\n  ```\n\n## API\n\n### CLI\n\nEach plugin can extend a list of available commands and their options. The list\nbelow only includes basic commands.\n\n- `npx spire --help` Prints the list of available commands.\n- `npx spire --version` Prints the current version of Spire.\n- `npx spire <cmd>` Runs a specific command defined by plugins.\n- `npx spire --debug <cmd>` Outputs additional debug information.\n- _(hidden)_ `npx spire hook <name>` Runs specific git or npm plugin hooks.\n  Available hooks are `postinstall`, `preuninstall`, `precommit` and\n  `postmerge`. Use this to test or debug your plugins.\n\n### `spire`\n\nSpire is an object which is passed as the first argument to both configs and\nplugins.\n\n- `spire`\n  - `setState` \\<[function]\\([Object]|[function]\\)\\> Sets state by merging it\n    with previous one (shallow).\n    - `state` \\<[Object]|[function]\\> New state as an object or a function which\n      recevies the previous state and returns an object. Usefull to avoid\n      `getState()` calls.\n  - `getState` \\<[function]\\(\\): [Object]\\> Returns current state.\n  - `hasFile` \\<[function]\\([string]\\): [Promise]\\<[boolean]\\>\\> Checks if\n    current projects contains specific file.\n  - `hasPackageProp` \\<[function]\\([string]\\): [Promise]\\<[boolean]\\>\\> Check if\n    current project's `package.json` contains specific prop.\n\n### `context`\n\nContext is an object which is passed as the first argument to plugin hooks. It's\ndesigned to be read-only. If you want to pass some data futher, consider using\n[`spire.setState` instead](#spire).\n\n- `context`\n  - `argv` \\<[Array]\\<[string]\\>\\> Array of arguments Spire was called with.\n    Defaults to `process.argv.slice(2)`.\n  - `cli` \\<[Object]\\> Instance of [yargs](http://yargs.js.org/) for adding\n    custom commands.\n  - `cwd` \\<[string]\\> Directory Spire is executed in. Defaults to\n    `process.cwd()`.\n  - `env` \\<[Object]\\> Set of environment variables. Defaults to `process.env`.\n  - `logger` \\<[Object]\\> Instance of\n    [Signale](https://github.com/klauscfhq/signale). Use `logger.debug()` to\n    print debug info which is only shown with `--debug` flag.\n  - `config` \\<[Object]\\> Parsed and normalised [config](#writing-a-config).\n  - `options` \\<[Object]\\> Parsed yargs options. Available only after `setup`\n    hook.\n\n## References\n\nThis project is inspired by the great work of JavaScript open source community\n(without particular order):\n\n- [Kent C. Dodds: Tools without config 🛠📦](https://blog.kentcdodds.com/automation-without-config-412ab5e47229)\n- [Dan Abramov: The Melting Pot of JavaScript](https://www.youtube.com/watch?v=nl30vWYKs9A)\n- [Jamie Kyle: Tools 4 Tools 4 Tools](https://www.youtube.com/watch?v=itI5xGyvtho)\n- [semantic-release](https://github.com/semantic-release/semantic-release)\n- [react-scripts](https://github.com/facebook/create-react-app/tree/next/packages/react-scripts)\n- [kcd-scripts](https://github.com/kentcdodds/kcd-scripts)\n- [bolt](https://github.com/boltpkg/bolt)\n\n## License\n\nMIT &copy; [ResearchGate](https://github.com/researchgate)\n\n[context]: #context\n[spire-config-default]:\n  https://github.com/researchgate/spire/blob/master/packages/spire-config-default\n[spire-plugin-yarn]:\n  https://github.com/researchgate/spire/blob/master/packages/spire-plugin-yarn\n[spire-plugin-clean]:\n  https://github.com/researchgate/spire/blob/master/packages/spire-plugin-clean\n[spire-plugin-doctoc]:\n  https://github.com/researchgate/spire/blob/master/packages/spire-plugin-doctoc\n[spire-plugin-eslint]:\n  https://github.com/researchgate/spire/blob/master/packages/spire-plugin-eslint\n[spire-plugin-semantic-release]:\n  https://github.com/researchgate/spire/blob/master/packages/spire-plugin-semantic-release\n[spire-plugin-lerna-release]:\n  https://github.com/researchgate/spire/blob/master/packages/spire-plugin-lerna-release\n[boolean]:\n  https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Boolean_type\n[string]:\n  https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type\n[array]:\n  https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array\n[object]:\n  https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object\n[function]:\n  https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function\n[promise]:\n  https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise\n[symbol]:\n  https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol\n[create-react-app]: https://github.com/facebook/create-react-app\n[yarn workspaces]: https://yarnpkg.com/lang/en/docs/workspaces/\n[lerna]: https://github.com/lerna/lerna\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/researchgate/spire/issues"},"homepage":"https://github.com/researchgate/spire#readme","_id":"spire@1.8.4-next.45","_nodeVersion":"12.14.1","_npmVersion":"lerna/3.20.2/node@v12.14.1+x64 (linux)","dist":{"integrity":"sha512-S697K3qx+S15YdXP6svohdnzNU5+Mp9GXwVw4kRQw/yNnn8vobMlWGeDPWZlabaQszV/nixbHa/cu5erYuAN5g==","shasum":"ae3d624ed3ac06a252d05c9b838ffe257f404e32","tarball":"https://registry.npmjs.org/spire/-/spire-1.8.4-next.45.tgz","fileCount":20,"unpackedSize":38666,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeN/dxCRA9TVsSAnZWagAAiHMQAIHLy05UCD202K22WC+9\nIBDpEVcCM+MhuClctDVHVsA8Hc2fjm8ThGu/2RvohiaXXDxgzq+puLNiqzia\nkveylK1nCL8A4dQ19K+ccbb3iPPEQdKGUnk5tjZPgGxp3eMTjPOxEh9Pmtdk\nxemPyo/H2PAkDvGT4tZNc1C810fX6t3b0JVsq2MyC8T6OTIKNRzjmmLu2kcb\nbrkCX4ep/h6Yhlx00PtKOoE6nqPwG37TlmRDrhE0RN8vmjgT0UhgQ/Fu3h5p\ntgU1528xjALl/4zWlqB8hzd06/Xu7gYUw7hKRq98bxRmI+Ur7csd/0mAcCAv\nERxOdHn+eBFO8x8EjquOHipHvMN3pnc/bGEdSRD96UUaxbk+bfMVa1z/Lsd/\nhmUQaI47Dv9xoF8gjDEnHhlY5NUC56+v43hGbl29Np1zFv9c0lMcHkxsMXhE\nnmq1H0e/sMaP0LsUAIC8ahg30KPHMWxHCC0+E8FFFV8jjWTzUkURcogbGg0a\nusvrrbZXJjf5caVAARoT1o1QEfqv+e3lQPwFjQqn7a28VcS1S6wQm31Q6ZSK\n32b6AmluUKTxyTCkUa+WxI1ShMULIhm5vDwm1II/UViSWpntJGb6AAdOnblT\nrnCLctGK1zQhfbqsOqj5SiUiIzTnWX0XsB5hgZgbSBS79mLBquMquhJ6Fy6n\n0gPA\r\n=EOvH\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDN1W6Dzlx53i+oQV9i5o6f9uqNkzlTfMHOzve2VcqTKAIhAOAGT/Fn30rdeEJcqFrD+BylU+qvoI0+CfZzy7lWSh00"}]},"maintainers":[{"email":"daniel@tschinder.de","name":"danez"},{"email":"justnvdm@gmail.com","name":"justinvdm"},{"email":"sebastian.jerie@researchgate.net","name":"researchgate-bot"},{"email":"sergey@bekrin.me","name":"sbekrin"},{"email":"info@weaintplastic.com","name":"weaintplastic"}],"_npmUser":{"name":"researchgate-bot","email":"stefan.hoth@researchgate.net"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/spire_1.8.4-next.45_1580726128963_0.7328716330254958"},"_hasShrinkwrap":false},"1.8.4-next.46":{"name":"spire","version":"1.8.4-next.46","description":"Extensible CLI toolkit managment tool","main":"index.js","repository":{"type":"git","url":"git+https://github.com/researchgate/spire.git"},"author":{"name":"Sergey Bekrin","email":"sergey@bekrin.me","url":"https://bekrin.me"},"license":"MIT","bin":{"spire":"bin/spire.js"},"engines":{"node":">=10"},"scripts":{"postinstall":"./bin/spire.js hook postinstall","preuninstall":"./bin/spire.js hook preuninstall"},"dependencies":{"cosmiconfig":"^6.0.0","detect-indent":"^6.0.0","fs-extra":"^8.1.0","import-from":"^3.0.0","invariant":"^2.2.4","pretty-format":"^25.0.0","signale":"^1.4.0","spire-config-default":"^1.8.4-next.46+76b7bed","yargs":"^15.0.0"},"devDependencies":{"spire-test-utils":"^1.8.2"},"prettier":"spire-plugin-prettier/config","gitHead":"76b7bed4ac8e799939ac8463b91301ad2053c7fb","readme":"# 🗼 Spire\n\nExtensible JavaScript toolbox management.\n\n<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->\n\n- [Motivation](#motivation)\n- [Quick Start](#quick-start)\n- [Configuration](#configuration)\n  - [Using a Custom Preset](#using-a-custom-preset)\n  - [Using a Local Preset](#using-a-local-preset)\n  - [Passing Options](#passing-options)\n- [Guides](#guides)\n  - [Writing a Config](#writing-a-config)\n  - [Writing a Plugin](#writing-a-plugin)\n  - [Migrating to Spire](#migrating-to-spire)\n  - [Using without Git](#using-without-git)\n  - [Using in monorepos](#using-in-monorepos)\n- [API](#api)\n  - [CLI](#cli)\n  - [`spire`](#spire)\n  - [`context`](#context)\n- [References](#references)\n- [License](#license)\n\n<!-- END doctoc generated TOC please keep comment here to allow auto update -->\n\n## Motivation\n\n**Problem:** Maintaining tools and configurations for linting, testing and\nbuilding your code is hard. The more projects you have, the more time it takes\nto keep your setup consistent and up-to-date.\n\n**Solution:** Spire is a pluggable CLI tool which allows you to abstract all of\nyour tools and configurations into reusable plugins and presets. Think of it as\n“babel for infrastructure”.\n\n## Quick Start\n\n1. Install `spire`:\n\n```sh\n# yarn\nyarn add --dev spire\n\n# npm\nnpm install --save-dev spire\n```\n\n2. Start using in your project:\n\n```sh\n# npx\nnpx spire --help\n\n# yarn\nyarn spire --help\n```\n\n3. Depending on your tech stack, you can start using Spire as zero-config tool.\n   See [spire-config-default] for a list of default tools and\n   [configuration section](#configuration) for how to customise it.\n\n- _Using yarn? Consider installing [spire-plugin-yarn] for few power features._\n\n- _Want to have automated release w/ changelog generation? Check out\n  [spire-plugin-semantic-release] and [spire-plugin-lerna-release] for lerna\n  monorepos._\n\n## Configuration\n\nSpire is based on config presets, which is the same concept for tools like\n[Babel](https://babeljs.io/) and [ESLint](https://eslint.org/). Configs are a\nset of predefined plugins and their options. Configs can also extend a chain of\nother configs. By default, Spire is shipped with [spire-config-default].\n\n### Using a Custom Preset\n\nTo use your preferred configuration, install it as dev dependency and reference\nit by module name in [`extends` property](#writing-a-config). To extend multiple\nconfigs, provide it as an array. You can also use individual plugins along with\nconfigs with [`plugins` property](#writing-a-config).\n\n<details open>\n  <summary>via <code>package.json#spire</code> (recommended)</summary>\n\n```json\n{\n  \"name\": \"acme-project\",\n  \"devDependencies\": {\n    \"spire\": \"^1.0.0\",\n    \"spire-config-acme\": \"^1.0.0\"\n  },\n  \"spire\": {\n    \"extends\": \"spire-config-acme\"\n  }\n}\n```\n\n</details>\n\n<details>\n  <summary>via <code>spire.config.js</code></summary>\n\n```js\nmodule.exports = {\n  extends: 'spire-config-acme',\n};\n```\n\n</details>\n\n<details>\n  <summary>via <code>.spirerc</code></summary>\n\n```js\n{\n  \"extends\": \"spire-config-acme\",\n}\n```\n\n</details>\n\n### Using a Local Preset\n\n_Note: It is recommended to enable Local Presets only for development._\n\nYou can reference a Local Preset or plugin using `<rootDir>` placeholder which\npoints to the current project directory:\n\n```json\n{\n  \"spire\": {\n    \"extends\": \"<rootDir>/spire-config.js\",\n    \"plugins\": [\"<rootDir>/spire-plugin.js\"]\n  }\n}\n```\n\n### Passing Options\n\nIf the config preset or plugin you're using supports customisation, you can pass\noptions to it:\n\n```json\n{\n  \"spire\": {\n    \"extends\": [[\"spire-config-acme\", { \"fictional\": false }]],\n    \"plugins\": [[\"spire-plugin-acme\", { \"company\": true }]]\n  }\n}\n```\n\n## Guides\n\n### Writing a Config\n\nA Config is a module which exports a function returning an object.\n\n- `config` \\<[function]([Object], [Object])\\>\n  - `spire` \\<[Object]\\> Spire [API object](#spire).\n  - `options` \\<[Object]\\> User-provided config options.\n- returns: \\<[Object]\\>\n  - `extends` \\<[string]|\\<[Array]\\<[string]\\>\\>\\> Config or an array of config\n    presets to extend.\n  - `plugins` \\<[Array]\\<[string]\\>\\> Array of plugins to include.\n\nExample:\n\n```js\nmodule.exports = (spire, options) => {\n  return {\n    extends: ['spire-config-first', 'spire-config-second'],\n    plugins: ['spire-plugin'],\n  };\n};\n```\n\nYou can dynamically change the behaviour of your preset based on `options` or\n`spire` APIs, but it's recommended to keep it explicit. Check\n[spire-config-default](https://github.com/researchgate/spire/blob/master/packages/spire-config-default/index.js)\nfor a reference.\n\n### Writing a Plugin\n\nA Plugin is a key component of Spire. After it resolves the config, Spire\naccumulates all plugins in chronological order and runs them. A Plugin is a\nfunction returning an object:\n\n_Note: It is recommended to keep plugins scoped to a single feature or tool._\n\n- `plugin` \\<[function]([Object], [Object])\\>\n  - `spire` \\<[Object]\\> Spire [API object](#spire).\n  - `options` \\<[Object]\\> User-provided plugin options.\n- returns: \\<[Object]\\>\n  - `name` \\<[string]\\> Name of the plugin (recommended).\n  - `command` \\<[string]\\> Optional name of command. Leaving it empty will\n    ignore `run` hook completly.\n  - `description` \\<[string]\\> Optional human-readable command description.\n  - `preinstall` \\<[function]\\([Context]\\): [Promise]\\> Executed before\n    `yarn install` or `npm install`\n  - `postinstall` \\<[function]\\([Context]\\): [Promise]\\> Executed after\n    `yarn install` or `npm install`.\n  - `postmerge` \\<[function]\\([Context]\\): [Promise]\\> Executed on `git pull`.\n  - `precommit` \\<[function]\\([Context]\\): [Promise]\\> Executed on `git commit`.\n  - `setup` \\<[function]\\([Context]\\): [Promise]\\> Executed before `run` hook.\n    Use it to prepare arguments or config for your tools. If it fails, Spire\n    stops futher hooks from being executed.\n  - `run` \\<[function]\\([Context]\\): [Promise]\\> Executed as the main logic of\n    the plugin. Use this hook to run the CLI tool or process long-running task.\n  - `teardown` \\<[function]\\([Context]\\): [Promise]\\> Executed after `run` hook,\n    even if it has failed. Use this hook to cleanup locally or to collect some\n    stats.\n  - `preuninstall` \\<[function]\\([Context]\\): [Promise]\\> Executed before\n    `yarn uninstall` or `npm uninstall`. Run it to cleanup external data.\n\nExample:\n\n```js\nmodule.exports = (spire, options) => {\n  return {\n    name: 'my-awesome-tool',\n    command: 'my-tool',\n    description: 'run my awesome tool',\n    async run({ logger }) {\n      logger.log('Hi from my awesome tool!');\n    },\n  };\n};\n```\n\nCheck [spire-plugin-clean], [spire-plugin-doctoc] and [spire-plugin-eslint] for\nmore plugin examples.\n\n### Migrating to Spire\n\n**Identify your tools:** To get started, gather a list of shared tools in your\nexisting projects. This will help to identify which plugins you'll need.\n\n**Pick preset or plugin:** Check if there's already a default or community\nplugin for that.\n[Search for `spire-plugin-*`](https://www.npmjs.com/search?q=spire-plugin-) on\nnpm for individual tools and\n[`spire-config-*`](https://www.npmjs.com/search?q=spire-config-) for specific\necosystems and tech stacks. In case if there's no suitable option for your,\ncheck on how to [write a custom plugin](#writing-a-plugin).\n\n**Make your own preset**: If you find that an existing or default preset works\nfor you, skip this step. If not, create a new module with a name matching\n`spire-config-*`. It can be specific for your personal projects, your company or\na tech stack. Check [writing a config](#writing-a-config) for instructions on\nhow to do this.\n\n**Migrate your projects**: Once you've got a preset ready, go through your\nprojects and [setup Spire](#quick-start) with it. Make sure to delete the\ndependencies it replaces. At this point you're done!\n\n### Using without Git\n\nAt the moment Spire has a hard dependency on a Git repository to resolve\nmonorepo project root. This most likely to be reviewed in the future, but\nmeanwhile it is part of the core, you can export `SKIP_PREFLIGHT_CHECK=true`\nenvironment variable to disable this check. The idea and name of this flag is\nborrowed from [create-react-app].\n\n### Using in monorepos\n\nIt is recommended to install Spire on the root level of a monorepo and run all\ncommands from there. The main motivation behind this is performance and\nconsistency reasons. You can still though run commands in an indivudual package.\nBelow is an example of how to run `spire lint` in a specific monorepo package:\n\n- With [yarn workspaces]:\n  ```sh\n  yarn workspace <pkg-name> spire lint\n  ```\n- With [lerna]:\n  ```sh\n  npx lerna --scope <pkg-name> exec spire lint\n  ```\n\n## API\n\n### CLI\n\nEach plugin can extend a list of available commands and their options. The list\nbelow only includes basic commands.\n\n- `npx spire --help` Prints the list of available commands.\n- `npx spire --version` Prints the current version of Spire.\n- `npx spire <cmd>` Runs a specific command defined by plugins.\n- `npx spire --debug <cmd>` Outputs additional debug information.\n- _(hidden)_ `npx spire hook <name>` Runs specific git or npm plugin hooks.\n  Available hooks are `postinstall`, `preuninstall`, `precommit` and\n  `postmerge`. Use this to test or debug your plugins.\n\n### `spire`\n\nSpire is an object which is passed as the first argument to both configs and\nplugins.\n\n- `spire`\n  - `setState` \\<[function]\\([Object]|[function]\\)\\> Sets state by merging it\n    with previous one (shallow).\n    - `state` \\<[Object]|[function]\\> New state as an object or a function which\n      recevies the previous state and returns an object. Usefull to avoid\n      `getState()` calls.\n  - `getState` \\<[function]\\(\\): [Object]\\> Returns current state.\n  - `hasFile` \\<[function]\\([string]\\): [Promise]\\<[boolean]\\>\\> Checks if\n    current projects contains specific file.\n  - `hasPackageProp` \\<[function]\\([string]\\): [Promise]\\<[boolean]\\>\\> Check if\n    current project's `package.json` contains specific prop.\n\n### `context`\n\nContext is an object which is passed as the first argument to plugin hooks. It's\ndesigned to be read-only. If you want to pass some data futher, consider using\n[`spire.setState` instead](#spire).\n\n- `context`\n  - `argv` \\<[Array]\\<[string]\\>\\> Array of arguments Spire was called with.\n    Defaults to `process.argv.slice(2)`.\n  - `cli` \\<[Object]\\> Instance of [yargs](http://yargs.js.org/) for adding\n    custom commands.\n  - `cwd` \\<[string]\\> Directory Spire is executed in. Defaults to\n    `process.cwd()`.\n  - `env` \\<[Object]\\> Set of environment variables. Defaults to `process.env`.\n  - `logger` \\<[Object]\\> Instance of\n    [Signale](https://github.com/klauscfhq/signale). Use `logger.debug()` to\n    print debug info which is only shown with `--debug` flag.\n  - `config` \\<[Object]\\> Parsed and normalised [config](#writing-a-config).\n  - `options` \\<[Object]\\> Parsed yargs options. Available only after `setup`\n    hook.\n\n## References\n\nThis project is inspired by the great work of JavaScript open source community\n(without particular order):\n\n- [Kent C. Dodds: Tools without config 🛠📦](https://blog.kentcdodds.com/automation-without-config-412ab5e47229)\n- [Dan Abramov: The Melting Pot of JavaScript](https://www.youtube.com/watch?v=nl30vWYKs9A)\n- [Jamie Kyle: Tools 4 Tools 4 Tools](https://www.youtube.com/watch?v=itI5xGyvtho)\n- [semantic-release](https://github.com/semantic-release/semantic-release)\n- [react-scripts](https://github.com/facebook/create-react-app/tree/next/packages/react-scripts)\n- [kcd-scripts](https://github.com/kentcdodds/kcd-scripts)\n- [bolt](https://github.com/boltpkg/bolt)\n\n## License\n\nMIT &copy; [ResearchGate](https://github.com/researchgate)\n\n[context]: #context\n[spire-config-default]:\n  https://github.com/researchgate/spire/blob/master/packages/spire-config-default\n[spire-plugin-yarn]:\n  https://github.com/researchgate/spire/blob/master/packages/spire-plugin-yarn\n[spire-plugin-clean]:\n  https://github.com/researchgate/spire/blob/master/packages/spire-plugin-clean\n[spire-plugin-doctoc]:\n  https://github.com/researchgate/spire/blob/master/packages/spire-plugin-doctoc\n[spire-plugin-eslint]:\n  https://github.com/researchgate/spire/blob/master/packages/spire-plugin-eslint\n[spire-plugin-semantic-release]:\n  https://github.com/researchgate/spire/blob/master/packages/spire-plugin-semantic-release\n[spire-plugin-lerna-release]:\n  https://github.com/researchgate/spire/blob/master/packages/spire-plugin-lerna-release\n[boolean]:\n  https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Boolean_type\n[string]:\n  https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type\n[array]:\n  https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array\n[object]:\n  https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object\n[function]:\n  https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function\n[promise]:\n  https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise\n[symbol]:\n  https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol\n[create-react-app]: https://github.com/facebook/create-react-app\n[yarn workspaces]: https://yarnpkg.com/lang/en/docs/workspaces/\n[lerna]: https://github.com/lerna/lerna\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/researchgate/spire/issues"},"homepage":"https://github.com/researchgate/spire#readme","_id":"spire@1.8.4-next.46","_nodeVersion":"12.14.1","_npmVersion":"lerna/3.20.2/node@v12.14.1+x64 (linux)","dist":{"integrity":"sha512-DHcDizB2mc7AHtXH4s4F7HnY2dP41wwgzjrr9JOicli6P7g2lXGLU/8uDZIlEp75VQF9WYBSznQN1KEQwmRdVA==","shasum":"b6f2fe23aab5d06cf54dcfeb14b08267a8dabd34","tarball":"https://registry.npmjs.org/spire/-/spire-1.8.4-next.46.tgz","fileCount":20,"unpackedSize":38666,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeN/01CRA9TVsSAnZWagAA7boP/1+k9O33W11EqTE/JajN\ntk4wxsJrVIqqFJeavg9FANhcAUIG2pAZTQ1C+kPh+xx0OpPpNtkljet70Yy5\ngrvghxX24Ds5ODR1Ja1fowpp5TGISmGYYgqbCqoCBbM+N+UJ35gc5ATiQM0+\nfbbJxnElAnw/3RuEwx2lJcLqhh9fXzzwlbtsOvCApyXS4H7yuuHW/9wNtdk9\n3XnsaKogEHmolEPunQwRpLuKDpIVJf32nGQDHOtBrKUN6NO/inq+D+LA9xPB\n6tc6d/jz84vOnf9mvVp2NfcmYe13/6aEdURA+HCVNgc2LBmIpdaHD658BHhM\nm5lUbJrsJUWSzXX1cQnYe3HVyj42AOIltqKA6Mj7XRuuDyJ9LwO9fCTP3BM2\nmQlyzVXkClRLcb3D+9d8OKnLSBClqdODiO+0hLm1de1OB7U7FdpWTCCZ7+rG\nXEIF5ToWmWgK5mzF9lxcTs9TS4QzjHUHkb5JOUyrb/YJe7sqbW9gIf5UOZw6\nwmZiz2D34Jp8QwLAASruVs6K4e8WDS9ZcQ1SokH0Lg8RgtrC3VGKHrQa/vGu\ntogyPveN0CC92mHaT5GarU+fy6MAcoX2gEAUeTXBaSTqjwP/ZNCHxAX8wQM4\nhUvpbs/RdewLjlFjSm780AMPUuE2uMok7Vr0ty0Rt8fgUCIHuTrxX6wvaOP2\n102K\r\n=reWC\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGkFz+zJ5W4y5pJdakPjllqdTsoX9Oyhmt8kDsv0pwUWAiEAr0xF0olwmzXgWnxyLnR2eGEqnjNq/kbCctwIalAM+YM="}]},"maintainers":[{"email":"daniel@tschinder.de","name":"danez"},{"email":"justnvdm@gmail.com","name":"justinvdm"},{"email":"sebastian.jerie@researchgate.net","name":"researchgate-bot"},{"email":"sergey@bekrin.me","name":"sbekrin"},{"email":"info@weaintplastic.com","name":"weaintplastic"}],"_npmUser":{"name":"researchgate-bot","email":"stefan.hoth@researchgate.net"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/spire_1.8.4-next.46_1580727605195_0.09358422732050853"},"_hasShrinkwrap":false},"1.8.4-next.47":{"name":"spire","version":"1.8.4-next.47","description":"Extensible CLI toolkit managment tool","main":"index.js","repository":{"type":"git","url":"git+https://github.com/researchgate/spire.git"},"author":{"name":"Sergey Bekrin","email":"sergey@bekrin.me","url":"https://bekrin.me"},"license":"MIT","bin":{"spire":"bin/spire.js"},"engines":{"node":">=10.18.0"},"scripts":{"postinstall":"./bin/spire.js hook postinstall","preuninstall":"./bin/spire.js hook preuninstall"},"dependencies":{"cosmiconfig":"^6.0.0","detect-indent":"^6.0.0","fs-extra":"^9.0.0","import-from":"^3.0.0","invariant":"^2.2.4","pretty-format":"^25.0.0","signale":"^1.4.0","spire-config-default":"^1.8.4-next.47+0a2f755","yargs":"^15.0.0"},"devDependencies":{"spire-test-utils":"^1.8.4-next.47+0a2f755"},"prettier":"spire-plugin-prettier/config","gitHead":"0a2f75509d0df070a9c44e427fdefdaf85d05440","readme":"# 🗼 Spire\n\nExtensible JavaScript toolbox management.\n\n<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->\n\n- [Motivation](#motivation)\n- [Quick Start](#quick-start)\n- [Configuration](#configuration)\n  - [Using a Custom Preset](#using-a-custom-preset)\n  - [Using a Local Preset](#using-a-local-preset)\n  - [Passing Options](#passing-options)\n- [Guides](#guides)\n  - [Writing a Config](#writing-a-config)\n  - [Writing a Plugin](#writing-a-plugin)\n  - [Migrating to Spire](#migrating-to-spire)\n  - [Using without Git](#using-without-git)\n  - [Using in monorepos](#using-in-monorepos)\n- [API](#api)\n  - [CLI](#cli)\n  - [`spire`](#spire)\n  - [`context`](#context)\n- [References](#references)\n- [License](#license)\n\n<!-- END doctoc generated TOC please keep comment here to allow auto update -->\n\n## Motivation\n\n**Problem:** Maintaining tools and configurations for linting, testing and\nbuilding your code is hard. The more projects you have, the more time it takes\nto keep your setup consistent and up-to-date.\n\n**Solution:** Spire is a pluggable CLI tool which allows you to abstract all of\nyour tools and configurations into reusable plugins and presets. Think of it as\n“babel for infrastructure”.\n\n## Quick Start\n\n1. Install `spire`:\n\n```sh\n# yarn\nyarn add --dev spire\n\n# npm\nnpm install --save-dev spire\n```\n\n2. Start using in your project:\n\n```sh\n# npx\nnpx spire --help\n\n# yarn\nyarn spire --help\n```\n\n3. Depending on your tech stack, you can start using Spire as zero-config tool.\n   See [spire-config-default] for a list of default tools and\n   [configuration section](#configuration) for how to customise it.\n\n- _Using yarn? Consider installing [spire-plugin-yarn] for few power features._\n\n- _Want to have automated release w/ changelog generation? Check out\n  [spire-plugin-semantic-release] and [spire-plugin-lerna-release] for lerna\n  monorepos._\n\n## Configuration\n\nSpire is based on config presets, which is the same concept for tools like\n[Babel](https://babeljs.io/) and [ESLint](https://eslint.org/). Configs are a\nset of predefined plugins and their options. Configs can also extend a chain of\nother configs. By default, Spire is shipped with [spire-config-default].\n\n### Using a Custom Preset\n\nTo use your preferred configuration, install it as dev dependency and reference\nit by module name in [`extends` property](#writing-a-config). To extend multiple\nconfigs, provide it as an array. You can also use individual plugins along with\nconfigs with [`plugins` property](#writing-a-config).\n\n<details open>\n  <summary>via <code>package.json#spire</code> (recommended)</summary>\n\n```json\n{\n  \"name\": \"acme-project\",\n  \"devDependencies\": {\n    \"spire\": \"^1.0.0\",\n    \"spire-config-acme\": \"^1.0.0\"\n  },\n  \"spire\": {\n    \"extends\": \"spire-config-acme\"\n  }\n}\n```\n\n</details>\n\n<details>\n  <summary>via <code>spire.config.js</code></summary>\n\n```js\nmodule.exports = {\n  extends: 'spire-config-acme',\n};\n```\n\n</details>\n\n<details>\n  <summary>via <code>.spirerc</code></summary>\n\n```js\n{\n  \"extends\": \"spire-config-acme\",\n}\n```\n\n</details>\n\n### Using a Local Preset\n\n_Note: It is recommended to enable Local Presets only for development._\n\nYou can reference a Local Preset or plugin using `<rootDir>` placeholder which\npoints to the current project directory:\n\n```json\n{\n  \"spire\": {\n    \"extends\": \"<rootDir>/spire-config.js\",\n    \"plugins\": [\"<rootDir>/spire-plugin.js\"]\n  }\n}\n```\n\n### Passing Options\n\nIf the config preset or plugin you're using supports customisation, you can pass\noptions to it:\n\n```json\n{\n  \"spire\": {\n    \"extends\": [[\"spire-config-acme\", { \"fictional\": false }]],\n    \"plugins\": [[\"spire-plugin-acme\", { \"company\": true }]]\n  }\n}\n```\n\n## Guides\n\n### Writing a Config\n\nA Config is a module which exports a function returning an object.\n\n- `config` \\<[function]([Object], [Object])\\>\n  - `spire` \\<[Object]\\> Spire [API object](#spire).\n  - `options` \\<[Object]\\> User-provided config options.\n- returns: \\<[Object]\\>\n  - `extends` \\<[string]|\\<[Array]\\<[string]\\>\\>\\> Config or an array of config\n    presets to extend.\n  - `plugins` \\<[Array]\\<[string]\\>\\> Array of plugins to include.\n\nExample:\n\n```js\nmodule.exports = (spire, options) => {\n  return {\n    extends: ['spire-config-first', 'spire-config-second'],\n    plugins: ['spire-plugin'],\n  };\n};\n```\n\nYou can dynamically change the behaviour of your preset based on `options` or\n`spire` APIs, but it's recommended to keep it explicit. Check\n[spire-config-default](https://github.com/researchgate/spire/blob/master/packages/spire-config-default/index.js)\nfor a reference.\n\n### Writing a Plugin\n\nA Plugin is a key component of Spire. After it resolves the config, Spire\naccumulates all plugins in chronological order and runs them. A Plugin is a\nfunction returning an object:\n\n_Note: It is recommended to keep plugins scoped to a single feature or tool._\n\n- `plugin` \\<[function]([Object], [Object])\\>\n  - `spire` \\<[Object]\\> Spire [API object](#spire).\n  - `options` \\<[Object]\\> User-provided plugin options.\n- returns: \\<[Object]\\>\n  - `name` \\<[string]\\> Name of the plugin (recommended).\n  - `command` \\<[string]\\> Optional name of command. Leaving it empty will\n    ignore `run` hook completly.\n  - `description` \\<[string]\\> Optional human-readable command description.\n  - `preinstall` \\<[function]\\([Context]\\): [Promise]\\> Executed before\n    `yarn install` or `npm install`\n  - `postinstall` \\<[function]\\([Context]\\): [Promise]\\> Executed after\n    `yarn install` or `npm install`.\n  - `postmerge` \\<[function]\\([Context]\\): [Promise]\\> Executed on `git pull`.\n  - `precommit` \\<[function]\\([Context]\\): [Promise]\\> Executed on `git commit`.\n  - `setup` \\<[function]\\([Context]\\): [Promise]\\> Executed before `run` hook.\n    Use it to prepare arguments or config for your tools. If it fails, Spire\n    stops futher hooks from being executed.\n  - `run` \\<[function]\\([Context]\\): [Promise]\\> Executed as the main logic of\n    the plugin. Use this hook to run the CLI tool or process long-running task.\n  - `teardown` \\<[function]\\([Context]\\): [Promise]\\> Executed after `run` hook,\n    even if it has failed. Use this hook to cleanup locally or to collect some\n    stats.\n  - `preuninstall` \\<[function]\\([Context]\\): [Promise]\\> Executed before\n    `yarn uninstall` or `npm uninstall`. Run it to cleanup external data.\n\nExample:\n\n```js\nmodule.exports = (spire, options) => {\n  return {\n    name: 'my-awesome-tool',\n    command: 'my-tool',\n    description: 'run my awesome tool',\n    async run({ logger }) {\n      logger.log('Hi from my awesome tool!');\n    },\n  };\n};\n```\n\nCheck [spire-plugin-clean], [spire-plugin-doctoc] and [spire-plugin-eslint] for\nmore plugin examples.\n\n### Migrating to Spire\n\n**Identify your tools:** To get started, gather a list of shared tools in your\nexisting projects. This will help to identify which plugins you'll need.\n\n**Pick preset or plugin:** Check if there's already a default or community\nplugin for that.\n[Search for `spire-plugin-*`](https://www.npmjs.com/search?q=spire-plugin-) on\nnpm for individual tools and\n[`spire-config-*`](https://www.npmjs.com/search?q=spire-config-) for specific\necosystems and tech stacks. In case if there's no suitable option for your,\ncheck on how to [write a custom plugin](#writing-a-plugin).\n\n**Make your own preset**: If you find that an existing or default preset works\nfor you, skip this step. If not, create a new module with a name matching\n`spire-config-*`. It can be specific for your personal projects, your company or\na tech stack. Check [writing a config](#writing-a-config) for instructions on\nhow to do this.\n\n**Migrate your projects**: Once you've got a preset ready, go through your\nprojects and [setup Spire](#quick-start) with it. Make sure to delete the\ndependencies it replaces. At this point you're done!\n\n### Using without Git\n\nAt the moment Spire has a hard dependency on a Git repository to resolve\nmonorepo project root. This most likely to be reviewed in the future, but\nmeanwhile it is part of the core, you can export `SKIP_PREFLIGHT_CHECK=true`\nenvironment variable to disable this check. The idea and name of this flag is\nborrowed from [create-react-app].\n\n### Using in monorepos\n\nIt is recommended to install Spire on the root level of a monorepo and run all\ncommands from there. The main motivation behind this is performance and\nconsistency reasons. You can still though run commands in an indivudual package.\nBelow is an example of how to run `spire lint` in a specific monorepo package:\n\n- With [yarn workspaces]:\n  ```sh\n  yarn workspace <pkg-name> spire lint\n  ```\n- With [lerna]:\n  ```sh\n  npx lerna --scope <pkg-name> exec spire lint\n  ```\n\n## API\n\n### CLI\n\nEach plugin can extend a list of available commands and their options. The list\nbelow only includes basic commands.\n\n- `npx spire --help` Prints the list of available commands.\n- `npx spire --version` Prints the current version of Spire.\n- `npx spire <cmd>` Runs a specific command defined by plugins.\n- `npx spire --debug <cmd>` Outputs additional debug information.\n- _(hidden)_ `npx spire hook <name>` Runs specific git or npm plugin hooks.\n  Available hooks are `postinstall`, `preuninstall`, `precommit` and\n  `postmerge`. Use this to test or debug your plugins.\n\n### `spire`\n\nSpire is an object which is passed as the first argument to both configs and\nplugins.\n\n- `spire`\n  - `setState` \\<[function]\\([Object]|[function]\\)\\> Sets state by merging it\n    with previous one (shallow).\n    - `state` \\<[Object]|[function]\\> New state as an object or a function which\n      recevies the previous state and returns an object. Usefull to avoid\n      `getState()` calls.\n  - `getState` \\<[function]\\(\\): [Object]\\> Returns current state.\n  - `hasFile` \\<[function]\\([string]\\): [Promise]\\<[boolean]\\>\\> Checks if\n    current projects contains specific file.\n  - `hasPackageProp` \\<[function]\\([string]\\): [Promise]\\<[boolean]\\>\\> Check if\n    current project's `package.json` contains specific prop.\n\n### `context`\n\nContext is an object which is passed as the first argument to plugin hooks. It's\ndesigned to be read-only. If you want to pass some data futher, consider using\n[`spire.setState` instead](#spire).\n\n- `context`\n  - `argv` \\<[Array]\\<[string]\\>\\> Array of arguments Spire was called with.\n    Defaults to `process.argv.slice(2)`.\n  - `cli` \\<[Object]\\> Instance of [yargs](http://yargs.js.org/) for adding\n    custom commands.\n  - `cwd` \\<[string]\\> Directory Spire is executed in. Defaults to\n    `process.cwd()`.\n  - `env` \\<[Object]\\> Set of environment variables. Defaults to `process.env`.\n  - `logger` \\<[Object]\\> Instance of\n    [Signale](https://github.com/klauscfhq/signale). Use `logger.debug()` to\n    print debug info which is only shown with `--debug` flag.\n  - `config` \\<[Object]\\> Parsed and normalised [config](#writing-a-config).\n  - `options` \\<[Object]\\> Parsed yargs options. Available only after `setup`\n    hook.\n\n## References\n\nThis project is inspired by the great work of JavaScript open source community\n(without particular order):\n\n- [Kent C. Dodds: Tools without config 🛠📦](https://blog.kentcdodds.com/automation-without-config-412ab5e47229)\n- [Dan Abramov: The Melting Pot of JavaScript](https://www.youtube.com/watch?v=nl30vWYKs9A)\n- [Jamie Kyle: Tools 4 Tools 4 Tools](https://www.youtube.com/watch?v=itI5xGyvtho)\n- [semantic-release](https://github.com/semantic-release/semantic-release)\n- [react-scripts](https://github.com/facebook/create-react-app/tree/next/packages/react-scripts)\n- [kcd-scripts](https://github.com/kentcdodds/kcd-scripts)\n- [bolt](https://github.com/boltpkg/bolt)\n\n## License\n\nMIT &copy; [ResearchGate](https://github.com/researchgate)\n\n[context]: #context\n[spire-config-default]:\n  https://github.com/researchgate/spire/blob/master/packages/spire-config-default\n[spire-plugin-yarn]:\n  https://github.com/researchgate/spire/blob/master/packages/spire-plugin-yarn\n[spire-plugin-clean]:\n  https://github.com/researchgate/spire/blob/master/packages/spire-plugin-clean\n[spire-plugin-doctoc]:\n  https://github.com/researchgate/spire/blob/master/packages/spire-plugin-doctoc\n[spire-plugin-eslint]:\n  https://github.com/researchgate/spire/blob/master/packages/spire-plugin-eslint\n[spire-plugin-semantic-release]:\n  https://github.com/researchgate/spire/blob/master/packages/spire-plugin-semantic-release\n[spire-plugin-lerna-release]:\n  https://github.com/researchgate/spire/blob/master/packages/spire-plugin-lerna-release\n[boolean]:\n  https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Boolean_type\n[string]:\n  https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type\n[array]:\n  https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array\n[object]:\n  https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object\n[function]:\n  https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function\n[promise]:\n  https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise\n[symbol]:\n  https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol\n[create-react-app]: https://github.com/facebook/create-react-app\n[yarn workspaces]: https://yarnpkg.com/lang/en/docs/workspaces/\n[lerna]: https://github.com/lerna/lerna\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/researchgate/spire/issues"},"homepage":"https://github.com/researchgate/spire#readme","_id":"spire@1.8.4-next.47","_nodeVersion":"12.16.3","_npmVersion":"lerna/3.20.2/node@v12.16.3+x64 (linux)","dist":{"integrity":"sha512-SArCps+iWnkW1xMH4ilyrbOscvxivkUvIq4c1lxKrFqCM/VrORPw0oZIlDbbReZMiG4TcgnAqORZhG+DLsXXcQ==","shasum":"17b4cbbc88219b687351fb8c7e43ad6728f1fa5e","tarball":"https://registry.npmjs.org/spire/-/spire-1.8.4-next.47.tgz","fileCount":20,"unpackedSize":38687,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeqp9ZCRA9TVsSAnZWagAAv6wP/1DIOAGaTOGzvQgJYqJq\nqQaYgXP73g1S3JYC72UxXhikqz1557ItyQ8LnaDBRFZnJnzI2ivHzpMLUerN\nFmGXNm92LQej0pJXG64QCNNNd0qSpbJkjPi4qHkGL2qwfkRnKG0yJFi3f0S9\n0AaUS2KYz+h+Oc+awhdaTT22LuMQqzjiXjKWKA39scwn7u2AAJM1En6zxjNm\nyqpCZmLyE7zUvnruZiMUlU7s0Z7MT1GV/4wPPmoMWBqyjfGnBgNwnb+ZM6JL\nKQwvdzqK+kDzbsyDqQqWWKhS/j4J4YunjEM1hfgp99rwwHZOjVZsiXI/G3VZ\n9weX2farkHatWV4NtyNo9NbmbBy24RxBZ78Bjg56+OdStZKBzNlLj5l8tQWT\n06t4+F5TdqbkylaHYpK+j9GtvhiMA72Db0fzIElQQAVIPQzM6slpYhgdtOCv\n3ptI9El5RnI4FeWnSpyyPGR4Gi/EzQ6Z8YLsvK56YYIb2CLrL9pewmJpZ1td\njXqkdknI/fGEE+IlLAXXHawMcTuiRIJw11Uy9whyCth/25PuVEH4JTlUeodk\np3t7jIxfm1k7uyNgrNRt+f7n2JQZVT5SiVcRISAegWp2e23t5Rz0GXL0nP+x\nxv2DdnivdVjsArtOGfWLmtDjCu9d2wOFY7h+hK6WJJ4AYZnUY/kQLqfwIyv5\nY1WY\r\n=zEj/\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCycb0oMx9yL2Du4B2AUO3YpaWw06EdWTHAk+Fy1cYHlwIhAPXIXONWNLM3DWx2JT7u17m90hymt8BwO7T1lHuCtF/U"}]},"maintainers":[{"email":"daniel@tschinder.de","name":"danez"},{"email":"justnvdm@gmail.com","name":"justinvdm"},{"email":"sebastian.jerie@researchgate.net","name":"researchgate-bot"},{"email":"sergey@bekrin.me","name":"sbekrin"},{"email":"info@weaintplastic.com","name":"weaintplastic"}],"_npmUser":{"name":"researchgate-bot","email":"stefan.hoth@researchgate.net"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/spire_1.8.4-next.47_1588240216921_0.5637193351277969"},"_hasShrinkwrap":false},"1.8.4-next.48":{"name":"spire","version":"1.8.4-next.48","description":"Extensible CLI toolkit managment tool","main":"index.js","repository":{"type":"git","url":"git+https://github.com/researchgate/spire.git"},"author":{"name":"Sergey Bekrin","email":"sergey@bekrin.me","url":"https://bekrin.me"},"license":"MIT","bin":{"spire":"bin/spire.js"},"engines":{"node":">=10.18.0"},"scripts":{"postinstall":"./bin/spire.js hook postinstall","preuninstall":"./bin/spire.js hook preuninstall"},"dependencies":{"cosmiconfig":"^6.0.0","detect-indent":"^6.0.0","fs-extra":"^9.0.0","import-from":"^3.0.0","invariant":"^2.2.4","pretty-format":"^25.0.0","signale":"^1.4.0","spire-config-default":"^1.8.4-next.48+0a66686","yargs":"^15.0.0"},"devDependencies":{"spire-test-utils":"^1.8.2"},"prettier":"spire-plugin-prettier/config","gitHead":"0a666868e8d87e5c184c931dcd089831d21b7713","readme":"# 🗼 Spire\n\nExtensible JavaScript toolbox management.\n\n<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->\n\n- [Motivation](#motivation)\n- [Quick Start](#quick-start)\n- [Configuration](#configuration)\n  - [Using a Custom Preset](#using-a-custom-preset)\n  - [Using a Local Preset](#using-a-local-preset)\n  - [Passing Options](#passing-options)\n- [Guides](#guides)\n  - [Writing a Config](#writing-a-config)\n  - [Writing a Plugin](#writing-a-plugin)\n  - [Migrating to Spire](#migrating-to-spire)\n  - [Using without Git](#using-without-git)\n  - [Using in monorepos](#using-in-monorepos)\n- [API](#api)\n  - [CLI](#cli)\n  - [`spire`](#spire)\n  - [`context`](#context)\n- [References](#references)\n- [License](#license)\n\n<!-- END doctoc generated TOC please keep comment here to allow auto update -->\n\n## Motivation\n\n**Problem:** Maintaining tools and configurations for linting, testing and\nbuilding your code is hard. The more projects you have, the more time it takes\nto keep your setup consistent and up-to-date.\n\n**Solution:** Spire is a pluggable CLI tool which allows you to abstract all of\nyour tools and configurations into reusable plugins and presets. Think of it as\n“babel for infrastructure”.\n\n## Quick Start\n\n1. Install `spire`:\n\n```sh\n# yarn\nyarn add --dev spire\n\n# npm\nnpm install --save-dev spire\n```\n\n2. Start using in your project:\n\n```sh\n# npx\nnpx spire --help\n\n# yarn\nyarn spire --help\n```\n\n3. Depending on your tech stack, you can start using Spire as zero-config tool.\n   See [spire-config-default] for a list of default tools and\n   [configuration section](#configuration) for how to customise it.\n\n- _Using yarn? Consider installing [spire-plugin-yarn] for few power features._\n\n- _Want to have automated release w/ changelog generation? Check out\n  [spire-plugin-semantic-release] and [spire-plugin-lerna-release] for lerna\n  monorepos._\n\n## Configuration\n\nSpire is based on config presets, which is the same concept for tools like\n[Babel](https://babeljs.io/) and [ESLint](https://eslint.org/). Configs are a\nset of predefined plugins and their options. Configs can also extend a chain of\nother configs. By default, Spire is shipped with [spire-config-default].\n\n### Using a Custom Preset\n\nTo use your preferred configuration, install it as dev dependency and reference\nit by module name in [`extends` property](#writing-a-config). To extend multiple\nconfigs, provide it as an array. You can also use individual plugins along with\nconfigs with [`plugins` property](#writing-a-config).\n\n<details open>\n  <summary>via <code>package.json#spire</code> (recommended)</summary>\n\n```json\n{\n  \"name\": \"acme-project\",\n  \"devDependencies\": {\n    \"spire\": \"^1.0.0\",\n    \"spire-config-acme\": \"^1.0.0\"\n  },\n  \"spire\": {\n    \"extends\": \"spire-config-acme\"\n  }\n}\n```\n\n</details>\n\n<details>\n  <summary>via <code>spire.config.js</code></summary>\n\n```js\nmodule.exports = {\n  extends: 'spire-config-acme',\n};\n```\n\n</details>\n\n<details>\n  <summary>via <code>.spirerc</code></summary>\n\n```js\n{\n  \"extends\": \"spire-config-acme\",\n}\n```\n\n</details>\n\n### Using a Local Preset\n\n_Note: It is recommended to enable Local Presets only for development._\n\nYou can reference a Local Preset or plugin using `<rootDir>` placeholder which\npoints to the current project directory:\n\n```json\n{\n  \"spire\": {\n    \"extends\": \"<rootDir>/spire-config.js\",\n    \"plugins\": [\"<rootDir>/spire-plugin.js\"]\n  }\n}\n```\n\n### Passing Options\n\nIf the config preset or plugin you're using supports customisation, you can pass\noptions to it:\n\n```json\n{\n  \"spire\": {\n    \"extends\": [[\"spire-config-acme\", { \"fictional\": false }]],\n    \"plugins\": [[\"spire-plugin-acme\", { \"company\": true }]]\n  }\n}\n```\n\n## Guides\n\n### Writing a Config\n\nA Config is a module which exports a function returning an object.\n\n- `config` \\<[function]([Object], [Object])\\>\n  - `spire` \\<[Object]\\> Spire [API object](#spire).\n  - `options` \\<[Object]\\> User-provided config options.\n- returns: \\<[Object]\\>\n  - `extends` \\<[string]|\\<[Array]\\<[string]\\>\\>\\> Config or an array of config\n    presets to extend.\n  - `plugins` \\<[Array]\\<[string]\\>\\> Array of plugins to include.\n\nExample:\n\n```js\nmodule.exports = (spire, options) => {\n  return {\n    extends: ['spire-config-first', 'spire-config-second'],\n    plugins: ['spire-plugin'],\n  };\n};\n```\n\nYou can dynamically change the behaviour of your preset based on `options` or\n`spire` APIs, but it's recommended to keep it explicit. Check\n[spire-config-default](https://github.com/researchgate/spire/blob/master/packages/spire-config-default/index.js)\nfor a reference.\n\n### Writing a Plugin\n\nA Plugin is a key component of Spire. After it resolves the config, Spire\naccumulates all plugins in chronological order and runs them. A Plugin is a\nfunction returning an object:\n\n_Note: It is recommended to keep plugins scoped to a single feature or tool._\n\n- `plugin` \\<[function]([Object], [Object])\\>\n  - `spire` \\<[Object]\\> Spire [API object](#spire).\n  - `options` \\<[Object]\\> User-provided plugin options.\n- returns: \\<[Object]\\>\n  - `name` \\<[string]\\> Name of the plugin (recommended).\n  - `command` \\<[string]\\> Optional name of command. Leaving it empty will\n    ignore `run` hook completly.\n  - `description` \\<[string]\\> Optional human-readable command description.\n  - `preinstall` \\<[function]\\([Context]\\): [Promise]\\> Executed before\n    `yarn install` or `npm install`\n  - `postinstall` \\<[function]\\([Context]\\): [Promise]\\> Executed after\n    `yarn install` or `npm install`.\n  - `postmerge` \\<[function]\\([Context]\\): [Promise]\\> Executed on `git pull`.\n  - `precommit` \\<[function]\\([Context]\\): [Promise]\\> Executed on `git commit`.\n  - `setup` \\<[function]\\([Context]\\): [Promise]\\> Executed before `run` hook.\n    Use it to prepare arguments or config for your tools. If it fails, Spire\n    stops futher hooks from being executed.\n  - `run` \\<[function]\\([Context]\\): [Promise]\\> Executed as the main logic of\n    the plugin. Use this hook to run the CLI tool or process long-running task.\n  - `teardown` \\<[function]\\([Context]\\): [Promise]\\> Executed after `run` hook,\n    even if it has failed. Use this hook to cleanup locally or to collect some\n    stats.\n  - `preuninstall` \\<[function]\\([Context]\\): [Promise]\\> Executed before\n    `yarn uninstall` or `npm uninstall`. Run it to cleanup external data.\n\nExample:\n\n```js\nmodule.exports = (spire, options) => {\n  return {\n    name: 'my-awesome-tool',\n    command: 'my-tool',\n    description: 'run my awesome tool',\n    async run({ logger }) {\n      logger.log('Hi from my awesome tool!');\n    },\n  };\n};\n```\n\nCheck [spire-plugin-clean], [spire-plugin-doctoc] and [spire-plugin-eslint] for\nmore plugin examples.\n\n### Migrating to Spire\n\n**Identify your tools:** To get started, gather a list of shared tools in your\nexisting projects. This will help to identify which plugins you'll need.\n\n**Pick preset or plugin:** Check if there's already a default or community\nplugin for that.\n[Search for `spire-plugin-*`](https://www.npmjs.com/search?q=spire-plugin-) on\nnpm for individual tools and\n[`spire-config-*`](https://www.npmjs.com/search?q=spire-config-) for specific\necosystems and tech stacks. In case if there's no suitable option for your,\ncheck on how to [write a custom plugin](#writing-a-plugin).\n\n**Make your own preset**: If you find that an existing or default preset works\nfor you, skip this step. If not, create a new module with a name matching\n`spire-config-*`. It can be specific for your personal projects, your company or\na tech stack. Check [writing a config](#writing-a-config) for instructions on\nhow to do this.\n\n**Migrate your projects**: Once you've got a preset ready, go through your\nprojects and [setup Spire](#quick-start) with it. Make sure to delete the\ndependencies it replaces. At this point you're done!\n\n### Using without Git\n\nAt the moment Spire has a hard dependency on a Git repository to resolve\nmonorepo project root. This most likely to be reviewed in the future, but\nmeanwhile it is part of the core, you can export `SKIP_PREFLIGHT_CHECK=true`\nenvironment variable to disable this check. The idea and name of this flag is\nborrowed from [create-react-app].\n\n### Using in monorepos\n\nIt is recommended to install Spire on the root level of a monorepo and run all\ncommands from there. The main motivation behind this is performance and\nconsistency reasons. You can still though run commands in an indivudual package.\nBelow is an example of how to run `spire lint` in a specific monorepo package:\n\n- With [yarn workspaces]:\n  ```sh\n  yarn workspace <pkg-name> spire lint\n  ```\n- With [lerna]:\n  ```sh\n  npx lerna --scope <pkg-name> exec spire lint\n  ```\n\n## API\n\n### CLI\n\nEach plugin can extend a list of available commands and their options. The list\nbelow only includes basic commands.\n\n- `npx spire --help` Prints the list of available commands.\n- `npx spire --version` Prints the current version of Spire.\n- `npx spire <cmd>` Runs a specific command defined by plugins.\n- `npx spire --debug <cmd>` Outputs additional debug information.\n- _(hidden)_ `npx spire hook <name>` Runs specific git or npm plugin hooks.\n  Available hooks are `postinstall`, `preuninstall`, `precommit` and\n  `postmerge`. Use this to test or debug your plugins.\n\n### `spire`\n\nSpire is an object which is passed as the first argument to both configs and\nplugins.\n\n- `spire`\n  - `setState` \\<[function]\\([Object]|[function]\\)\\> Sets state by merging it\n    with previous one (shallow).\n    - `state` \\<[Object]|[function]\\> New state as an object or a function which\n      recevies the previous state and returns an object. Usefull to avoid\n      `getState()` calls.\n  - `getState` \\<[function]\\(\\): [Object]\\> Returns current state.\n  - `hasFile` \\<[function]\\([string]\\): [Promise]\\<[boolean]\\>\\> Checks if\n    current projects contains specific file.\n  - `hasPackageProp` \\<[function]\\([string]\\): [Promise]\\<[boolean]\\>\\> Check if\n    current project's `package.json` contains specific prop.\n\n### `context`\n\nContext is an object which is passed as the first argument to plugin hooks. It's\ndesigned to be read-only. If you want to pass some data futher, consider using\n[`spire.setState` instead](#spire).\n\n- `context`\n  - `argv` \\<[Array]\\<[string]\\>\\> Array of arguments Spire was called with.\n    Defaults to `process.argv.slice(2)`.\n  - `cli` \\<[Object]\\> Instance of [yargs](http://yargs.js.org/) for adding\n    custom commands.\n  - `cwd` \\<[string]\\> Directory Spire is executed in. Defaults to\n    `process.cwd()`.\n  - `env` \\<[Object]\\> Set of environment variables. Defaults to `process.env`.\n  - `logger` \\<[Object]\\> Instance of\n    [Signale](https://github.com/klauscfhq/signale). Use `logger.debug()` to\n    print debug info which is only shown with `--debug` flag.\n  - `config` \\<[Object]\\> Parsed and normalised [config](#writing-a-config).\n  - `options` \\<[Object]\\> Parsed yargs options. Available only after `setup`\n    hook.\n\n## References\n\nThis project is inspired by the great work of JavaScript open source community\n(without particular order):\n\n- [Kent C. Dodds: Tools without config 🛠📦](https://blog.kentcdodds.com/automation-without-config-412ab5e47229)\n- [Dan Abramov: The Melting Pot of JavaScript](https://www.youtube.com/watch?v=nl30vWYKs9A)\n- [Jamie Kyle: Tools 4 Tools 4 Tools](https://www.youtube.com/watch?v=itI5xGyvtho)\n- [semantic-release](https://github.com/semantic-release/semantic-release)\n- [react-scripts](https://github.com/facebook/create-react-app/tree/next/packages/react-scripts)\n- [kcd-scripts](https://github.com/kentcdodds/kcd-scripts)\n- [bolt](https://github.com/boltpkg/bolt)\n\n## License\n\nMIT &copy; [ResearchGate](https://github.com/researchgate)\n\n[context]: #context\n[spire-config-default]:\n  https://github.com/researchgate/spire/blob/master/packages/spire-config-default\n[spire-plugin-yarn]:\n  https://github.com/researchgate/spire/blob/master/packages/spire-plugin-yarn\n[spire-plugin-clean]:\n  https://github.com/researchgate/spire/blob/master/packages/spire-plugin-clean\n[spire-plugin-doctoc]:\n  https://github.com/researchgate/spire/blob/master/packages/spire-plugin-doctoc\n[spire-plugin-eslint]:\n  https://github.com/researchgate/spire/blob/master/packages/spire-plugin-eslint\n[spire-plugin-semantic-release]:\n  https://github.com/researchgate/spire/blob/master/packages/spire-plugin-semantic-release\n[spire-plugin-lerna-release]:\n  https://github.com/researchgate/spire/blob/master/packages/spire-plugin-lerna-release\n[boolean]:\n  https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Boolean_type\n[string]:\n  https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type\n[array]:\n  https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array\n[object]:\n  https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object\n[function]:\n  https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function\n[promise]:\n  https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise\n[symbol]:\n  https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol\n[create-react-app]: https://github.com/facebook/create-react-app\n[yarn workspaces]: https://yarnpkg.com/lang/en/docs/workspaces/\n[lerna]: https://github.com/lerna/lerna\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/researchgate/spire/issues"},"homepage":"https://github.com/researchgate/spire#readme","_id":"spire@1.8.4-next.48","_nodeVersion":"12.16.3","_npmVersion":"lerna/3.20.2/node@v12.16.3+x64 (linux)","dist":{"integrity":"sha512-sPWbp5fn/dyk6zAxtlINWq9j/vBbXoGaYgr56qMuAqNt1ZTs7pamtR3vSVtbIcHyq+GwMXzipObPva8PXyeXJg==","shasum":"417e29f9ff8ab2c149b769e60c04472d5ba60152","tarball":"https://registry.npmjs.org/spire/-/spire-1.8.4-next.48.tgz","fileCount":20,"unpackedSize":37864,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeqrPzCRA9TVsSAnZWagAAV4QP/R5JbplyC4z73DgNnN2Y\nMdKaUaC4uhJPfssFWdPtSsKdCopo1lLcAznA7rIz2QsbT5BZJpK1mVGVDMfa\nB2aBbVlB+KRMJsVgOLbRh3p+1XH827a8g56qyhg8WrcP4AufFKD/k1oGKDCS\nKfsaLYtZCpQASQBJXX5ZlP17awP1RyOzHesKhx4InqXoIacWZUG6J6ImSsiL\nh6dFessyQS+u6dhEzTBhPTrGxeUVjqh95hlSL0nViUJ+xmgf9CAExFWLFAoL\nKydRhdzMcqYe66b+yPL9U+nsx3XghgJ8w/Q4GnHBuNrVw1dxsbS5O1F4CyY3\nvSPjnTgHb4Rjyk7FuKgqOQInJo7NThqmAkuOJtV+zjlSBxjpTXRY16HjW4oY\nTsGw2I4sl0SzYWZmI4zF5pgjPSsjtThZzlqWw55JbtvgeXWlz4vjvW0ERAHi\nHddZaD7/Vp6nddJwPtFrZpxkDBf2s3ETrVxT+NXeRymiZcnxvCdU6LsjS19k\ncay3p81Hyvll8Z1OiUs+50KDDfbInfsAMiJgQ7bJMrTE4smI8xry4yK77uPY\nKUylSY7rj2mj8JlvBaEPibCFC3A2SHvpiICJ+rnn6VH8wODwkkCZ7X4xoOQI\nmmhohqp3wpPUXe1af3sDkgH4ci3L9qqtS9h8lR8TrSJdfmR0g5gsbZVIxX0q\n9LMf\r\n=WJqV\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDDq/B54JrelbqZex7OAyZyLwuva/XKXJ6eUUHXrWPCeAiEAgDq8ujA8bUEqeC8sMlZnA8Bw4QpQApiciWWvPf4x2GA="}]},"maintainers":[{"email":"daniel@tschinder.de","name":"danez"},{"email":"justnvdm@gmail.com","name":"justinvdm"},{"email":"sebastian.jerie@researchgate.net","name":"researchgate-bot"},{"email":"sergey@bekrin.me","name":"sbekrin"},{"email":"info@weaintplastic.com","name":"weaintplastic"}],"_npmUser":{"name":"researchgate-bot","email":"stefan.hoth@researchgate.net"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/spire_1.8.4-next.48_1588245491464_0.6756471942265967"},"_hasShrinkwrap":false},"2.0.0":{"name":"spire","version":"2.0.0","description":"Extensible CLI toolkit managment tool","main":"index.js","repository":{"type":"git","url":"git+https://github.com/researchgate/spire.git"},"author":{"name":"Sergey Bekrin","email":"sergey@bekrin.me","url":"https://bekrin.me"},"license":"MIT","bin":{"spire":"bin/spire.js"},"engines":{"node":">=10.18.0"},"scripts":{"postinstall":"./bin/spire.js hook postinstall","preuninstall":"./bin/spire.js hook preuninstall"},"dependencies":{"cosmiconfig":"^6.0.0","detect-indent":"^6.0.0","fs-extra":"^9.0.0","import-from":"^3.0.0","invariant":"^2.2.4","pretty-format":"^25.0.0","signale":"^1.4.0","spire-config-default":"^2.0.0","yargs":"^15.0.0"},"devDependencies":{"spire-test-utils":"^2.0.0"},"prettier":"spire-plugin-prettier/config","gitHead":"bacdadd991d7a5f74908c03e339e2dc86561c47f","bugs":{"url":"https://github.com/researchgate/spire/issues"},"homepage":"https://github.com/researchgate/spire#readme","_id":"spire@2.0.0","_nodeVersion":"12.16.3","_npmVersion":"lerna/3.20.2/node@v12.16.3+x64 (linux)","dist":{"integrity":"sha512-+jAyOF+hgdsuj10UDZ8hSjmeM52e+bZ/3INxUlGb41IWaFV7tV7kQPSaTGBc3E1VNx1LNhIPjGfFVnyQTsC/rA==","shasum":"9bb97c3ac75a04bcd8a22430df1bbae361654fda","tarball":"https://registry.npmjs.org/spire/-/spire-2.0.0.tgz","fileCount":20,"unpackedSize":40490,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeqsHCCRA9TVsSAnZWagAA0A0QAJfQqAuibZC8r8w3dELP\nPwEz3FbkKFvJioz/JZBN3Yg3luc2Z60GejDULwOIFiTPnYj3crlLyUAD1gVH\nlvtPcUBArA9WRbcPgrkI8are9oMhWFfn0ZjOi8cqvYu6IVI49BzFTe4EOe8a\nwaSD42uXBqSilFpzAjBtVFEK4OKAujLQ6n0HZp0+gXaQxssDqwSNbtZJx7U8\nRA6wgWLC08WT+OtB4lkK5o3gzM/Jx1TVBNpyaEbtEPlqaNY7xX+l8LtfDbBM\nZy/l2jH3S4VTwBfzUorxCdLc2n7GZmoTa7LemIWqcOCWP8zWDjIMU194PELM\nd7s9NYmDc4F+tcj+ggEuUk+M1hZBlW1ta0Bo3FmX58BdsR/wyS5710Xe1S20\nmwBgvIHjEuKkqbVEW6kG8gD16418snrBM7OfIvMapM0UzHPlpTx7ZfWCN3we\n4cqPwXJPEFk0rAseZQKSMEqWTH7jVOGDWDZ63efhI9j97ANCOnV+YtFccw7D\nIwp++9//gcMNE+jeutx852IP9tOHUFAFRTI7a9CNDvZd7EPm+fJO7udBLwLf\nY92InAgIa6g01q6oSEyfdmamifDx8oblj2icr7q+hn7gaW/98anVa3pDZvY3\ng4ugf2p7zyE9zTCZgJXtsc/ENjGb//Mrv0CnTYAygEOd9fZQIa+9tBUPn888\n8ofc\r\n=HPX6\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD2tQW5/evy8sq9jCBsT6xXiaHsTGFbd5pcMJLEFfkC+AIgQzdmLgdN+UhQx/nkRKBLH7d1S/8UDHgjiqEgRKV3E9k="}]},"maintainers":[{"email":"daniel@tschinder.de","name":"danez"},{"email":"justnvdm@gmail.com","name":"justinvdm"},{"email":"sebastian.jerie@researchgate.net","name":"researchgate-bot"},{"email":"sergey@bekrin.me","name":"sbekrin"},{"email":"info@weaintplastic.com","name":"weaintplastic"}],"_npmUser":{"name":"researchgate-bot","email":"stefan.hoth@researchgate.net"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/spire_2.0.0_1588249026209_0.2862239528707544"},"_hasShrinkwrap":false},"2.0.1":{"name":"spire","version":"2.0.1","description":"Extensible CLI toolkit managment tool","main":"index.js","repository":{"type":"git","url":"git+https://github.com/researchgate/spire.git"},"author":{"name":"Sergey Bekrin","email":"sergey@bekrin.me","url":"https://bekrin.me"},"license":"MIT","bin":{"spire":"bin/spire.js"},"engines":{"node":">=10.18.0"},"scripts":{"postinstall":"./bin/spire.js hook postinstall","preuninstall":"./bin/spire.js hook preuninstall"},"dependencies":{"cosmiconfig":"^6.0.0","detect-indent":"^6.0.0","fs-extra":"^9.0.0","import-from":"^3.0.0","invariant":"^2.2.4","pretty-format":"^25.0.0","signale":"^1.4.0","spire-config-default":"^2.0.1","yargs":"^15.0.0"},"devDependencies":{"spire-test-utils":"^2.0.1"},"prettier":"spire-plugin-prettier/config","gitHead":"266d2f829f163e0349c9bc5eb429818b2c63d096","bugs":{"url":"https://github.com/researchgate/spire/issues"},"homepage":"https://github.com/researchgate/spire#readme","_id":"spire@2.0.1","_nodeVersion":"12.16.3","_npmVersion":"lerna/3.20.2/node@v12.16.3+x64 (linux)","dist":{"integrity":"sha512-iRz765voZXm67c8qFxtSqBGUZ/fgbmFO54Y1Cr4HHkqfVr/NNjCRDrzg7YDc+BryS+wAmNdREnam+qjqoF+AjA==","shasum":"8afd54fcd102a17b7e545b3adc202380cac46eed","tarball":"https://registry.npmjs.org/spire/-/spire-2.0.1.tgz","fileCount":20,"unpackedSize":42012,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeqs0oCRA9TVsSAnZWagAAWDQP/1kVXCJGi1oGB+sCoyhF\n6OZ684IqVcx+Np0NT09GVyrfnD1t2HdbV8dtXWRKp7DInBDh/gM2JJco2J8d\nmHnebSJEgDAygKLxtO0iFeACh8vFUtcJ0TRdVoivLkQlZbmbgT671NkEwOvI\ntGRafYrbYbybKqFESOXTVqB/ohMAtN0Eguoi+gicr/XqnmS07Eq9o/X4eeXr\nqq+m0i+UXWau5UufHI6i6+Nlmm8Y6+clLVSEOH0GXQ+5aHSgEoSvmmlW6S6D\n/00sMH0m67zup5ILbHp2zvAhAMlbJsGkrL3i8BAGt4C2J5i3g5Kiz3T4E0Ad\n/UcdyFihjwkMWNaClzGzUj2gnlPgczknvmdMJYmmJQ96feqsCHBVQiI3j4dN\n3zUI8h9beX/DlPcuv0z3z+gDkOqLJSQ8ZbUgQchEsC2EsKNk00jVLX2g7cnK\nyKf8C0YuK9IY+y94HA69KfhnnC5B/CjEF90QaJTSiLOJ0d69LJnmpn0rN1vV\ndO91QHX7h7SveKi+lPCZad/lTSeKVCkmHtUcEYjmVTm/h2Ni1DfD0y/kff0r\no/k8wRNCXK7GcAppRlMGo2sHFvgYBC0+Xo4wKRKcdUTsdgjJtWOXJ9mgSb4Z\nBQIdTIh0kNOOr6Ww4Pixn7xzbcLbpOjtcXstTXpeWjF4P1XlMJc0yCzs4thQ\nMkj9\r\n=+WuP\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIBiaFUp7L/kQkzwzRdepiuzFC8RwNbexA/BpmUYpbfSjAiBoh74+isHFelbNu7ZAtYziphtRWCMU4lxk0BRUtK0yBQ=="}]},"maintainers":[{"email":"daniel@tschinder.de","name":"danez"},{"email":"justnvdm@gmail.com","name":"justinvdm"},{"email":"sebastian.jerie@researchgate.net","name":"researchgate-bot"},{"email":"sergey@bekrin.me","name":"sbekrin"},{"email":"info@weaintplastic.com","name":"weaintplastic"}],"_npmUser":{"name":"researchgate-bot","email":"stefan.hoth@researchgate.net"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/spire_2.0.1_1588251944051_0.8668183860719971"},"_hasShrinkwrap":false},"2.0.2":{"name":"spire","version":"2.0.2","description":"Extensible CLI toolkit managment tool","main":"index.js","repository":{"type":"git","url":"git+https://github.com/researchgate/spire.git"},"author":{"name":"Sergey Bekrin","email":"sergey@bekrin.me","url":"https://bekrin.me"},"license":"MIT","bin":{"spire":"bin/spire.js"},"engines":{"node":">=10.18.0"},"scripts":{"postinstall":"./bin/spire.js hook postinstall","preuninstall":"./bin/spire.js hook preuninstall"},"dependencies":{"cosmiconfig":"^6.0.0","detect-indent":"^6.0.0","fs-extra":"^9.0.0","import-from":"^3.0.0","invariant":"^2.2.4","pretty-format":"^25.0.0","signale":"^1.4.0","spire-config-default":"^2.0.2","yargs":"^15.0.0"},"devDependencies":{"spire-test-utils":"^2.0.1"},"prettier":"spire-plugin-prettier/config","gitHead":"b8c1ab698a126a0b56543c0225b4dedfb8d0a1e3","bugs":{"url":"https://github.com/researchgate/spire/issues"},"homepage":"https://github.com/researchgate/spire#readme","_id":"spire@2.0.2","_nodeVersion":"12.16.3","_npmVersion":"lerna/3.20.2/node@v12.16.3+x64 (linux)","dist":{"integrity":"sha512-16fg6gdAb0kga+oU9pjc8yIGbSin9UMm13VW918OLU/9wmRKZ0OT/AeU7++Cnzp+OvC7H+rdOVJpu86WWhnQ2Q==","shasum":"199e018c41f5c860f58e224e864a9aa034027e38","tarball":"https://registry.npmjs.org/spire/-/spire-2.0.2.tgz","fileCount":20,"unpackedSize":42262,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeqs5XCRA9TVsSAnZWagAAkbQP/RfpiLUjvhimDl9hDRGD\n3yzxjU1sghJ6OlQE9jWJsTxt3ujyIyqIB8yjoAM8iTTfwacHgyzZJCdLneEP\nI0ADUHkRRZQeR+BCrhIHex5l1U2dNG4KIMKDVmB9ZkFZ9s03NxZGF+24XfFx\naXY30OeU1V0Ex2HJNRtCuSJJmKIJiEiA49EXqut8EKWvYRdgLD4jvw26RZaX\ngctRxD4x9Le6j8aH66zO/cg5HqPsZnwZ/LJFNriRgJawK7kGPIh+u2HmjMJC\nu9IqhgA6ukKmyKcDigKcnh/dmFgFA55nXJbUS8HcQAvIjnrI2a34F1j4Q5k/\nVWJqvFJvLJUJtr5V+LyUzDOzIRh2wK5/YnW8SFmTzfEi0c43MKSqBdOEGnPT\nj6yVOl9MG92PB65LFzlQdhHA/ofyZq5A6E2dN+zMKi8NYdPuVJEq8Zki7V0m\nlu88u6zrLq4DyGNyTtMiTKKsgdgEeJmd+v8g8H06Dys9slkramr+UkaO9Jz5\nzuD9Q6O0InuVsl0Vqkqr8JF7TKeuoa7ioSVQRgDoWHj2irBAn2pv6V2pOtfx\nT/hiuBUI7AckpwbGA9ipr8+b0uNlvNK1Jxn1V2kG7bFiTO7VS013hNqi5nJ0\ngaVHGbu6pr9H1ScjKkiiKVB3Is38+t3jy+ZsoxyRFoegCB45KhniK/w/5/i7\n7kfS\r\n=ZSCC\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQC1/n/hJH05yX/gz6d3QAfM7ybdLvz4nad2e3u0Hgo90QIhAL0Ggr7qOm3W3Td1IcgkdbmpfVI/frG6xtMw91L4Mmpk"}]},"maintainers":[{"email":"daniel@tschinder.de","name":"danez"},{"email":"justnvdm@gmail.com","name":"justinvdm"},{"email":"sebastian.jerie@researchgate.net","name":"researchgate-bot"},{"email":"sergey@bekrin.me","name":"sbekrin"},{"email":"info@weaintplastic.com","name":"weaintplastic"}],"_npmUser":{"name":"researchgate-bot","email":"stefan.hoth@researchgate.net"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/spire_2.0.2_1588252246637_0.749505909937076"},"_hasShrinkwrap":false},"2.1.0":{"name":"spire","version":"2.1.0","description":"Extensible CLI toolkit managment tool","main":"index.js","repository":{"type":"git","url":"git+https://github.com/researchgate/spire.git"},"author":{"name":"Sergey Bekrin","email":"sergey@bekrin.me","url":"https://bekrin.me"},"license":"MIT","bin":{"spire":"bin/spire.js"},"engines":{"node":">=10.18.0"},"scripts":{"postinstall":"./bin/spire.js hook postinstall","preuninstall":"./bin/spire.js hook preuninstall"},"dependencies":{"cosmiconfig":"^6.0.0","detect-indent":"^6.0.0","fs-extra":"^9.0.0","import-from":"^3.0.0","invariant":"^2.2.4","pretty-format":"^25.0.0","signale":"^1.4.0","spire-config-default":"^2.0.2","yargs":"^15.0.0"},"devDependencies":{"spire-test-utils":"^2.0.1"},"prettier":"spire-plugin-prettier/config","gitHead":"0e78340d49fa3bb75cb0c42f76565ff38859f3fd","bugs":{"url":"https://github.com/researchgate/spire/issues"},"homepage":"https://github.com/researchgate/spire#readme","_id":"spire@2.1.0","_nodeVersion":"12.16.3","_npmVersion":"lerna/3.20.2/node@v12.16.3+x64 (linux)","dist":{"integrity":"sha512-U408Tr468dc5rL6Dm0wkAlVvVef6nQKgoL/ESUUmas8n5b3VAWja4lZai7UpsAGKA8aIGHzJqRpKag8pa3IUZA==","shasum":"7ec6c8cd2bf9e2b6aa3521a41e3ea6ffeeef5175","tarball":"https://registry.npmjs.org/spire/-/spire-2.1.0.tgz","fileCount":20,"unpackedSize":42911,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeqwtlCRA9TVsSAnZWagAAsOEP/RQbDlD1bOWXTS/xDpGK\n3DhgAiqzr8BhrxOVRT7krkKAJI/ACOy+rXJELtBHtq6RVrYz7TQwSJXS6yZc\nx7vPGUnALDl77OnA4XSZmvQrEWRshvkj3nibOxETpuue/a30UojKwshMxCDb\nxgcpGKtDQcf+Drz1fNuP6Dvskm4tHd4mW16UjyAr7E+sddn2Wbpd/hw5Z7BP\nSWSDxDGDuM9h0ZOoJoBv58X5HyHLLOWDxz59CoeTHmmqNd1rFNVDL7rrXETq\n4lYniickGhgsN1nXL0eJGXXeOW38YPfLTnAg0qVZnHiXq/L0W/S+1BMQ7ky+\nMO1gExNQSdFs6YynkefT7Lx4n/17T733ia0mCtZFRxKvNsXp5tymQr5ylAxL\nlbJ527wPYBhUTJ//4ewoT/nY4Dqiva2VuTUC5SS/DbVtfklJ6gmXiVyrANcP\nDlBwEBY51o2vaH+iTvjiXBbXiu+Dxw/jE2yrON7RMYaZ1AorDZsZFEqjgJm9\nDNYS5ZNpXg5n17RusEjTvoxxUR7cx+z7UxKz3OIqoF45H4ZrKBpcYqfdD6gT\nWsFGMbx8M/b5RPmDeYtG1sDWb0BT3hQNvQzkG4b9OFBDDhxJLhGhL+6RKiRf\n+y2kdOFFdfEsO5QLNT9FBxEGLpFpEoXmlwogEgaXwawpOx/IWOTF+1h6jpPe\nOCz4\r\n=m0zU\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQClWr0eT/WU0x6yAZF3ixayKpw3HtRTYr73+PZvC4MRagIgJIZ2NZy2v+vFnDI0grbOALODudzqq/EUkrTu74EkUwA="}]},"maintainers":[{"email":"daniel@tschinder.de","name":"danez"},{"email":"justnvdm@gmail.com","name":"justinvdm"},{"email":"sebastian.jerie@researchgate.net","name":"researchgate-bot"},{"email":"sergey@bekrin.me","name":"sbekrin"},{"email":"info@weaintplastic.com","name":"weaintplastic"}],"_npmUser":{"name":"researchgate-bot","email":"stefan.hoth@researchgate.net"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/spire_2.1.0_1588267876605_0.5672714268775516"},"_hasShrinkwrap":false},"2.1.2":{"name":"spire","version":"2.1.2","description":"Extensible CLI toolkit managment tool","main":"index.js","repository":{"type":"git","url":"git+https://github.com/researchgate/spire.git"},"author":{"name":"Sergey Bekrin","email":"sergey@bekrin.me","url":"https://bekrin.me"},"license":"MIT","bin":{"spire":"bin/spire.js"},"engines":{"node":">=10.18.0"},"scripts":{"postinstall":"./bin/spire.js hook postinstall","preuninstall":"./bin/spire.js hook preuninstall"},"dependencies":{"cosmiconfig":"^6.0.0","detect-indent":"^6.0.0","fs-extra":"^9.0.0","import-from":"^3.0.0","invariant":"^2.2.4","pretty-format":"^26.0.0","signale":"^1.4.0","spire-config-default":"^2.1.2","yargs":"^15.0.0"},"devDependencies":{"spire-test-utils":"^2.0.1"},"prettier":"spire-plugin-prettier/config","gitHead":"af22d52467a45bdd9acf83bc9fe9276fb1aa4bf4","bugs":{"url":"https://github.com/researchgate/spire/issues"},"homepage":"https://github.com/researchgate/spire#readme","_id":"spire@2.1.2","_nodeVersion":"12.16.3","_npmVersion":"lerna/3.20.2/node@v12.16.3+x64 (linux)","dist":{"integrity":"sha512-Z3kkevszja4/JDn/FV/8q3tOrHXvEvfvxLM9lp4D0djHJ7mDTvQCqi45Dau4adylTg+gnA33U1dMaPLHs/N3WQ==","shasum":"d63697b4cac0eeec4bc351c84ed03cebb8c07675","tarball":"https://registry.npmjs.org/spire/-/spire-2.1.2.tgz","fileCount":20,"unpackedSize":43159,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJesUoxCRA9TVsSAnZWagAAPyUP/1qpZbCV0uDJXLjRE0Dx\nL8V+R//WdjJO4ilXU5yHv3TNknJmHBFFo77Wgf3Vyh1bP+TIFZ1NpejyVDxf\n8NSSGDu+bJ3aQwW1uqVPnt+4gRxcbMlL7p5X2c7jhPVdRP9OjvwWJCjfAqLd\njwHWMaTn9Ew9IJ5rJCbxZNGWgBvHAQ1LilAUy5vI1OTl/OiFQOn1tb7dC/CE\nvW1gdi5M4WNGWP3LSYq2M2ArkYFupW596uIdM6zgd2b9ksB5cvM5dA9djhTF\nqfL98S6UVScEHG1w5vjMALws4EnoNv2Ot/qM4DbF7abUnFqP+2BpB2NLotw+\nxQk2s4stVyiSwohZFjactJ0C2UltIVqpXM0YBvaCahTNzCEZKEvyXPLPV9r+\nX+CXD3T3afxU3IYah0f1mTvasihmk67V5V3gvwYXGNq5thHeN6PKrZ3wzPE4\nynpRnRGofz3fCWb1PG9zJl+0EYmRxBV9vhU0sv61qJr+JW/VIC29EflMn9ve\nms41vtOmbPEG7eZqPrlb22XRdva5fLwve6gsec2vPcGUNntIkQWKln71ucdY\ngBpGvFNb8i6Wcz+5L6FhqIYY0RRz4feGtqecnP5WZuFt3m4DRhpYMU97WqM3\nnTxDhEBQ+pntME2FQkmPXna2BY97KgiTIqkoLDdHd/Vf9Zjl5QE/nBPdNCgZ\nFQPm\r\n=7lph\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQD2Mzt3gwKiN+m2e60/16XYNbGbmI51zHd5XTV9JF8Z2wIhAOdH7D0cd8F8wO0hFm1PnpD5zu3nMPiJ2gtpuLAdl7v/"}]},"maintainers":[{"email":"daniel@tschinder.de","name":"danez"},{"email":"justnvdm@gmail.com","name":"justinvdm"},{"email":"sebastian.jerie@researchgate.net","name":"researchgate-bot"},{"email":"sergey@bekrin.me","name":"sbekrin"},{"email":"info@weaintplastic.com","name":"weaintplastic"}],"_npmUser":{"name":"researchgate-bot","email":"stefan.hoth@researchgate.net"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/spire_2.1.2_1588677169124_0.6078049535140535"},"_hasShrinkwrap":false},"2.1.4":{"name":"spire","version":"2.1.4","description":"Extensible CLI toolkit managment tool","main":"index.js","repository":{"type":"git","url":"git+https://github.com/researchgate/spire.git"},"author":{"name":"Sergey Bekrin","email":"sergey@bekrin.me","url":"https://bekrin.me"},"license":"MIT","bin":{"spire":"bin/spire.js"},"engines":{"node":">=10.18.0"},"scripts":{"postinstall":"./bin/spire.js hook postinstall","preuninstall":"./bin/spire.js hook preuninstall"},"dependencies":{"cosmiconfig":"^6.0.0","detect-indent":"^6.0.0","fs-extra":"^9.0.0","import-from":"^3.0.0","invariant":"^2.2.4","pretty-format":"^26.0.0","signale":"^1.4.0","spire-config-default":"^2.1.2","yargs":"^15.0.0"},"devDependencies":{"spire-test-utils":"^2.0.1"},"prettier":"spire-plugin-prettier/config","gitHead":"a08d97fdac2d1b31dbb4c359b9dbb051ec03a752","bugs":{"url":"https://github.com/researchgate/spire/issues"},"homepage":"https://github.com/researchgate/spire#readme","_id":"spire@2.1.4","_nodeVersion":"12.16.3","_npmVersion":"lerna/3.20.2/node@v12.16.3+x64 (linux)","dist":{"integrity":"sha512-46hZjNLS7+oueHekxKKcxL+2ZnrV/Pp9EzZNMhW0JtImNN8kI18/o218Gl+P1RT5PCpkusdjW+uZCUqO16wkow==","shasum":"6b5b1334028637b18164620f3bef4639fbf1c65f","tarball":"https://registry.npmjs.org/spire/-/spire-2.1.4.tgz","fileCount":20,"unpackedSize":43595,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJesXq6CRA9TVsSAnZWagAAF1IP/RcPMVcjrT2Pv3g7FGGZ\neBYLh9ZGy6aBGwDxVw2MfmqFdFBf1kCzOEVI2jY1Z5ETjVCqyIQaP8oGDT84\nj83U29BH5ITyoIE3WdkOlfu1lfIoh0cvBZbwr7Q2Xf0884o+/1eR11noIMFB\nSfiPTeiCLq5wmxUgNwt4vZQqHmOeMB4nluPY4Si3yIzmAAUjeh+g4f4OB560\nYEO1/YKCzyFka7WMgpo3XhValk9jVo0MASmp8WCqjXc/z79DnFkykst3H9ip\nRkPeoWNs7BdYFk4pSoXjBPPoR1ttTEMuyIWl8tkhbaddNIRWF+UM9WC33T2z\nzoDYm5zMMVysJjDvodV3lQ/41xALRxvsVDMRhDJ5P+P4O7+SdAm46z8AdPiR\nws0KknZufFJyn9/AOXiXIT7FkXrTpWjQsAd7ZSy9jP616npgGUw4qhuGAFq3\nXJHVT6NMjE5RZ5+DIUM058Yk1TyKP8KLKVk1wEfy3wdvmp/pst/5ONKufe8p\nxUfWEK7d6D98D6sa0Vt9dTgM9R58ByNuf4VX7Z0zHFoYAUCOsgyUAp2pkX81\nPQb/9hGN4S4yODyztl9dmF3fWRIgh9Ahu2ZXaz5vhmFOhiGOJpYmd1A7kkwI\nGHN9ry8VHbCijDYc1J4QuK2YcCS6uqvGWD42UyghiDdRNvAgpeBL4VdcdC5c\nsv79\r\n=pD4L\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDUsHg+bxiRYLpTbYmS/Ge7PNcdXiv/J6Ad7oNbd03h8AIhAOC1QehyTAMhBAAqCwjHuxQTPjsggmqVJKZLarRm6bRe"}]},"maintainers":[{"email":"daniel@tschinder.de","name":"danez"},{"email":"justnvdm@gmail.com","name":"justinvdm"},{"email":"sebastian.jerie@researchgate.net","name":"researchgate-bot"},{"email":"sergey@bekrin.me","name":"sbekrin"},{"email":"info@weaintplastic.com","name":"weaintplastic"}],"_npmUser":{"name":"researchgate-bot","email":"stefan.hoth@researchgate.net"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/spire_2.1.4_1588689594484_0.987926193965049"},"_hasShrinkwrap":false},"2.2.0":{"name":"spire","version":"2.2.0","description":"Extensible CLI toolkit managment tool","main":"index.js","repository":{"type":"git","url":"git+https://github.com/researchgate/spire.git"},"author":{"name":"Sergey Bekrin","email":"sergey@bekrin.me","url":"https://bekrin.me"},"license":"MIT","bin":{"spire":"bin/spire.js"},"engines":{"node":">=10.18.0"},"scripts":{"postinstall":"./bin/spire.js hook postinstall","preuninstall":"./bin/spire.js hook preuninstall"},"dependencies":{"cosmiconfig":"^6.0.0","detect-indent":"^6.0.0","fs-extra":"^9.0.0","import-from":"^3.0.0","invariant":"^2.2.4","pretty-format":"^26.0.0","signale":"^1.4.0","spire-config-default":"^2.2.0","yargs":"^15.0.0"},"devDependencies":{"spire-test-utils":"^2.0.1"},"prettier":"spire-plugin-prettier/config","gitHead":"e7803ae0109373df4888ff1e85c710ce9a01595f","bugs":{"url":"https://github.com/researchgate/spire/issues"},"homepage":"https://github.com/researchgate/spire#readme","_id":"spire@2.2.0","_nodeVersion":"12.18.0","_npmVersion":"lerna/3.22.1/node@v12.18.0+x64 (linux)","dist":{"integrity":"sha512-KQ8YbTS76Vt89KtyEqxwn9z2P343nWfjM4XHPKe12Htidu5BYowmYqxQl8AUqkeZHgDBlhgGd2Fyw2aQ59/uGA==","shasum":"06b76d846d1fc7076b4f16359ec708cd8328ec64","tarball":"https://registry.npmjs.org/spire/-/spire-2.2.0.tgz","fileCount":20,"unpackedSize":43733,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJe4hLLCRA9TVsSAnZWagAASCMP/1BcQs19dsvL+gYTGruy\nIGuBTX6+Guu8dO1nt2MZV/O4LMfDb9sRMYDITZkP8h32za2vxr8+NEAZQrtx\no5SUSijjFBcmy9rOqpaaYcbNQyDM+G9P4UNB9f+s50i3fE8sMtpNaN2GiHbl\nIJvfEckP/OvQ+FA+IE1IVv2E+A3SONpCTd9Ss/BloXTWJW55KMfZfDbixqp+\nBBAo24hJoijiLF+E6bOJStCOPuPI5oyQff3ZiHRH/mou2T/oUxppp32xEE6v\nJRlJ6yA16t4iTN1lCgoP5PU0pC1VtTB9k/h7nnyxp+nKeIVL2N/FY/VddoUN\nSYba0Rxu8d9JknyhR4VjtobLxR5vJx0rjsEKCMGFjh4hvK8NImo1koONbQiG\npy4xupQyqXg/VdMhUkszC1bQNCD1XLuYK6uKKXWQBVprjEt39LVt2mw6Hb2f\nMQ3tgJxn9DzlykWIHyQo+H21YPjK9fZwrBLpo6sLDiPPn/QHLgozsH035R9Y\n2TpglGgnqBPGIgXIpAl41sZ7bivSXIs5/4AzGhmciCl3GLuyExe4tdYlxkdT\nwRrRzCRiZDOxmpWelM3sWzuChB3I5PjBKbrl/R1Hb9duCoPn/zC4BN9JW38Z\nLIQ0ROjjU0t3RiSxsRubgsWYkr0f2kUaUuzZ9vnUcfBoavXm7Vs7vd3VXuYK\nvBQF\r\n=R8dN\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDKnuH+78udOto+hcULht4fx+DVXwTLhXOFqNYDwOd/WAIgDMpuaVtMIlmTROXgKo6QwusUIuEXPU0shMp03OFxeR0="}]},"maintainers":[{"email":"daniel@tschinder.de","name":"danez"},{"email":"justnvdm@gmail.com","name":"justinvdm"},{"email":"sebastian.jerie@researchgate.net","name":"researchgate-bot"},{"email":"sergey@bekrin.me","name":"sbekrin"},{"email":"info@weaintplastic.com","name":"weaintplastic"}],"_npmUser":{"name":"researchgate-bot","email":"stefan.hoth@researchgate.net"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/spire_2.2.0_1591874251302_0.6400080643080013"},"_hasShrinkwrap":false},"2.2.1":{"name":"spire","version":"2.2.1","description":"Extensible CLI toolkit managment tool","main":"index.js","repository":{"type":"git","url":"git+https://github.com/researchgate/spire.git"},"author":{"name":"Sergey Bekrin","email":"sergey@bekrin.me","url":"https://bekrin.me"},"license":"MIT","bin":{"spire":"bin/spire.js"},"engines":{"node":">=10.18.0"},"scripts":{"postinstall":"./bin/spire.js hook postinstall","preuninstall":"./bin/spire.js hook preuninstall"},"dependencies":{"cosmiconfig":"^6.0.0","detect-indent":"^6.0.0","fs-extra":"^9.0.0","import-from":"^3.0.0","invariant":"^2.2.4","pretty-format":"^26.0.0","signale":"^1.4.0","spire-config-default":"^2.2.1","yargs":"^15.0.0"},"devDependencies":{"spire-test-utils":"^2.0.1"},"prettier":"spire-plugin-prettier/config","gitHead":"9ddfc8b3b28ea9fe9b35d075e8c05d5a502cb65b","bugs":{"url":"https://github.com/researchgate/spire/issues"},"homepage":"https://github.com/researchgate/spire#readme","_id":"spire@2.2.1","_nodeVersion":"12.18.0","_npmVersion":"lerna/3.22.1/node@v12.18.0+x64 (linux)","dist":{"integrity":"sha512-v1r7s5G24EmrJ62Keb2jOy+/L2M6q3vLhc/MmqLfAYEyjbbA9xuydQ8WB+UNkTATkyy1rj37nMWm6bhl4Ba/Tw==","shasum":"515e7650f3014dc50c28682ca83aa86b48fe27b6","tarball":"https://registry.npmjs.org/spire/-/spire-2.2.1.tgz","fileCount":20,"unpackedSize":43872,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJe6QERCRA9TVsSAnZWagAAQZwQAJJsrOl4lpx+CE4BNE2s\nRmJaA7wmT0fdpIe7raRCgKnwEsJ1jckxLRjq1WzUsgvQu7lYDE/IpwP6uPFM\n9nw+pKwHAATejWt5UGF2EZ9z84QrdfvGtKbu5d3gXVL0PYVeMo3YOcX5qvcZ\nxTQMFLU1kxOrbl6VXwMcMVjzdgeUnSs10KOOPQ7YivSHKrOPisEaEZj5u2qi\nkuQ8c7ZbgNKcAen+jidwKKZLTXMmPm8sKHX2RLM3ayE+JKWZdRPmUIS1rbIE\nS1VrpxiBhiFN30tIudgrNLFq1NvZpk0uSwXdhQsp/t1uQLdXyb2fV+S2GuML\n7VqO1k7e462we4uxHhdBqmEfWYLa/PDlDTFKoUO8Uy7uixKmER9U364xR4V6\np424qFcOwSacrG2kvAZBkcvFhcNu+PPL347sJLHYja1PfpSwEE1JvdBGbbFl\nvKso2aJ7YQCwDtwXjoG4ZRV1oNbFiGzuAURQp4VOeQpcjg6lRf8bSTviUM2i\nFdmZTAUsOmIerwMCFQpzaXStIGKRLdw1Ukx86YDzWW/bq38jQio4ck8x9jMO\niFEwW82UxnwMFME5Sru+inmvm5ORAE8hH70rzE1sNJnhynWRGKsZe9D1L0Vi\nQAuxXTr6hGYzcYTvLAGSQqKMUykTxcgSz5aYD+06lSbEdF11XhSN6sxHOp1J\nG8lR\r\n=0fVz\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIEKXZ2yXrq185YqnCLXjgTD6lbTOyXMwkh5w7Q1M2aovAiEA2dt7YWvNV3yQ8oS8kuuxNBjoXNPhXVb9h/GcU4O0bk0="}]},"maintainers":[{"email":"daniel@tschinder.de","name":"danez"},{"email":"justnvdm@gmail.com","name":"justinvdm"},{"email":"sebastian.jerie@researchgate.net","name":"researchgate-bot"},{"email":"sergey@bekrin.me","name":"sbekrin"},{"email":"info@weaintplastic.com","name":"weaintplastic"}],"_npmUser":{"name":"researchgate-bot","email":"stefan.hoth@researchgate.net"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/spire_2.2.1_1592328464800_0.03408855554903223"},"_hasShrinkwrap":false},"3.0.0":{"name":"spire","version":"3.0.0","description":"Extensible CLI toolkit managment tool","main":"index.js","repository":{"type":"git","url":"git+https://github.com/researchgate/spire.git"},"author":{"name":"Sergey Bekrin","email":"sergey@bekrin.me","url":"https://bekrin.me"},"license":"MIT","bin":{"spire":"bin/spire.js"},"engines":{"node":">=10.18.0"},"scripts":{"postinstall":"./bin/spire.js hook postinstall","preuninstall":"./bin/spire.js hook preuninstall"},"dependencies":{"cosmiconfig":"^6.0.0","detect-indent":"^6.0.0","fs-extra":"^9.0.0","git-remote-origin-url":"^3.1.0","import-from":"^3.0.0","invariant":"^2.2.4","pretty-format":"^26.0.0","signale":"^1.4.0","spire-config-default":"^3.0.0","yargs":"^15.0.0"},"devDependencies":{"spire-test-utils":"^3.0.0"},"prettier":"spire-plugin-prettier/config","gitHead":"51789d033098ef8cb01c7cab606854abae9c8706","bugs":{"url":"https://github.com/researchgate/spire/issues"},"homepage":"https://github.com/researchgate/spire#readme","_id":"spire@3.0.0","_nodeVersion":"12.18.3","_npmVersion":"lerna/3.22.1/node@v12.18.3+x64 (linux)","dist":{"integrity":"sha512-9AkIu8ilEqLgKR2Tiq9SuRi5EmG05A1my6kzNmxEvxnyJ4Il3mmGvpa6swRkudZO1YU3tV0oMl25hlaYV0XhhA==","shasum":"fd3593aa928cb362c5691dc3008693a58dabe124","tarball":"https://registry.npmjs.org/spire/-/spire-3.0.0.tgz","fileCount":22,"unpackedSize":44914,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfH9ryCRA9TVsSAnZWagAA74QP/14DaOQWFCpE+k1sJRg0\nwf9DZdCwmkZuyobr4tfsTlzar0CF/Osf90CvyKTfzVPrmIWxUVLcJ24+VfM5\ncJnNdh9fN0hQ+xqm+DbbVQCUWGSjURb4nYlBJn3PLRBViBrlElJYyoujKwLn\n1234FAUoBvHPn0qCbP6v6FX7k8S3VgsIk/KNdl/Vrdzi/FWT2ShB8xGnkq0u\ntLnHLMsQW9JQmL0CAIU+yqNvcg056ZouTt71dv0LQ81s8w9Olf3TJrQmX1OW\nP9iwU2hx8NOymE/eDT58lGdh7/ZNg9vDTJgQ/sjk4f24BtEIKd/HOvmBGMXp\no4q1WW2ZW7FGiuHIa2gAGQQTMjh8epJBLrBm3mSjbRYePISoxqrhrwOcmLLr\nk4haTBjKDF4WV3AyCw9fqddfrAS9pjIFmaJ6XVpBl82/0l6KmDfSF/mlHZ2A\ns+yQ9nGp8bqadv3K6f/eXdV7hkxPBGZzadQqDb8OXmAiFIKG/BJKndRlztFV\nRPXNRBtWRCxccjGONjeB/Y0arspE4R/tzuFQ2GujkIUngddJyew3Fs6i1Vj3\nvacv181MEKDfEiworuXy56KcmOEY2c6VTBGAZKUoqNYMYE6z2QXCn9/4BJhH\nsnJjnCN1ASz6fX9t9HLDekkC5P0pylfhvr7+6A6yjZlOTb0F1fH+qbgmvlhQ\nkGXX\r\n=4ZEk\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIEW/kcw00gVLpGwuCBnGowzYMEyGwd6faEaIsm8+lFjqAiAp9MlN/hNNuW2p+bCqumfbS7zDw4rCVDgu5DasJPuuQA=="}]},"maintainers":[{"email":"daniel@tschinder.de","name":"danez"},{"email":"justnvdm@gmail.com","name":"justinvdm"},{"email":"sebastian.jerie@researchgate.net","name":"researchgate-bot"},{"email":"sergey@bekrin.me","name":"sbekrin"},{"email":"info@weaintplastic.com","name":"weaintplastic"}],"_npmUser":{"name":"researchgate-bot","email":"stefan.hoth@researchgate.net"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/spire_3.0.0_1595923185560_0.806338213016311"},"_hasShrinkwrap":false},"3.0.1":{"name":"spire","version":"3.0.1","description":"Extensible CLI toolkit managment tool","main":"index.js","repository":{"type":"git","url":"git+https://github.com/researchgate/spire.git"},"author":{"name":"Sergey Bekrin","email":"sergey@bekrin.me","url":"https://bekrin.me"},"license":"MIT","bin":{"spire":"bin/spire.js"},"engines":{"node":">=10.18.0"},"scripts":{"postinstall":"./bin/spire.js hook postinstall","preuninstall":"./bin/spire.js hook preuninstall"},"dependencies":{"cosmiconfig":"^7.0.0","detect-indent":"^6.0.0","fs-extra":"^9.0.0","git-remote-origin-url":"^3.1.0","import-from":"^3.0.0","invariant":"^2.2.4","pretty-format":"^26.0.0","signale":"^1.4.0","spire-config-default":"^3.0.0","yargs":"^15.0.0"},"devDependencies":{"spire-test-utils":"^3.0.0"},"prettier":"spire-plugin-prettier/config","gitHead":"165faa2a81ede04950d09a38a7714712dd856150","bugs":{"url":"https://github.com/researchgate/spire/issues"},"homepage":"https://github.com/researchgate/spire#readme","_id":"spire@3.0.1","_nodeVersion":"12.18.3","_npmVersion":"lerna/3.22.1/node@v12.18.3+x64 (linux)","dist":{"integrity":"sha512-NgXb2VigQKIq4g7LDuN0RQ8CdxXCjNdE6RVCosMYBgUWkSkQpTsPmUWVucLt5zuwyFqg87Tb69K8epvRhU8aaA==","shasum":"46adb2877df69d783874683d48588a453aa3c63f","tarball":"https://registry.npmjs.org/spire/-/spire-3.0.1.tgz","fileCount":22,"unpackedSize":45170,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfLRiVCRA9TVsSAnZWagAA6CAP/0keG8v0UXNOYZGsc9/f\nY8QOjK6kwgBfXHzHx2bzIaPAZbSM/TuAb/bvnZXlDKL8avg9fF9V9Wf8Ojri\nh0C4bjE3iyz21ckkRAd+c3UyOktqpBQLNA7YZY9W9fBybBDWH8dCkxfznkg2\nGnEjP4Ih3GM2YJxfxy027gc616MoQCtVL7XwBjq/kyxoNGIiF1CweqC8cqd9\nk3B00fegea7T/uGnKfbcLGCB/VSYJAx1CE9gqLBZ7Tg4Apu7oaiY8zBjoFsU\n3htKUK0UZoe34cqVIVxnip6/AtFjzfro+avgXPvqu27yDkpz6HgdDEY/fXa/\nj7Zzp66EW94Qln8wYvM8n6h+cOWtpAqVcgqM86ur3PEM+tNTg8xxitM0DZUC\nDgk5pBL2fqxuOer/mK6sV7ve4LmPinPh22Kzf0DbZ8aLw1mldVske+HiBXf6\nuxclN8cpLWgu87k7qJHZifuyc85RefvQP4OTWQ7q1aRnj0IS0lYbYQXfnsTI\nT8AE6Zf1TYKszzjEdTT6FmUrc/gskueWBY8cGZRnJCVYu/PcLV/L6M34VVoK\nfClv86FwQhbonOGATN2MDJqfMSxfawokX2ryyTt1WWbQNfrT0EqtEbYEyXr2\nJynw7HEkTBlrC52r7hkRl6jq4uFGHfsvIMDxaeUUuHNh1xFQOzwzIYzg7eNc\nTSGB\r\n=SI3L\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQD/hu+dTyJ0u6mbl/6XX8VsHQDFV+lFKtcRPN3lfiDu6QIhAKMKWzXmhpKfBjqZ2kgOIxEJ9mXecFfZnxJxgyDRA0MU"}]},"maintainers":[{"email":"daniel@tschinder.de","name":"danez"},{"email":"justnvdm@gmail.com","name":"justinvdm"},{"email":"sebastian.jerie@researchgate.net","name":"researchgate-bot"},{"email":"sergey@bekrin.me","name":"sbekrin"},{"email":"info@weaintplastic.com","name":"weaintplastic"}],"_npmUser":{"name":"researchgate-bot","email":"stefan.hoth@researchgate.net"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/spire_3.0.1_1596790932556_0.6712906216798948"},"_hasShrinkwrap":false},"3.0.2":{"name":"spire","version":"3.0.2","description":"Extensible CLI toolkit managment tool","main":"index.js","repository":{"type":"git","url":"git+https://github.com/researchgate/spire.git"},"author":{"name":"Sergey Bekrin","email":"sergey@bekrin.me","url":"https://bekrin.me"},"license":"MIT","bin":{"spire":"bin/spire.js"},"engines":{"node":">=10.18.0"},"scripts":{"postinstall":"./bin/spire.js hook postinstall","preuninstall":"./bin/spire.js hook preuninstall"},"dependencies":{"cosmiconfig":"^7.0.0","detect-indent":"^6.0.0","fs-extra":"^9.0.0","git-remote-origin-url":"^3.1.0","import-from":"^3.0.0","invariant":"^2.2.4","pretty-format":"^26.0.0","signale":"^1.4.0","spire-config-default":"^3.0.2","yargs":"^15.0.0"},"devDependencies":{"spire-test-utils":"^3.0.0"},"prettier":"spire-plugin-prettier/config","gitHead":"09463a29101aa4f8f2a8fbfaf184b7e87d7e8c43","bugs":{"url":"https://github.com/researchgate/spire/issues"},"homepage":"https://github.com/researchgate/spire#readme","_id":"spire@3.0.2","_nodeVersion":"12.18.3","_npmVersion":"lerna/3.22.1/node@v12.18.3+x64 (linux)","dist":{"integrity":"sha512-oBGDtYanNaDfcYyaabrI+lYe9mbWuphLmjtUOgct3wTCOx7JkaFMZ2+XscPZ421vMyP6g0ZwWbvAdlxjmzlhUw==","shasum":"92cce2fd4a9451763d46401f63dd78760fb32785","tarball":"https://registry.npmjs.org/spire/-/spire-3.0.2.tgz","fileCount":22,"unpackedSize":45309,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfLSKwCRA9TVsSAnZWagAAD8sP/1HheNr2fDaKgqbSXQ7w\n7uIdjBUpBEqkYxwcJdUAKfkFuygjqXgGHBTEuP9gXMM8wUrd7Qj25Q9GWXoP\n5sHAGFd03smY0Q7NfendRT1tWgNp65VjTG4zKssu6+obmUZr5ESGGJyP8Ej2\nVYwMYqAQ0+8ZPRBIe3lEtZg6kHeWZScjG4hISli08NgSvXN6tuiK8mlB0ufb\nlWnBOyXXMIvc8MbwhXgQcfmlzAw8XouWIJd6VTIDNoeIaYCcu4L2A0tWxFfO\nPZGGzIRfmX6B1rBjuKpaNQ4+T4V55LPpbcLSDVJhs9EfiwtwrJmHEjwZES5q\nl2dkp+kMRDMDMG3oukinAJpUj20qZvoP6thFFml8uGd7zRgNGV977Pb0/4GT\nAU8NTY6GbfXrGyDTwJJ8ww8nlPfn7QsvaxPtzzh8PfFREY7iaMTz74H87M6E\nfIrWIm7Ha6tuiwdZ/sTGMJG6Lkj1ufvA7ix+HzGXzs2fSF7IJW6C+NBBcLvM\nLRnhpek7FewpIYc1IWwvgQ77M5G0Etjo7T6MTP/Rc0SrmhuSCqEAEW9dbcii\nfJkPtWGt/U80JDQ3krxAQDMQ9XcUxcPhx+h1Kn1ndlEEbYrwlqYLCDTK9ZkL\nosgNkd4QrFlzic4FoGjH61mqNsXtmbWW4ypd6Dcofdse0KgTZSFHjeAt3tA/\n80dv\r\n=BVfe\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIExGR59RdQg4vWTxakX3B4S1PfN+tVP6vNozXXJUHtxrAiEA0AUWINhG5cbwbxxzsyuk1aO25swlJZdzDW7CnZMCz8U="}]},"maintainers":[{"email":"daniel@tschinder.de","name":"danez"},{"email":"justnvdm@gmail.com","name":"justinvdm"},{"email":"sebastian.jerie@researchgate.net","name":"researchgate-bot"},{"email":"sergey@bekrin.me","name":"sbekrin"},{"email":"info@weaintplastic.com","name":"weaintplastic"}],"_npmUser":{"name":"researchgate-bot","email":"stefan.hoth@researchgate.net"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/spire_3.0.2_1596793519537_0.5698909395021319"},"_hasShrinkwrap":false},"3.1.0":{"name":"spire","version":"3.1.0","description":"Extensible CLI toolkit managment tool","main":"index.js","repository":{"type":"git","url":"git+https://github.com/researchgate/spire.git"},"author":{"name":"Sergey Bekrin","email":"sergey@bekrin.me","url":"https://bekrin.me"},"license":"MIT","bin":{"spire":"bin/spire.js"},"engines":{"node":">=10.18.0"},"scripts":{"postinstall":"./bin/spire.js hook postinstall","preuninstall":"./bin/spire.js hook preuninstall"},"dependencies":{"cosmiconfig":"^7.0.0","detect-indent":"^6.0.0","fs-extra":"^9.0.0","git-remote-origin-url":"^3.1.0","import-from":"^3.0.0","invariant":"^2.2.4","pretty-format":"^26.0.0","signale":"^1.4.0","spire-config-default":"^3.1.0","yargs":"^15.0.0"},"devDependencies":{"spire-test-utils":"^3.0.0"},"gitHead":"495acd596b3db05a2d8131acdb3c2bd697347a92","bugs":{"url":"https://github.com/researchgate/spire/issues"},"homepage":"https://github.com/researchgate/spire#readme","_id":"spire@3.1.0","_nodeVersion":"12.18.3","_npmVersion":"lerna/3.22.1/node@v12.18.3+x64 (linux)","dist":{"integrity":"sha512-ohljEJovo+v5Qy1F4YTdTRuW+WssAwFNPtujhYase0ECOMc3w5Q/gzf+qIKVNvNyebkZNTTZIRQF2saKl8+3Nw==","shasum":"4fd45f3cee651c88baf030c2abea33accc8795cb","tarball":"https://registry.npmjs.org/spire/-/spire-3.1.0.tgz","fileCount":22,"unpackedSize":45382,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfOkxSCRA9TVsSAnZWagAAc4kP/1O2Kxgp8EmlVxYNhLsd\nituJzg/Hm++xa2ENpVfFD+XvbNdKUy1X4KQcQFf7/uxDHSuGFtMiCdnIuxmn\n8aVMsCtHo763cTvRmYzjfUWhp+syWWWsM0acEZFghkMOzUlw/XDjsANw+Io9\nsIgpHcIaTxAwtvwNewXG/2AacTNkOnTKJVGhGfTcvFa2t5Ex37eoyzX401eB\nEUfi4dWC2PSbpG7Y4lhRa4KO8Br50fBYEhUH18J+BNxqOJxJGUICt6YLFI5+\nAA6XpOmaBphPq+4V/0p6qYc+dcFK9XIdgcxqnCkc9kENsKjuTYw/1Sr5TqAb\nGWxkLh3Y4KKojyt6cLZB0PHDRHwO3YpZ07CfgsDoovj8874eBnIvXl8rnVR+\nb3z2R22a/mTIIv2N/2DZEGCJlp2jT9zxcabrFierqhZK1jHOvvDVxhbyqy+w\nFob8ztpqEYx48/Dg5JR2Pt74G0P3YtHE4Km3IW8MwHjHcKF8tajmztzU3Uil\nQL5Su/nxjhzhmGOKbe8epOg8F919/TMhMd+aBkahyXrx3vp5lFlClVIJmdaV\n6O+YgEYIapDs6J/gryIVd0de/EI4FrO/PTxH+gjhQJgsnHeYYbTy33WCHgUO\nRk0yKNFZfmI1FknyZyHI9Vt15slf/y4BTX6yjOgxl/hfZZv2ag8X3O7LapoZ\nAS2H\r\n=Yni2\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDkkXR7VDpnzU5GGletIuf5SRJnh3U/PjkDsOeyBPsH3AIhAIlLo6SNLA9GR4Tx6jfHiqFdSMNwRlCTazQRb6Afq30z"}]},"maintainers":[{"email":"daniel@tschinder.de","name":"danez"},{"email":"justnvdm@gmail.com","name":"justinvdm"},{"email":"sebastian.jerie@researchgate.net","name":"researchgate-bot"},{"email":"sergey@bekrin.me","name":"sbekrin"},{"email":"info@weaintplastic.com","name":"weaintplastic"}],"_npmUser":{"name":"researchgate-bot","email":"stefan.hoth@researchgate.net"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/spire_3.1.0_1597656145965_0.11303175886213368"},"_hasShrinkwrap":false},"3.1.2":{"name":"spire","version":"3.1.2","description":"Extensible CLI toolkit managment tool","main":"index.js","repository":{"type":"git","url":"git+https://github.com/researchgate/spire.git"},"author":{"name":"Sergey Bekrin","email":"sergey@bekrin.me","url":"https://bekrin.me"},"license":"MIT","bin":{"spire":"bin/spire.js"},"engines":{"node":">=10.18.0"},"scripts":{"postinstall":"./bin/spire.js hook postinstall","preuninstall":"./bin/spire.js hook preuninstall"},"dependencies":{"cosmiconfig":"^7.0.0","detect-indent":"^6.0.0","fs-extra":"^9.0.0","git-remote-origin-url":"^3.1.0","import-from":"^3.0.0","invariant":"^2.2.4","pretty-format":"^26.0.0","signale":"^1.4.0","spire-config-default":"^3.1.0","yargs":"^16.0.0"},"devDependencies":{"spire-test-utils":"^3.0.0"},"gitHead":"25365888249a645d991e0d4467d6bc1001415c62","bugs":{"url":"https://github.com/researchgate/spire/issues"},"homepage":"https://github.com/researchgate/spire#readme","_id":"spire@3.1.2","_nodeVersion":"12.18.3","_npmVersion":"lerna/3.22.1/node@v12.18.3+x64 (linux)","dist":{"integrity":"sha512-XiR2R6vNL+WzxhqLd3B0Au6GHIb0MlZX4FZsTvUAkdW3dhuXR/f4Z/eK3KmKnOnwVFBNEwqPuY12yhAiPliNNA==","shasum":"93e6489ee52a6d7a1706cb355f06b24bcf80933c","tarball":"https://registry.npmjs.org/spire/-/spire-3.1.2.tgz","fileCount":22,"unpackedSize":45633,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfWK9PCRA9TVsSAnZWagAAqEUP/RBSgPW5s+DkZSfRkO1Q\nUOIwkBoVuB7HF2RLjYtw6B/z2CScjjA4k/mEE8765Yk3/yxIn+W5RzM9URC5\nLJrQ86RVeZFSmU4nqz+PCdcWlqwSa0+UHJrZm8XQ/Z43O4y0HWXQhbW+FrIj\nZY4h/H60AaRcN5dU/D6RMYverwYdkEsKSWjvBso4zk41BqiFHvnmjPoVpaGL\nAks1dnocHoY02MkdVzHri4OLjEo2evilUI9ZJcZ293L9WyUHqbbyGXAHDW/K\n2Mpzs0qLCsPVdkiBWGtPJrKGeYsUa8XTz7uf8ZvsaIpkOxGPkccQ0zlCdG1y\nvFqMdA7yKMUD9v5Ft9w97edHQKc3zfUVlDfIKsFBLce3Js5BJj46gMWnNaFW\naJRgUOVF9u+l8MUlwpBfqI1609QheNCNJCulN1HFFCb6zb1qCCgasKjaa6kr\nGxBwUZ83UJ7jQ6nhe8fpkINQeAfKvCLvxYr5R4ZfWHPbeB3Jpqg04Ey5Q7Lv\npzh6qjTp56Rrk5ApbOjnOs7vLj3/zqdW1dzPvELUx6tElVl1pLu8xmqLI6xD\nVrwMejilkLeIkQ6wLES+exVkoBpUX8KJCDrM4AszZNFv+2KrW9ivO1+1nCUY\n+USa2Y9fxbx8x7lk7P4Y3m8w7WgU3QDaeqzM/FBReDfF0QCSaJBGTKY3CpP9\npvlZ\r\n=ZWel\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGWgiS6cRR6VtKIoCOOEF+XFmSaanTMxcm2z8WJZPWeuAiEAnlLf2DacuuRqpJgn/rBDsM9QkClvkmyD5ev/HZdJgvU="}]},"maintainers":[{"name":"justinvdm","email":"justnvdm@gmail.com"},{"name":"weaintplastic","email":"info@weaintplastic.com"},{"name":"researchgate-bot","email":"stefan.hoth@researchgate.net"},{"name":"sbekrin","email":"sergey@bekrin.me"},{"name":"danez","email":"daniel@tschinder.de"}],"_npmUser":{"name":"researchgate-bot","email":"stefan.hoth@researchgate.net"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/spire_3.1.2_1599647566930_0.5710823155177351"},"_hasShrinkwrap":false},"3.2.1":{"name":"spire","version":"3.2.1","description":"Extensible CLI toolkit managment tool","main":"index.js","repository":{"type":"git","url":"git+https://github.com/researchgate/spire.git"},"author":{"name":"Sergey Bekrin","email":"sergey@bekrin.me","url":"https://bekrin.me"},"license":"MIT","bin":{"spire":"bin/spire.js"},"engines":{"node":">=10.18.0"},"scripts":{"postinstall":"./bin/spire.js hook postinstall","preuninstall":"./bin/spire.js hook preuninstall"},"dependencies":{"cosmiconfig":"^7.0.0","detect-indent":"^6.0.0","fs-extra":"^9.0.0","git-remote-origin-url":"^3.1.0","import-from":"^3.0.0","invariant":"^2.2.4","pretty-format":"^26.0.0","signale":"^1.4.0","spire-config-default":"^3.2.1","yargs":"^16.0.0"},"devDependencies":{"spire-test-utils":"^3.0.0"},"gitHead":"08d9358c37879a82ad78ca423a90dbf07a1d5e8c","bugs":{"url":"https://github.com/researchgate/spire/issues"},"homepage":"https://github.com/researchgate/spire#readme","_id":"spire@3.2.1","_nodeVersion":"14.15.0","_npmVersion":"lerna/3.22.1/node@v14.15.0+x64 (linux)","dist":{"integrity":"sha512-j2R9l75jt3OlCWWTMkkWkmBnKFEYGQe5sqSM2TtV+UihjiCe9yxttvA4Yf+7JKYEGoBFr5KcrGlUtTgdHp2Kkw==","shasum":"d6e53ef1c7e957c67b9dd517479e6b1b2bcc309c","tarball":"https://registry.npmjs.org/spire/-/spire-3.2.1.tgz","fileCount":22,"unpackedSize":45772,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfrVOYCRA9TVsSAnZWagAArk8P/0RvudUUTYynJty2mxfd\nUb3MWKNzHFSLxxGpRVzsazVX1ZnZeS1/QVAIvrCcrkxbcs821vjv5y9LW2IG\nSR4rG+Qt3qxew1jHLSKxhceBtiGzu0k6l89ONIvYMXQHYMfYNlKGiIxi37Tb\nkm3tg047gOEapWZ5BVTKk6eKheVvLo88jrzgrzMDHfR1JKIdJhenaKvVBEpX\nnbx0gye+Fy5AlnH44sr0Yh8yLuXKYganVW088ze21eqFhiOdwUzEAuzb6K8+\nK0gnST8tq0ZfT1lhpyP/ju6uNPFnLhUdtTCQfF7zBMLWlN7J/D5mioT/d4Si\nUxdpuMX0S9qO60Wa/xDdIqm1jyLLhRxxG6yXQMnF5mnDoDVuI011JWZWAT72\nRGE7uOXeKbncu646Tos5GDGA5YiK7JTzdpks5DZsT1EmeS1l8NPE8ZLLKJDX\nvGzU0xTSPKbHUYD2v809v5tAYLmSmcu4jHySD7cTWfEMlV5IkdTIZxPYQ7Kj\n0KYfZ08dp5E0UGwK50//nzfceJoruQS/3+KZmoJh5YI3yTQDu6wIeuEB/KhM\nnuPVNavWdrcOei8Io5XuXVuv7A+WtfqsbOFlmpr2ZVH0hqN1EjOZVyln1Bjj\nyFgIwYcMtYErH/kVQ4w7Y56WokEY+SPbbh8/DXhPmLnRWr7upTksEUtb+nlN\ni1TX\r\n=fl9Y\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC6UekdQ+01qxtmRcV1FfmDcylootePKDYGVi7ot4PeigIgIdpzUzFB4Or8BpMjt7d2KB32W0EwBUjmoVSGk9aQh6A="}]},"_npmUser":{"name":"researchgate-bot","email":"stefan.hoth@researchgate.net"},"directories":{},"maintainers":[{"name":"justinvdm","email":"justnvdm@gmail.com"},{"name":"weaintplastic","email":"info@weaintplastic.com"},{"name":"researchgate-bot","email":"stefan.hoth@researchgate.net"},{"name":"sbekrin","email":"sergey@bekrin.me"},{"name":"danez","email":"daniel@tschinder.de"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/spire_3.2.1_1605194647819_0.12966658481067928"},"_hasShrinkwrap":false},"3.2.2":{"name":"spire","version":"3.2.2","description":"Extensible CLI toolkit managment tool","main":"index.js","repository":{"type":"git","url":"git+https://github.com/researchgate/spire.git"},"author":{"name":"Sergey Bekrin","email":"sergey@bekrin.me","url":"https://bekrin.me"},"license":"MIT","bin":{"spire":"bin/spire.js"},"engines":{"node":">=10.18.0"},"scripts":{"postinstall":"./bin/spire.js hook postinstall","preuninstall":"./bin/spire.js hook preuninstall"},"dependencies":{"cosmiconfig":"^7.0.0","detect-indent":"^6.0.0","fs-extra":"^9.0.0","git-remote-origin-url":"^3.1.0","import-from":"^3.0.0","invariant":"^2.2.4","pretty-format":"^26.0.0","signale":"^1.4.0","spire-config-default":"^3.2.2","yargs":"^16.0.0"},"devDependencies":{"spire-test-utils":"^3.0.0"},"gitHead":"521e2835666594904520fcd77aef76a2818c432f","bugs":{"url":"https://github.com/researchgate/spire/issues"},"homepage":"https://github.com/researchgate/spire#readme","_id":"spire@3.2.2","_nodeVersion":"14.15.1","_npmVersion":"lerna/3.22.1/node@v14.15.1+x64 (linux)","dist":{"integrity":"sha512-vyklhHtCiwuC2sY4Mp8iI6vCyPD7kbdroVSdW16cz9Kae7qbOUGw2AilKsykDxbxBgFyUeSVK1jN+pLDLN3Myw==","shasum":"49c5d581f10c8c4a688684790fda65f8f4854ccf","tarball":"https://registry.npmjs.org/spire/-/spire-3.2.2.tgz","fileCount":22,"unpackedSize":45911,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfySzcCRA9TVsSAnZWagAAwPkP/jTwv4z+uH4UaxrnhaN6\noZWUtqLEFS/Mk4QZF2gRlj+EXMNKL1d0SX5ON52Cmoac845P59fpOCkUFQ6y\nmymSGFKVroed9RHD/zPQ/BbEwL4zaSmEEnzouHw4HJ5+j6wN/arbJZh1xflZ\nC9unvnEUgjjsB7WXG7rvs1XD0/NW4tgOeYxrDhAeuLR9XNASiqY2K4mbjP2G\nNhWYCS5GRpAr95w1ECoUb+HfQ1f7kxNY94mFVGR+VNhqRdyicLvFyCOX5i5T\nzXzZSmED1xoEUBSQSnxNaxu7ikXKmHNcLolCgDlYu2DxY+85baccFn15mvqe\n8iYpKONzKe6McCMPOi7u5d/TG5LSiRHRMuXeYHUtF35sAnOZNeqOrGuP9Uz3\nSGgZnuSl6f0ey7AzjpByOXFnwnmyiXB0TEwpPa3yT1TKcw6tcgAPUxXxvLOA\nJ3taKzJeWyWpwxz5tJfI9DujnSLSn1aIDf3AS4OtVHVP+MwGgcJNEzsOxrgY\n5WpmdbKLHGFjMiQpMjSCMjF7VDh+Bi/FUHC3G0WggFc8fuod75oUZXTvcGd/\ndTD8KCxBstXaBTenMR8wlIuy//rtvDhVfcKZmunDlXQfQclTA4U0JY674uan\nvU2WnxtI9lE3C1TrXtMSrrRTu/DdJcohCP5fX6aWd6mFdR7xguG/4oo3cntS\nViDE\r\n=WD/q\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCvemVtX5cv8MnAD8eFopDJcljNo/JGkHQKVIco8+SgRwIhAIxV3gVCC7GPHqAZI8P3IpnHBpk9iv7/eJntrY5dJA/O"}]},"_npmUser":{"name":"researchgate-bot","email":"stefan.hoth@researchgate.net"},"directories":{},"maintainers":[{"name":"justinvdm","email":"justnvdm@gmail.com"},{"name":"weaintplastic","email":"info@weaintplastic.com"},{"name":"researchgate-bot","email":"stefan.hoth@researchgate.net"},{"name":"sbekrin","email":"sergey@bekrin.me"},{"name":"danez","email":"daniel@tschinder.de"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/spire_3.2.2_1607019739953_0.7834551609676197"},"_hasShrinkwrap":false},"3.2.3":{"name":"spire","version":"3.2.3","description":"Extensible CLI toolkit managment tool","main":"index.js","repository":{"type":"git","url":"git+https://github.com/researchgate/spire.git"},"author":{"name":"Sergey Bekrin","email":"sergey@bekrin.me","url":"https://bekrin.me"},"license":"MIT","bin":{"spire":"bin/spire.js"},"engines":{"node":">=10.18.0"},"scripts":{"postinstall":"./bin/spire.js hook postinstall","preuninstall":"./bin/spire.js hook preuninstall"},"dependencies":{"cosmiconfig":"^7.0.0","detect-indent":"^6.0.0","fs-extra":"^9.0.0","git-remote-origin-url":"^3.1.0","import-from":"^3.0.0","invariant":"^2.2.4","pretty-format":"^26.0.0","signale":"^1.4.0","spire-config-default":"^3.2.3","yargs":"^16.0.0"},"devDependencies":{"spire-test-utils":"^3.0.0"},"gitHead":"6292078c51ff30ee45b5aded18957bcfaddc7bf4","bugs":{"url":"https://github.com/researchgate/spire/issues"},"homepage":"https://github.com/researchgate/spire#readme","_id":"spire@3.2.3","_nodeVersion":"14.17.0","_npmVersion":"lerna/3.22.1/node@v14.17.0+x64 (linux)","dist":{"integrity":"sha512-1+a9mIi1+AYNFfpjzU1eym6SZ7w4xzc8ISZvIxYpiXfJmcjjf/jr7mrSefLNPDFquDga7WD+Kr7/ygBCVQzc3g==","shasum":"a1345edd53026fce47a8b2a8e6faa21aa221c108","tarball":"https://registry.npmjs.org/spire/-/spire-3.2.3.tgz","fileCount":22,"unpackedSize":46050,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgqDygCRA9TVsSAnZWagAAYNMQAIy1e0L0Dqq7WkURjsom\nzTu2Ss4u6RLMqyVOT8mfZhq8O+fjDbtS96Wp+j5i9S5cej4JOMOrTVLPbkER\ninoRm+QIZt7UfCg7NoEAQyOJtM5hOiao876fDKhcizHLEqgc+ZPk4EO7jS//\nig0+r5thfz39bKvdxNgTC9BGurPRJXOPD0FJb0A0yE9+CfqqY7Yf1uH/QrP4\nCPx+Uku15DlyN9qNUeKsZLGwpiqGOAYaSdi2+FDdFgzbqsjj5yX1l2mACHE9\nCbQY4zrc8ugORZxKEjWUWJluwiLkLH6FQP+gKwzmPdcBVyUoazBYAQdEuwHY\ncin5KqdtjeKHVf1SWY6a+OcZl2jZQUWfEL9KjrBIucW07rcYj2UI/iwf7QJ8\nn12McFfNuOgP1DcmI7qL9GLQZc2ZoAnsEGslS5N5SSeDlIdraz4dW5wM+wcB\nnbNCKr0nEvDPoHm2+QEpNVvqRjsHtnjUFJ783aR+ys9ghORap7+TpHq7LCCg\niQM+ZC+uHUts6EaStvWl7wcO6Ny1rLy03DnZGpFzk4QNKJ5a6xHA1dYTRrgy\ntSNfa4dC4dRWbSIWDCmvfqwkl8ZfhN8rfj9ac80SIP80Yohi+WTr8SlsmvoG\nZlEbH8euAH41V0WD0JLu1JtkX7/eejodm5DrGZUOzS54JZZ2Bmllrn2cCNYc\n2iN1\r\n=Ps0X\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICivO+bb4e69cbIwC2Zxo8VNAadybXXuukWHH+t+Oka8AiEAzYUoYTG4HriU1+EeotgOnGbDFsOrVFK5RLwtoA2x/DY="}]},"_npmUser":{"name":"researchgate-bot","email":"stefan.hoth@researchgate.net"},"directories":{},"maintainers":[{"name":"mdio","email":"michael.diodone@researchgate.net"},{"name":"stefanhoth","email":"stefanhoth.de@gmail.com"},{"name":"danez","email":"npm@tschinder.de"},{"name":"sbekrin","email":"sergey@bekrin.me"},{"name":"researchgate-bot","email":"stefan.hoth@researchgate.net"},{"name":"justinvdm","email":"justnvdm@gmail.com"},{"name":"weaintplastic","email":"info@weaintplastic.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/spire_3.2.3_1621638303649_0.6895862988690962"},"_hasShrinkwrap":false},"4.0.0":{"name":"spire","version":"4.0.0","description":"Extensible CLI toolkit managment tool","main":"index.js","repository":{"type":"git","url":"git+https://github.com/researchgate/spire.git"},"author":{"name":"Sergey Bekrin","email":"sergey@bekrin.me","url":"https://bekrin.me"},"license":"MIT","bin":{"spire":"bin/spire.js"},"engines":{"node":">=10.18.0"},"scripts":{"postinstall":"./bin/spire.js hook postinstall","preuninstall":"./bin/spire.js hook preuninstall"},"dependencies":{"cosmiconfig":"^7.0.0","detect-indent":"^6.0.0","fs-extra":"^10.0.0","git-remote-origin-url":"^3.1.0","import-from":"^3.0.0","invariant":"^2.2.4","pretty-format":"^26.0.0","signale":"^1.4.0","spire-config-default":"^4.0.0","yargs":"^16.0.0"},"devDependencies":{"spire-test-utils":"^4.0.0"},"gitHead":"4d2da9d06d4554024e667c3b952c49532af10992","bugs":{"url":"https://github.com/researchgate/spire/issues"},"homepage":"https://github.com/researchgate/spire#readme","_id":"spire@4.0.0","_nodeVersion":"14.17.0","_npmVersion":"lerna/4.0.0/node@v14.17.0+x64 (linux)","dist":{"integrity":"sha512-ioIeRiRY81xqwjL6pBKp0q14EeSlQgoRESBuoCQJ6Up9pxHoVqmZ0MHWELCIh8E4m2i0NuEyg3OWPPo5U/oFWg==","shasum":"953def14ba36d2d2654a76e8fe61e1f43864d928","tarball":"https://registry.npmjs.org/spire/-/spire-4.0.0.tgz","fileCount":22,"unpackedSize":46716,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgqENsCRA9TVsSAnZWagAAtk0P/R0HKRduge0+IgJuMHSX\nUWYIb1rD/Ix4LpIkNoOWWSDIle76IpXl82pq8urKOYXIUzAznmk8FsBvnXD4\nqAiuMSXbJ8asYbUjSTkm42QlaXDGmhaEYyY5NlF0UWZRq+rPmr7a9XfWkio8\nx8dzlE5Gko+OjJtqHVLRt//s7GmTMmp3f7L3asOQZmJapLlutHyZgWFhRAYJ\ncUNzVjtosG7u0NSqjyQmFeymHxRnLx3Pai1dpL8ChB24Opmc90Cqwkp0qf5T\nMLleoeqB9Pru/8RQBEWMHAkKF+f1VuRjpmRVoDfSdfzNna2FDuH29M2kZGQe\n9277FfGIHDRM0bjUgbOObqA/JX8hxcro5YC7YrGJFjSFvjcANcWP4ftfqwjH\n55HH1og+jHTJXYdQOEd8CXsZYtallyRiADmASja+Qoy+eYRnhc9ZNqIxxEdj\nHswIZK8YCeiA7wKZXeT+bYSz0BALv+4FcaxjwyTdrK3MdR1UkMAZkNVVvUpA\na8TVlK8DXfiU7achFk6di8DEkw2J2zqIsQ/wbWuw4UyQGHbhDDKp0NSsla7q\nGMgW36v+HiiKU3z47gYr0MiM4f6IGlsh+0wsNq6wtu5E1b3ZRnASyZv6Se1T\n7X/dQ9cuZHUSP40KRckUwqlKuEvf+/tWj7/ZatJef66/8mskTGwtgoP0s0kr\nYy5h\r\n=aRZn\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCICLgcccrD8P2zoK14/GgkWaKJuuLApUN43g00y6r//CvAiBVQRsUD0e9Vpl0oSLBZL1GzPUnSkCEaVXX4wX2umUMPg=="}]},"_npmUser":{"name":"researchgate-bot","email":"stefan.hoth@researchgate.net"},"directories":{},"maintainers":[{"name":"mdio","email":"michael.diodone@researchgate.net"},{"name":"stefanhoth","email":"stefanhoth.de@gmail.com"},{"name":"danez","email":"npm@tschinder.de"},{"name":"sbekrin","email":"sergey@bekrin.me"},{"name":"researchgate-bot","email":"stefan.hoth@researchgate.net"},{"name":"justinvdm","email":"justnvdm@gmail.com"},{"name":"weaintplastic","email":"info@weaintplastic.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/spire_4.0.0_1621640043641_0.197824793215708"},"_hasShrinkwrap":false},"4.0.1":{"name":"spire","version":"4.0.1","description":"Extensible CLI toolkit managment tool","main":"index.js","repository":{"type":"git","url":"git+https://github.com/researchgate/spire.git"},"author":{"name":"Sergey Bekrin","email":"sergey@bekrin.me","url":"https://bekrin.me"},"license":"MIT","bin":{"spire":"bin/spire.js"},"engines":{"node":">=10.18.0"},"scripts":{"postinstall":"./bin/spire.js hook postinstall","preuninstall":"./bin/spire.js hook preuninstall"},"dependencies":{"cosmiconfig":"^7.0.0","detect-indent":"^6.0.0","fs-extra":"^10.0.0","git-remote-origin-url":"^3.1.0","import-from":"^3.0.0","invariant":"^2.2.4","pretty-format":"^26.0.0","signale":"^1.4.0","spire-config-default":"^4.0.1","yargs":"^16.0.0"},"devDependencies":{"spire-test-utils":"^4.0.1"},"gitHead":"ac97db03c0ff56a118881c24332a5baac8f5cb36","bugs":{"url":"https://github.com/researchgate/spire/issues"},"homepage":"https://github.com/researchgate/spire#readme","_id":"spire@4.0.1","_nodeVersion":"14.17.0","_npmVersion":"lerna/4.0.0/node@v14.17.0+x64 (linux)","dist":{"integrity":"sha512-yOwO9TFfO5fAiM8z77yyu/L/4v0uqNC+B+SmrxWyhrb3hEwx2Vm8oVf0dVZGFVmJumqa6TXCUan3ATN7C5GoDw==","shasum":"b4aa75fba95953822b8ac1f11e19eb6dda036a50","tarball":"https://registry.npmjs.org/spire/-/spire-4.0.1.tgz","fileCount":22,"unpackedSize":46855,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgqEfSCRA9TVsSAnZWagAA07cP+gI2PSOZ6DPmPAYE31fV\nqJhxaM28Gj7T7Fi75Yqc1lLA1U89PmMDjo2TJDNIEwr+uBIikCG+u2cFcJBV\nTIf0gKx5FIJQ4QVQSgX/j+YpZS19uvWWWe7PHqVzVsSD1EPg8I8W1g8/dPkM\nVP+W7lljZyeEOjfdSK7U1ZbFAaLdQoQAVeFxsUhbq3Tp+HBjTVCpqZCDM2qD\njv2l0FL3nbVNmVLRJmJVVXPkI3d0SvpEL5iQ3BW86TzbFf9xo7IGvgSVmM0m\nmy+XwcAvdm/zWOWxDcN7K0YDX4MMqpExjQh6zVGIjHdCWVGlkoP0wj0nLRY/\n1vzODdFsIZ/LQhZhCI6BX/BdFxCGBeeJPcUu+3Jiv0MUQU7judIsxOd01Bwi\nx9ChJniQMpsOQHjZlzi8tE2wFJxuiLOcw8q5DvOkVoHUgyP7ecuO49kkF4lg\nY7uqiij7ep9Qt7sBKBMuHzHtGi2AAgHxLolchPDzR1OHQgudzusa8fQXuvqR\noxeV5NqykWlGh7ZrZiIn6KuzU3dASW8hMgR5pE7yJU8WIZX4PAQR9ItCDbQf\nyHMAJNGYomHkEeyKxs5hI/nl/TUGrziU2hpviF06J2q2FJ6BifVLqWjmppG7\nSsdr1Stwu+ai3pu3cjPRbM9Cx2WaWn84RUtd4JK3/Lv7VzIi7+4qn33Pcfhf\nHHrt\r\n=lXbg\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDnG2Ibr0HgsmIms+uYRNsqYtrleLQ6TYqEGNZ2jpmTagIhANfuTpiw9IyzHvtsc/51nYNWdUshWDr0aXC1zOa0+t1z"}]},"_npmUser":{"name":"researchgate-bot","email":"stefan.hoth@researchgate.net"},"directories":{},"maintainers":[{"name":"mdio","email":"michael.diodone@researchgate.net"},{"name":"stefanhoth","email":"stefanhoth.de@gmail.com"},{"name":"danez","email":"npm@tschinder.de"},{"name":"sbekrin","email":"sergey@bekrin.me"},{"name":"researchgate-bot","email":"stefan.hoth@researchgate.net"},{"name":"justinvdm","email":"justnvdm@gmail.com"},{"name":"weaintplastic","email":"info@weaintplastic.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/spire_4.0.1_1621641169570_0.901700149277314"},"_hasShrinkwrap":false},"4.1.0":{"name":"spire","version":"4.1.0","description":"Extensible CLI toolkit managment tool","main":"index.js","repository":{"type":"git","url":"git+https://github.com/researchgate/spire.git"},"author":{"name":"Sergey Bekrin","email":"sergey@bekrin.me","url":"https://bekrin.me"},"license":"MIT","bin":{"spire":"bin/spire.js"},"engines":{"node":">=12"},"scripts":{"postinstall":"./bin/spire.js hook postinstall","preuninstall":"./bin/spire.js hook preuninstall"},"dependencies":{"cosmiconfig":"^7.0.0","detect-indent":"^6.0.0","fs-extra":"^10.0.0","git-remote-origin-url":"^3.1.0","import-from":"^3.0.0","invariant":"^2.2.4","pretty-format":"^26.0.0","signale":"^1.4.0","spire-config-default":"^4.1.0","yargs":"^17.0.0"},"devDependencies":{"spire-test-utils":"^4.0.1"},"prettier":"spire-plugin-prettier/config","gitHead":"2636469f3ba3a9515c10318c9107e7c08226515f","bugs":{"url":"https://github.com/researchgate/spire/issues"},"homepage":"https://github.com/researchgate/spire#readme","_id":"spire@4.1.0","_nodeVersion":"14.17.0","_npmVersion":"lerna/4.0.0/node@v14.17.0+x64 (linux)","dist":{"integrity":"sha512-lGukGSIk4NTCYLrH2aUQEBAuy0Oe3uOtUanK0rp/r3C8dBdhNJpnmuMdFOAyA4Bn2Jd/47SeEQb2i00Ye1Q2/g==","shasum":"13096d716e4f87bbf670221568bf36bcf1d72aea","tarball":"https://registry.npmjs.org/spire/-/spire-4.1.0.tgz","fileCount":23,"unpackedSize":47282,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgqQBsCRA9TVsSAnZWagAAmrIP/RTFqOZDx5xYkLYusjfS\nC693beqqYtqHU9TKsgopvkmIsLyO6EluvuyykJxEa5a4h/et70uRqgjA7PwZ\n9fh5BHOorCopUgMkrrsd+xWfxL7f4P470gLPDraigLz0ak5oTGxLXIFHbmty\nTCAO5paFua3fv54STQZ9tCFZ4YbmMvVTx+y5R3cEoR+3dVRq5Qq7sTJFnAJl\na7bnwqQopwySeku3+VXxPjyYCO14A3MI0kGvdKiJYEuDk1Jfxut7EX7pDeZK\n09bwM61nEL0kENR0XZ2HJcDq75W+c1YmU9sxzK2yruDG6OePbvL4iZvlvIht\nMF7eYYYImw1wcqG8MKp/c/66MatwHXXjk7Z+LMAuVsuZC/4Mm5K+LQefm/qT\nLFGCk2YUIRVUUnrBbIM5suENI22rjEqv51A+TUT2YGYwU0110uYtcDq9mkNz\nrIRZNac2GKvcCCqZJ01W8V3JT2vJCASrDVb+Sdg5oXgyiDhI8pHOhCdxawT+\ns8vi1oUvu/c4IkJOEWw+PAV+zT24ZJIhuAITEiKTDI2NHP12vVBudOEG0fER\nPWwRjkx4qR0vVgnHXNbb1nZG72bXyR8JrnDXpupoX3XZmbBQmPn6/vzfe+Sw\n00MD8wEFR5TrcjgqPxQpcmmQGKYnzNpjntmZ3uwAwAmt5xaevxpDYQzS01aP\nct25\r\n=0Q3H\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGzIOSiskhH6WmcK2jtSeSz7ItLwFzMET+mvzqWjSGq2AiEAqsZXn6rZhr1w2KhipPpwcjEMewW2SzJGB5HZNKFJVXc="}]},"_npmUser":{"name":"researchgate-bot","email":"stefan.hoth@researchgate.net"},"directories":{},"maintainers":[{"name":"mdio","email":"michael.diodone@researchgate.net"},{"name":"stefanhoth","email":"stefanhoth.de@gmail.com"},{"name":"danez","email":"npm@tschinder.de"},{"name":"sbekrin","email":"sergey@bekrin.me"},{"name":"researchgate-bot","email":"stefan.hoth@researchgate.net"},{"name":"justinvdm","email":"justnvdm@gmail.com"},{"name":"weaintplastic","email":"info@weaintplastic.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/spire_4.1.0_1621688427969_0.361796442695127"},"_hasShrinkwrap":false},"4.1.1":{"name":"spire","version":"4.1.1","description":"Extensible CLI toolkit managment tool","main":"index.js","repository":{"type":"git","url":"git+https://github.com/researchgate/spire.git"},"author":{"name":"Sergey Bekrin","email":"sergey@bekrin.me","url":"https://bekrin.me"},"license":"MIT","bin":{"spire":"bin/spire.js"},"engines":{"node":">=12"},"scripts":{"postinstall":"./bin/spire.js hook postinstall","preuninstall":"./bin/spire.js hook preuninstall"},"dependencies":{"cosmiconfig":"^7.0.0","detect-indent":"^6.0.0","fs-extra":"^10.0.0","git-remote-origin-url":"^3.1.0","import-from":"^4.0.0","invariant":"^2.2.4","pretty-format":"^26.0.0","signale":"^1.4.0","spire-config-default":"^4.1.0","yargs":"^17.0.0"},"devDependencies":{"spire-test-utils":"^4.0.1"},"prettier":"spire-plugin-prettier/config","gitHead":"9c7816eb60c214137c408cec04103c2ef6230f35","bugs":{"url":"https://github.com/researchgate/spire/issues"},"homepage":"https://github.com/researchgate/spire#readme","_id":"spire@4.1.1","_nodeVersion":"14.17.1","_npmVersion":"lerna/4.0.0/node@v14.17.1+x64 (linux)","dist":{"integrity":"sha512-vLaidiaCNVSKD1zudh6wgC89lZb9YTn1zRChdrz/CDVvqmTIOdqaCJoaFLUr9U/1I42HH5RDMmfGZGfLCHec4w==","shasum":"ca67e9109cd8c9d4fba1ff2371a163ccba303d8c","tarball":"https://registry.npmjs.org/spire/-/spire-4.1.1.tgz","fileCount":23,"unpackedSize":47538,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJg33RVCRA9TVsSAnZWagAAcmAP/RgHZthG165OMphgDmp4\nwkFASwCLUXluifmDttnixnOTokdaHN0xqrsQWLCxT+XE7y2Ehqip53a2dQ2E\nLEBCXZpN0p5h60H2/N23VEas3s3lS194YkPgiq1kJJCuAe5/VL41vX+o64hW\nTLXllNgfzbnRCkXLQdwuaGIYNKjpcHrpNaXgCSm8uslJ3Awix0el3X3aQ2lz\nBb7/ypJXLQTouGo+ZbFoK/pfDpdQ/o/AGjHgHL64/9milXHr4VLHzF8g9ZFt\ndv7WIoyzzOycnAllDc/3u+PrLEQoNuCIbcRJZUoXAZaxy+puafQBESQF9djK\nDjeyYj3j3IngJPLGYfAWVYhZi1huPk848DK2QT/5FB0CAkykzZew7CRo/C2k\nECVhhkcYzJfyYB28+Wr8cy19cYRLnBb+VjYNc6hkxidlFCUI1sTVO/sbpzT6\ng4miYrD0NFGch42PMK4SVLl5Ek01L0fNKOvHamxP0276YaMvXHgltmoL/JZY\n2nC4jnm3dZcHVvdfXhfg19LxmzIY1jqwlnG0fux1HmqNgixcDulpF27eP0Pw\nqI5r+sG+UVJjacYuaMfPKKiN2AU7M70U4M91yHasav2h4dTJWGzBi2rnqaO6\n+C9IOhrsBOY0jc6rJpyAu1rzwcLi7YSRHcGP5wgP6xbTP9o+7XM23UdEVVf2\njRkC\r\n=SswF\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDafIm/KmRidnRNEnxXXwhO7CTN7MPWn7McPgztr/NsJAiEAn7hwvRKXEO88O+vqKKTmsYfYCtywIpTuw2Zja81YFrQ="}]},"_npmUser":{"name":"researchgate-bot","email":"stefan.hoth@researchgate.net"},"directories":{},"maintainers":[{"name":"mdio","email":"michael.diodone@researchgate.net"},{"name":"stefanhoth","email":"stefanhoth.de@gmail.com"},{"name":"danez","email":"npm@tschinder.de"},{"name":"sbekrin","email":"sergey@bekrin.me"},{"name":"researchgate-bot","email":"stefan.hoth@researchgate.net"},{"name":"justinvdm","email":"justnvdm@gmail.com"},{"name":"weaintplastic","email":"info@weaintplastic.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/spire_4.1.1_1625257044463_0.8084629414957512"},"_hasShrinkwrap":false},"4.1.2":{"name":"spire","version":"4.1.2","description":"Extensible CLI toolkit managment tool","main":"index.js","repository":{"type":"git","url":"git+https://github.com/researchgate/spire.git"},"author":{"name":"Sergey Bekrin","email":"sergey@bekrin.me","url":"https://bekrin.me"},"license":"MIT","bin":{"spire":"bin/spire.js"},"engines":{"node":">=12"},"scripts":{"postinstall":"./bin/spire.js hook postinstall","preuninstall":"./bin/spire.js hook preuninstall"},"dependencies":{"cosmiconfig":"^7.0.0","detect-indent":"^6.0.0","fs-extra":"^10.0.0","git-remote-origin-url":"^3.1.0","import-from":"^4.0.0","invariant":"^2.2.4","pretty-format":"^26.0.0","signale":"^1.4.0","spire-config-default":"^4.1.2","yargs":"^17.0.0"},"devDependencies":{"spire-test-utils":"^4.0.1"},"prettier":"spire-plugin-prettier/config","gitHead":"a95361d7bc266393fdcc11c7db32eb05096cd2e3","bugs":{"url":"https://github.com/researchgate/spire/issues"},"homepage":"https://github.com/researchgate/spire#readme","_id":"spire@4.1.2","_nodeVersion":"14.17.6","_npmVersion":"lerna/4.0.0/node@v14.17.6+x64 (linux)","dist":{"integrity":"sha512-bPCZCoHMOpoMZyyrJcc+TmjAYsZT5xWmb1oY/u38UvUpy8w6WiwFwifAALaNE/G9pQ3NNySiJRLOYIZ2yutK4A==","shasum":"5d2ed01096ad4a7b443cfbe3296545673ea30234","tarball":"https://registry.npmjs.org/spire/-/spire-4.1.2.tgz","fileCount":23,"unpackedSize":47677,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhOiswCRA9TVsSAnZWagAAHd8P/3sbDN+HIWKS5/92S6rj\nrekw/shPiFVX4yI2MTyB1G53eMhyNwYzHJ0KzzjFent8dPlJ7IsWZsGbkfXA\nQQLb0N2BKZSwyA/LYgF8dXVBPnx/L7Vgdom0RILqJZE36wgNuAergbj1qZmB\nqcID+4a5S7UMCunb3e7o3tfH3Ix4o321RntZZBEnOBMXP1AYbJ90R3tVeYoH\nOX+lgTwxial5oZ+OTerkmKy6wPhPB+Dx0PRHvsrNoro4alGC/WfOK0uiQV41\nUtdajrvoji7e1dcmNg5tXoyIEFijw8n4oIGEB1O2MgamkHgIpTrxcJb19Yya\nHVt610YhIT9YIjoHi0WIo1wbDdkjBEn2xi7FN2Msmk/k2dEAd9Ea8sXqBeBk\nSNhL7NusyZqUltqirTBC85lePsZn85h5+6sCu3kZbmL+mTKpxmgQB2AqVdAc\nvGaNXPXFWTBBWqXT/hn31gCwS9B5+z9z9Tg58lXo1vT9LZMAWhjLfumRzsb1\n06MaX8PNB6MV29RDbTRfaQHY/z97mzxXInnYN3l/4EyTg8Bo67qYEvqyMDEP\nPwB4pFW6dI9QZThBGu6eRBS69n1sfRwAEiLaInXwBQk4wkB1Jxm1Rz/krDEE\nxRVDQcrAzYgRFu6Iioaqj5pEAeapDGWeRHPqCjKwnLYLUsuxA/TE4yn+TouZ\n262T\r\n=RqsZ\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDmE2b0u7VJRYb8K5bhSVdVj1ob7pQUVkc5OAVnzGwn8AiAbDm4ZU+2nDpibLIVWAGDKltKW6q3Mi8frXPXoLrApjg=="}]},"_npmUser":{"name":"researchgate-bot","email":"stefan.hoth@researchgate.net"},"directories":{},"maintainers":[{"name":"danez","email":"npm@tschinder.de"},{"name":"sbekrin","email":"sergey@bekrin.me"},{"name":"researchgate-bot","email":"stefan.hoth@researchgate.net"},{"name":"justinvdm","email":"justnvdm@gmail.com"},{"name":"stefanhoth","email":"stefanhoth.de@gmail.com"},{"name":"mdio","email":"michael.diodone@researchgate.net"},{"name":"weaintplastic","email":"info@weaintplastic.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/spire_4.1.2_1631202096150_0.24099875243621272"},"_hasShrinkwrap":false},"5.0.0":{"name":"spire","version":"5.0.0","description":"Extensible CLI toolkit managment tool","main":"index.js","repository":{"type":"git","url":"git+https://github.com/researchgate/spire.git"},"author":{"name":"Sergey Bekrin","email":"sergey@bekrin.me","url":"https://bekrin.me"},"license":"MIT","bin":{"spire":"bin/spire.js"},"engines":{"node":">=12.20"},"scripts":{"postinstall":"./bin/spire.js hook postinstall","preuninstall":"./bin/spire.js hook preuninstall"},"dependencies":{"cosmiconfig":"7.0.0","detect-indent":"6.0.0","fs-extra":"10.0.0","git-remote-origin-url":"3.1.0","import-from":"4.0.0","invariant":"2.2.4","pretty-format":"26.0.0","signale":"1.4.0","spire-config-default":"^5.0.0","yargs":"17.0.0"},"devDependencies":{"spire-test-utils":"^5.0.0"},"prettier":"spire-plugin-prettier/config","gitHead":"8149ee92802d05dec62d3c68b1d60c3b926e53e5","bugs":{"url":"https://github.com/researchgate/spire/issues"},"homepage":"https://github.com/researchgate/spire#readme","_id":"spire@5.0.0","_nodeVersion":"14.17.6","_npmVersion":"lerna/4.0.0/node@v14.17.6+x64 (linux)","dist":{"integrity":"sha512-zuLC+dTyY2GJbzMz8LXyLt7fDIqfumN/ppnlcSdi2nywbV215GPYvkdhuzqnnAHuYvCBNk44X7qOQX5uqb+QMA==","shasum":"28017c8d45581645cb4e4e361370ad801afff03f","tarball":"https://registry.npmjs.org/spire/-/spire-5.0.0.tgz","fileCount":23,"unpackedSize":47987,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhOnJXCRA9TVsSAnZWagAAD+kP/3eZ5PJHb0E7Jl/tlrwA\nXBBhDm3tahwoF98WHVFdB5Wokn/2T2k1j7iIVozh0PX53utYeZj8nV86JvhQ\ngB9MbwCkiwZjrcQ9334KN1hkoPR1cy+dI5WB2IS3gPjjcb4mKLhsAT3KkOZV\n/UthyDDqEZtJpDT6W/hfLLXw54W4MEXax361bGBDzSuV9OJM3XLGkbsiwcSd\nescQ5jY7+3xU+CD0rQMWYVs+X4gzJ5ogipXyj/PiHZyqOWJasYL1wQkJP5kv\nIaGau6Ecy7odRKEzqAUyrHkA4TFqDxOGQcKQ8LclMmrqoiASXfcCYTydxb6a\nSuHGC4rV2kKeHGyV0+wv+P07Sir6igv6QnopqUvXirGIfJGoXQNmCtQ0/Kgn\nxFjnh81N/WegIHyf8In13RdbYoGvhWnxjV8ErUMFwCzXGVBQAnE1o2TB3sSB\n4iSW3bPJ4xxQSz8LQ1rQ3fnAaie0l/89W5S36BhUUUGOCC7N1KZcQmK7/PQ+\nIMxU7d/gXvb+hCDVgmpq3pX0nkluDB27YNTFWwbyDZ+X+ASyh8MSeiU90D3O\nBy1wIjbOS58OnhufODVRXDpXf14pP5zNsnRreHAqI23ZG3x9S6FJ6PraHCQL\ndrmbEzdVaWQwJhXnTM3Iv0os0TSB/Hu+kWYCoQ8GMe1mhGbSXHi4DW7zOdvn\ntGfw\r\n=Igdb\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCICJltvAjqh34GekV7vqRjL2I9IBJO6lYBpUOp3E2PVCsAiAU4SJbDBxVw7nRSfiJ4FMb6PF4V5cBvGqH601dKT9I9g=="}]},"_npmUser":{"name":"researchgate-bot","email":"stefan.hoth@researchgate.net"},"directories":{},"maintainers":[{"name":"danez","email":"npm@tschinder.de"},{"name":"sbekrin","email":"sergey@bekrin.me"},{"name":"researchgate-bot","email":"stefan.hoth@researchgate.net"},{"name":"justinvdm","email":"justnvdm@gmail.com"},{"name":"stefanhoth","email":"stefanhoth.de@gmail.com"},{"name":"mdio","email":"michael.diodone@researchgate.net"},{"name":"weaintplastic","email":"info@weaintplastic.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/spire_5.0.0_1631220311678_0.21147877472326138"},"_hasShrinkwrap":false},"5.0.1":{"name":"spire","version":"5.0.1","description":"Extensible CLI toolkit managment tool","main":"index.js","repository":{"type":"git","url":"git+https://github.com/researchgate/spire.git"},"author":{"name":"Sergey Bekrin","email":"sergey@bekrin.me","url":"https://bekrin.me"},"license":"MIT","bin":{"spire":"bin/spire.js"},"engines":{"node":">=12.20"},"scripts":{"postinstall":"./bin/spire.js hook postinstall","preuninstall":"./bin/spire.js hook preuninstall"},"dependencies":{"cosmiconfig":"7.0.1","detect-indent":"6.0.0","fs-extra":"10.0.0","git-remote-origin-url":"3.1.0","import-from":"4.0.0","invariant":"2.2.4","pretty-format":"27.1.1","signale":"1.4.0","spire-config-default":"^5.0.1","yargs":"17.1.1"},"devDependencies":{"spire-test-utils":"^5.0.1"},"prettier":"spire-plugin-prettier/config","gitHead":"b0d3d1f3a60c74e8b32050db8110ef1909992649","bugs":{"url":"https://github.com/researchgate/spire/issues"},"homepage":"https://github.com/researchgate/spire#readme","_id":"spire@5.0.1","_nodeVersion":"14.17.6","_npmVersion":"lerna/4.0.0/node@v14.17.6+x64 (linux)","dist":{"integrity":"sha512-CPoDnYf32SwZdgJu+mVcYtAvFQxlXrJrCpJybr+/IEsrdoBdgDRKgy4oyTaM5IhYTcfRF0dVJasBFwI+SC9Dwg==","shasum":"7600500765cc476d4b27f68012b86786ff8edbe0","tarball":"https://registry.npmjs.org/spire/-/spire-5.0.1.tgz","fileCount":23,"unpackedSize":48150,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhOnqdCRA9TVsSAnZWagAA0UkP/iYDslaav2CF2jgktw5Z\n3vGrAN0oD2kHWsjz39Cudd9PZD5YdDE+z9mWsnxpmIaUvuxxoa2V8UKZaF9t\n7tFc4r/hkOzXJYh8rZsVPELD3qjNITn/myzmxOP7PHza71BeT9yV8esmbkFR\nOvR21eDB56NNDXjajaqJ52GJvKZ7LtZ0j+Oz5E6NR4t6tZPnJXrwxJpgLcbS\nMAFxy6t6Q9qoYJG6XsQONd5o1L1ltp1FxCaAoh7JZZvADWZq1UdhgmXl81q3\nw46bAsMS6vizjOsGWEKVJjI4AA5rAum8deX1sm+AdWlDAD0QGDMSoZ50hggc\nO6kxzXeI0ucPJMGNxSURTuQ12F675/YbTa7Dgg/fYEUMVK+BNql8VxlM9x4k\n0MD7TjcwBYBt3MOnU1ZD7qEGkJY3pi4viDHWdZUBe70y5MIdr8JYRCtwnIT9\nuG0iTr8nK45h3M5kQgkSFjoYZYjTUarrdgLL80/5XTkN8PAW4F/5bvR2ekz1\n+y672heL2aDZAc3AgjpBS9RDten9SyrtOf9YS1F1CeIksb37d0wjIIG0hh7B\n4mJAuXHaMj4DwYEjj5O3HDFuKhOonbIiornCx/FkDq/xGCDx7VBCnkxA/VO3\n1V+jjeQeFioFEyvVZ91YLUeDk4AmbVdsm0ABHnfpJWBSASHwbgoJvW8pxpkd\n21ev\r\n=h/wB\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIA5+ZEZhf/tdmjM3lFBQFk9qXx1BhKi+C9dCBMUgZScDAiEA8DbrI+2NBeUvMM97wBC7jYPdqAEaI11SHRVtq+cHN+Y="}]},"_npmUser":{"name":"researchgate-bot","email":"stefan.hoth@researchgate.net"},"directories":{},"maintainers":[{"name":"danez","email":"npm@tschinder.de"},{"name":"sbekrin","email":"sergey@bekrin.me"},{"name":"researchgate-bot","email":"stefan.hoth@researchgate.net"},{"name":"justinvdm","email":"justnvdm@gmail.com"},{"name":"stefanhoth","email":"stefanhoth.de@gmail.com"},{"name":"mdio","email":"michael.diodone@researchgate.net"},{"name":"weaintplastic","email":"info@weaintplastic.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/spire_5.0.1_1631222429635_0.5346166853837839"},"_hasShrinkwrap":false},"5.0.2":{"name":"spire","version":"5.0.2","description":"Extensible CLI toolkit managment tool","main":"index.js","repository":{"type":"git","url":"git+https://github.com/researchgate/spire.git"},"author":{"name":"Sergey Bekrin","email":"sergey@bekrin.me","url":"https://bekrin.me"},"license":"MIT","bin":{"spire":"bin/spire.js"},"engines":{"node":">=12.20"},"scripts":{"postinstall":"./bin/spire.js hook postinstall","preuninstall":"./bin/spire.js hook preuninstall"},"dependencies":{"cosmiconfig":"7.0.1","detect-indent":"6.1.0","fs-extra":"10.0.0","git-remote-origin-url":"3.1.0","import-from":"4.0.0","invariant":"2.2.4","pretty-format":"27.1.1","signale":"1.4.0","spire-config-default":"^5.0.1","yargs":"17.1.1"},"devDependencies":{"spire-test-utils":"^5.0.1"},"prettier":"spire-plugin-prettier/config","gitHead":"32006621075978222c5b9c4d0bcbb104f3254618","bugs":{"url":"https://github.com/researchgate/spire/issues"},"homepage":"https://github.com/researchgate/spire#readme","_id":"spire@5.0.2","_nodeVersion":"14.17.6","_npmVersion":"lerna/4.0.0/node@v14.17.6+x64 (linux)","dist":{"integrity":"sha512-Jjlkwxux1bbfnCOYwT1ab9GDTMNgNCUV/tt3C7pRkmT9Vr5BCprw3VEQBzHDnK3Xo74twkqTJHpo9Al/FmvANg==","shasum":"9ff199c8ac9d6322002e0a2a2a009fdcf66437e8","tarball":"https://registry.npmjs.org/spire/-/spire-5.0.2.tgz","fileCount":23,"unpackedSize":48412,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhOnuiCRA9TVsSAnZWagAAU9gP/iCIOC+maoiU2fZZWiWB\n6lRlssE2OUDVU9MpCS+j++PIGrrBWRSTbZCbeoDP0ziktH3rHAD45subn26+\nrUoR3dYlnKFqopCHo4vlRRrDOOPMH0qvhBm3KH5CqT9q2sihX8evRS6p5En0\nnX8FdSeZBLPplNoSysP2QXWzkNPf8IX6JpLiOLX6/AaXubG6FP6PKG7XMPqV\n/hqruDgNdUfwcqrNTbg9nM2IWhPDikm8PZ0Ev9YnqLuCJ6Yd1AX44BPAEDg/\nfd9lb43FvW2WvAgG9m9JTbbbUPkUUTemWAriVF1iotLesY7qU4/1SO0Cld7m\nHgx93VWkYat9Oxt+o2md/7T7vbRnR+4tXJQnmUPeROVFbZlyJYA5RQS//9uM\nFjaE9Xy0WuefoSmXAdR3pLdOZADVcp6PQAAQHqn3XKxJq8SiyloscVY8iPnU\nXzJj+Ly7ju1gm12Mh3/MxamQ4Bp2bQR2za+hhFnIT2QS1bCnPLqPwTP8Vir4\nu7GdMmiGZCMpynDAf3UA0gX3rRJOh/vsrhAjU2nsp+sewi/jUnKvt7qda/XB\npuOP+15I207EzZLCf4FmTucCuFjhR3oB1rRCgLP3StFXZaJbh0IYnYoIxitc\n8z3CSpUIlzxggXAqDgczaZWPF2NEbyO3sZX+H0g/VTDwIQyWilUAJM0vKkJX\nt5HG\r\n=qyW8\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC5sTUnpLlISMlLZSHpNEGm3Mp+thAmG2YphYNe8ZigYgIgBtNMma1pGdzZ84uGyACCKrljsVxRdrUFSDtyYCXOvD8="}]},"_npmUser":{"name":"researchgate-bot","email":"stefan.hoth@researchgate.net"},"directories":{},"maintainers":[{"name":"danez","email":"npm@tschinder.de"},{"name":"sbekrin","email":"sergey@bekrin.me"},{"name":"researchgate-bot","email":"stefan.hoth@researchgate.net"},{"name":"justinvdm","email":"justnvdm@gmail.com"},{"name":"stefanhoth","email":"stefanhoth.de@gmail.com"},{"name":"mdio","email":"michael.diodone@researchgate.net"},{"name":"weaintplastic","email":"info@weaintplastic.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/spire_5.0.2_1631222690281_0.3656928527219203"},"_hasShrinkwrap":false},"5.0.3":{"name":"spire","version":"5.0.3","description":"Extensible CLI toolkit managment tool","main":"index.js","repository":{"type":"git","url":"git+https://github.com/researchgate/spire.git"},"author":{"name":"Sergey Bekrin","email":"sergey@bekrin.me","url":"https://bekrin.me"},"license":"MIT","bin":{"spire":"bin/spire.js"},"engines":{"node":">=12.20"},"scripts":{"postinstall":"./bin/spire.js hook postinstall","preuninstall":"./bin/spire.js hook preuninstall"},"dependencies":{"cosmiconfig":"7.0.1","detect-indent":"6.1.0","fs-extra":"10.0.0","git-remote-origin-url":"3.1.0","import-from":"4.0.0","invariant":"2.2.4","pretty-format":"27.1.1","signale":"1.4.0","spire-config-default":"^5.0.3","yargs":"17.1.1"},"devDependencies":{"spire-test-utils":"^5.0.1"},"prettier":"spire-plugin-prettier/config","gitHead":"92b63811cc725340523f7a3b3f9b0f9d32c26d5a","bugs":{"url":"https://github.com/researchgate/spire/issues"},"homepage":"https://github.com/researchgate/spire#readme","_id":"spire@5.0.3","_nodeVersion":"14.19.3","_npmVersion":"lerna/4.0.0/node@v14.19.3+x64 (linux)","dist":{"integrity":"sha512-mrnYKKN6J+vZEq1IfdayRy6EJVxb7ZrEeVsH/nj6Fn3FMb5QdMIxhroFty3+5p5J4cPfDiE9HarSktKr6KNHkA==","shasum":"f8cc2adc43f97c02f471b6a9a052048fa5892f85","tarball":"https://registry.npmjs.org/spire/-/spire-5.0.3.tgz","fileCount":23,"unpackedSize":48551,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCID/swoZgjW0yi2wwlA5b2zpb4XUsWFpUcy4B8YHsRJ5PAiADktZ7r3N21f9HwfhsXrz4VcDufaF5m6KaXghFovrzbQ=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJinkXGACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpQ/A/+IQOlmqMU5iZbaewqYEKQAzrWFToLCJ5z21rZcv0OH/aVj8Wg\r\nOg6eftToNYku65c45eDltdAJZexsVzaZXwDVFO7ruyqhDLV0VweEu9Rx8ijv\r\nC2ldBAiqgWRwBjicOP7loiZkJeswdWk7H0ipkb0E4GyVtxAU9UPrqzqKpFDW\r\nEWoQRsVCpFvO7w9MAxjBBfVzXRTjPOXfC0cynL8remlTsqBWqukoSJ8bRvO7\r\nbK1mxq99CqX/l76y1DKYHXHvVeKIfbXAuR11iQx4YuWJfw0gAvazFrtVT+U5\r\nCMp0zjbWKXnccDQeW91W5W2c9MLr9LWfKZW4poIkZGJ9wgRRcAuWCGlxhCpT\r\nUdd0oOo+oHXeJZOsAz/wA28bLTCi1Hg8Qp1qkAe/JA/B/LNm7eUvgQpK65jF\r\n0GEeSuo8ciGR5a2aF0buPwJkgXqbKnf2DWy2HJqfF9hFw3UHbgaWSSM000Ek\r\naSxTbRPVfE/R6XEHcVr+FSi2KT1pOr+h0XYXDMADzwB5zdAz2jdLJOeS+7Kv\r\nl9EH82gqo9085hUxHvSEdR1FVlyPq5fbbu4EWIxe8R2JjvIioMV+8EP0njnA\r\nVVPk0fgvqeKSBmaeG0ISC/5kQnRrLsXs2WJtQ3OLp8LuGEjiSjW33Lu9sjmO\r\nj50tq1JAF373jp0EqoVg9Eq/oXpiAOgBQbU=\r\n=DAfp\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"researchgate-bot","email":"stefan.hoth@researchgate.net"},"directories":{},"maintainers":[{"name":"danez","email":"npm@tschinder.de"},{"name":"sbekrin","email":"sergey@bekrin.me"},{"name":"researchgate-bot","email":"stefan.hoth@researchgate.net"},{"name":"justinvdm","email":"justnvdm@gmail.com"},{"name":"stefanhoth","email":"stefanhoth.de@gmail.com"},{"name":"mdio","email":"michael.diodone@researchgate.net"},{"name":"weaintplastic","email":"info@weaintplastic.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/spire_5.0.3_1654539717911_0.3063402480622244"},"_hasShrinkwrap":false},"5.0.4":{"name":"spire","version":"5.0.4","description":"Extensible CLI toolkit managment tool","main":"index.js","repository":{"type":"git","url":"git+https://github.com/researchgate/spire.git"},"author":{"name":"Sergey Bekrin","email":"sergey@bekrin.me","url":"https://bekrin.me"},"license":"MIT","bin":{"spire":"bin/spire.js"},"engines":{"node":">=12.20"},"scripts":{"postinstall":"./bin/spire.js hook postinstall","preuninstall":"./bin/spire.js hook preuninstall"},"dependencies":{"cosmiconfig":"7.0.1","detect-indent":"6.1.0","fs-extra":"10.0.0","git-remote-origin-url":"3.1.0","import-from":"4.0.0","invariant":"2.2.4","pretty-format":"27.1.1","signale":"1.4.0","spire-config-default":"^5.0.4","yargs":"17.1.1"},"devDependencies":{"spire-test-utils":"^5.0.1"},"prettier":"spire-plugin-prettier/config","gitHead":"c555d6937733cb3b8b9f3eb85a6901e62f1a4f75","bugs":{"url":"https://github.com/researchgate/spire/issues"},"homepage":"https://github.com/researchgate/spire#readme","_id":"spire@5.0.4","_nodeVersion":"14.19.3","_npmVersion":"lerna/4.0.0/node@v14.19.3+x64 (linux)","dist":{"integrity":"sha512-431Dt/j/ycEfFVIbFqrPeqn3pntNvBNqwcoQcifaXJNs9Iduv4igaGqFeLOxST6ofRMbXkcfJu5CugqSSakAng==","shasum":"4acf89a7673e5d073755a9717527335d3eed3bec","tarball":"https://registry.npmjs.org/spire/-/spire-5.0.4.tgz","fileCount":23,"unpackedSize":48690,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDO/WeVwjD5qd70g/fFtIfVcNlZZGsXhW9LcS8kPk6W+gIgWlqAyoaU8yLrIyOoPC1pNFjmpeIMJ3vie/lAjBCW67w="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJinkj2ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrsbA//TLE36EC+y19oX/cOhm9cVLVzqFl8NkVuc3DG5QVpOF9ALCLR\r\nGUS0GavQPdqAG18gGYUbP713fFRlF7IKoFIgJus7L3QrzgM4v/8Xt5Fq6WLb\r\nm5F9kaNRPXT1FQuMPYy3c+ogAOWsU3NG0f4ZdQkTuACDFL+dIbOvIyIXC29O\r\nBfgiTxCwEBVDNTdv+4GLxGPM937naAIat6lX9SGAOOFkioInzcHylIOTdrcr\r\ne+vgVQSe9ADwZzsZJLZHaPZT8DpYm1c336iSBTD9L6HaGWeSAlolV+jttgAI\r\ne18GWHM1SmHDZxibd6iHv6btU+FZ9QH5mEEFr8EwC/DkFGG2LL8wkvwpCqiU\r\nAhO86J7mENqEyN1+W08/ySej5/uI63tz1U1aJVhEjztJj6NIWtIRKgJ0CulS\r\nDvopHgiDPBntVitSalKaMMLDkXEv0c4BooQjzH8W+1dRSbo4aU/4NCCws3BY\r\nGxdZgRvMx5aF6U0/yQ76kW0AugXum4ZkRE9P3FGAKRpegK7g1S2hdvTd29ZY\r\nGJ+AnWznXcceUl7Eokg2QjmrV62KBVRaP245l40ySV3oOpSZcoL5wZZWoYJD\r\nG4s4r4w/cJ9p6XC514KemOw52rLFZZZBVOotZHBXIAliXu5CZVH67typ7p6m\r\nrm1QQTRsImwfVHMyXGnB5TGFKApLFnuy14g=\r\n=/oLB\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"researchgate-bot","email":"stefan.hoth@researchgate.net"},"directories":{},"maintainers":[{"name":"danez","email":"npm@tschinder.de"},{"name":"sbekrin","email":"sergey@bekrin.me"},{"name":"researchgate-bot","email":"stefan.hoth@researchgate.net"},{"name":"justinvdm","email":"justnvdm@gmail.com"},{"name":"stefanhoth","email":"stefanhoth.de@gmail.com"},{"name":"mdio","email":"michael.diodone@researchgate.net"},{"name":"weaintplastic","email":"info@weaintplastic.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/spire_5.0.4_1654540534212_0.7192110072637279"},"_hasShrinkwrap":false},"5.0.5":{"name":"spire","version":"5.0.5","description":"Extensible CLI toolkit managment tool","main":"index.js","repository":{"type":"git","url":"git+https://github.com/researchgate/spire.git"},"author":{"name":"Sergey Bekrin","email":"sergey@bekrin.me","url":"https://bekrin.me"},"license":"MIT","bin":{"spire":"bin/spire.js"},"engines":{"node":">=12.20"},"scripts":{"postinstall":"./bin/spire.js hook postinstall","preuninstall":"./bin/spire.js hook preuninstall"},"dependencies":{"cosmiconfig":"7.0.1","detect-indent":"6.1.0","fs-extra":"10.1.0","git-remote-origin-url":"3.1.0","import-from":"4.0.0","invariant":"2.2.4","pretty-format":"27.1.1","signale":"1.4.0","spire-config-default":"^5.0.5","yargs":"17.1.1"},"devDependencies":{"spire-test-utils":"^5.0.5"},"prettier":"spire-plugin-prettier/config","gitHead":"c2ee8d6f5dfe12e65dd4d68f494ca38c8d43bef6","bugs":{"url":"https://github.com/researchgate/spire/issues"},"homepage":"https://github.com/researchgate/spire#readme","_id":"spire@5.0.5","_nodeVersion":"16.18.0","_npmVersion":"lerna/4.0.0/node@v16.18.0+x64 (linux)","dist":{"integrity":"sha512-7fDXLC14eZKItiJLnFLbwD32PW9z7ZQMDe3OAS5CYbWytxF8+S9YuASXmfx2ljUl6fPOfe1Frv9HevaOR2bgkw==","shasum":"0fe2669177796e0d439f8d763d3714d45fb15c2e","tarball":"https://registry.npmjs.org/spire/-/spire-5.0.5.tgz","fileCount":23,"unpackedSize":49132,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIHgveywUueRuyV/jBeBV5xDYVMwRCBbcWdM1i0t3+nkxAiEAib4zI+s67ZjJ+iE1GkobmRrbOxIa2e+7wUPCDRrjbyA="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjbnu2ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoUzg/+Iw3XBsYZbBh1C/7CcMLtJWf2RpaQ7uNB1BXzQNRL/9g6cc6V\r\nV0NuUTWykAU/N39BJwsCUZ4v50XvrkxjxcwDKDbuPDPixvrdmUmoexL0B1uf\r\n6InKKeTi79n5CRDEs6hJP/MHUDckCoaUxD/L/EVXzundGe8cjE3Bwzz0hM5X\r\nmhBmhcynf4iEJUCT8nBPjEo89sXRPrB5fzF9S3NSYFmgISm/wpNUDgBrsqbU\r\nHdKWZE9j0sFHesqAS7jEGllIkWxTXQKU9G6aK/aTmJFrYRcYkNwgyNJgUssQ\r\np8NT/V798TCyAl51J4cW+3S5FJIiHdieFTvQc7U1jBAdg+zxJyBSNXuxBAZF\r\nUH8VsZyE7t99k3QLBRuyl20khLpPqMtnUu0JZ/eFcPSjIUY+JHvQ3C/ipjtZ\r\ns/ljSS1nW2JbQ1ZRSi/fHeorNfsRdPzSuwWEfYEMjJLHhgSobbTXVAOTDjgv\r\nyPHFgTE4bjY8mFps2pBrKojEa1WNnZUVtf9sj9HGovvYb1LRGZjM4EsyHcIQ\r\nLkmsxWvMTCpTYgiu5YxNj9XzvBkHwa/oyAhqnglwGI1985LNxUyLPdyLtu+w\r\nfXQKMKyqe3nXVKWx9NoIYb/lU1ukFceVEsn1Uhm0CFTd0+SRo8j8/rbc1UMU\r\naUP71vBfKb7gavuHIRz09UVEfL8vTJwMiGI=\r\n=ujCM\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"researchgate-bot","email":"stefan.hoth@researchgate.net"},"directories":{},"maintainers":[{"name":"sbekrin","email":"sergey@bekrin.me"},{"name":"researchgate-bot","email":"stefan.hoth@researchgate.net"},{"name":"stefanhoth","email":"stefanhoth.de@gmail.com"},{"name":"mdio","email":"michael.diodone@researchgate.net"},{"name":"justinvdm","email":"justnvdm@gmail.com"},{"name":"weaintplastic","email":"info@weaintplastic.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/spire_5.0.5_1668185014254_0.7902060091617735"},"_hasShrinkwrap":false},"5.0.6":{"name":"spire","version":"5.0.6","description":"Extensible CLI toolkit managment tool","main":"index.js","repository":{"type":"git","url":"git+https://github.com/researchgate/spire.git"},"author":{"name":"Sergey Bekrin","email":"sergey@bekrin.me","url":"https://bekrin.me"},"license":"MIT","bin":{"spire":"bin/spire.js"},"engines":{"node":">=12.20"},"scripts":{"postinstall":"./bin/spire.js hook postinstall","preuninstall":"./bin/spire.js hook preuninstall"},"dependencies":{"cosmiconfig":"7.0.1","detect-indent":"6.1.0","fs-extra":"10.1.0","git-remote-origin-url":"3.1.0","import-from":"4.0.0","invariant":"2.2.4","pretty-format":"27.1.1","signale":"1.4.0","spire-config-default":"^5.0.6","yargs":"17.1.1"},"devDependencies":{"spire-test-utils":"^5.0.5"},"prettier":"spire-plugin-prettier/config","gitHead":"ef1edd56338f7584405143941e32358e74c281d0","bugs":{"url":"https://github.com/researchgate/spire/issues"},"homepage":"https://github.com/researchgate/spire#readme","_id":"spire@5.0.6","_nodeVersion":"16.18.0","_npmVersion":"lerna/4.0.0/node@v16.18.0+x64 (linux)","dist":{"integrity":"sha512-HQJntaJgceIxyH03u0X3XftEmbEf4l10nLBNjMFisN77bd7lEAjbkeNQe1GX0YC4yOk45dLtnvW5bpYXRK3d3w==","shasum":"d8acbe0056c9be48e1355a84deecdb83c66c2fb8","tarball":"https://registry.npmjs.org/spire/-/spire-5.0.6.tgz","fileCount":23,"unpackedSize":49271,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIAgWHyBNKpRqMuYnO7CeAS6Yqxk+gvI87mOcZvhYG2UTAiEA9k57z8BHpRILHANdeqG/HnW8p2otfAkTeCfvW0D2/6o="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjbnypACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmp93g/+MISjKYJp17lovrFD0lpQoVuCPoxxSx7ETO1o32sPu5hjwJnD\r\nxdjpc5sDhKgleSWcb9KKvxQEsvTy4oOayRwG+LbVKqtUgUcI/1GmjMVa/K8D\r\n9zZo+UcoVoIONXRCGuna5p+Lt75cPpCPa77nVuXqy9/Pf+4qd/Mqle29Ta/i\r\nNov6QDSVONWqcL1ZozisF4cAvOZszO8qW7ZOE47SkjooJgoihXazmmFkEfMI\r\nZUcbPNF1JHQ9aK7Cm/hYdQ+vmwd+rzDTQ0XRlwzsJlVeKqx/pvCZO654g0EQ\r\nPBZLBM6JFJjgnD0rJYBiY8C1P8KNItt2jHpC0/oPYIJc9NjYyRP7oqUpJR7d\r\nNaW9OAHGqcLmLVdSyPZO0wi6aOK8Rm1MfxQ8Y9eAhln91VahJHMdrwycWltw\r\nmLxLceXbrdIs0ScPS1nUyQwGi5Z2qPtGDTRtG8nhz4IRpOou8r6TKXBiKNdt\r\n3MrFIOaJmjKEB83b2UqVhkSSP8GMIQQthmt/hYh6RfwgKFhJZThe5tqEUCrr\r\nM82NfkrPIkHZVHeZaHSTMR7SOEE/bRA1YQNVBNtR1WzwKY+LdkCdHx+srHrW\r\nr30rQEzzsA8CwrkiGa6MTcQK5WPo61LnKiHvfc3t2cQPVX19c3jRl/tR/bNU\r\nyxGAZ4EIsowM1n9W9eobKW8Obfug8jSsykM=\r\n=ZiUR\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"researchgate-bot","email":"stefan.hoth@researchgate.net"},"directories":{},"maintainers":[{"name":"sbekrin","email":"sergey@bekrin.me"},{"name":"researchgate-bot","email":"stefan.hoth@researchgate.net"},{"name":"stefanhoth","email":"stefanhoth.de@gmail.com"},{"name":"mdio","email":"michael.diodone@researchgate.net"},{"name":"justinvdm","email":"justnvdm@gmail.com"},{"name":"weaintplastic","email":"info@weaintplastic.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/spire_5.0.6_1668185257049_0.4010500956471166"},"_hasShrinkwrap":false},"5.0.7":{"name":"spire","version":"5.0.7","description":"Extensible CLI toolkit managment tool","main":"index.js","repository":{"type":"git","url":"git+https://github.com/researchgate/spire.git"},"author":{"name":"Sergey Bekrin","email":"sergey@bekrin.me","url":"https://bekrin.me"},"license":"MIT","bin":{"spire":"bin/spire.js"},"engines":{"node":">=12.20"},"scripts":{"postinstall":"./bin/spire.js hook postinstall","preuninstall":"./bin/spire.js hook preuninstall"},"dependencies":{"cosmiconfig":"7.0.1","detect-indent":"6.1.0","fs-extra":"10.1.0","git-remote-origin-url":"3.1.0","import-from":"4.0.0","invariant":"2.2.4","pretty-format":"27.1.1","signale":"1.4.0","spire-config-default":"^5.0.7","yargs":"17.1.1"},"devDependencies":{"spire-test-utils":"^5.0.5"},"prettier":"spire-plugin-prettier/config","gitHead":"502d0573d266625fbc858697578310feb5b62eb5","bugs":{"url":"https://github.com/researchgate/spire/issues"},"homepage":"https://github.com/researchgate/spire#readme","_id":"spire@5.0.7","_nodeVersion":"16.18.0","_npmVersion":"lerna/4.0.0/node@v16.18.0+x64 (linux)","dist":{"integrity":"sha512-r2OwN4EsgKWbRLjihpLdxmNICvG4KlYHGHtIuxqO1fs/BsTKDmqDO8XLaekKPFYRh5XgZmIjvMhz4nvtqRJ1aw==","shasum":"39abd5cc83a92d9adfdf199b9954782051461bd3","tarball":"https://registry.npmjs.org/spire/-/spire-5.0.7.tgz","fileCount":23,"unpackedSize":49410,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCICNlVCEL/BS8ONhP6KdBSRrdwqZDxixKRBatPtuD7hAWAiAyfeHoKIbp0FNModXIyFelnA4+rvx6GHOLHVABBybzTA=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjboJ9ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrzfA//cLuNCdz/6OIIHVyUTt0Bh9Kh5b1T5+U62Ej+jC6g6myiGjFT\r\nMerDiFzyocaDL6mCFBeWaezBjIRrMD1JUyxhGbVwtfe9PfWdLSVaS4fv8MwI\r\nXYvk12TkFB2GzaYzWgVXynXoM1lCUer9hewAskmsrC2IPIxb+QJMJLMwnLAc\r\nTFFrLTtJqCjoR5q15FjDtWI9AZq4DC6UKsXYn55UVgdELuMGlMql7syQ3DyT\r\njdnrLSfXnxtjpLd/clCOFMbroccRp6q5rnr+6o1NZEMeFJoXWcRGMxdZV6Dv\r\nZoQqG2WErzCifjuf9ozRoVkaevt8KGIzs3coszo4viShK33YdPuPg171fjG6\r\nvYuE/kLWkif3nq9bsZMnmXo41lJpQaFDpTNQhTyJfQ1NuL8sYbEYjeB2mrho\r\n6ro3SS/wS7fG2YpJbIaVesYlr9zktE0bcU2Id3c63Bal/dYsrEkwUEM3CV9i\r\nNiuYY7GWYkBc5oTQ0UflTTelNfmN/Blr/O/bQzSWGc5uTseFPDytqe5B+vbr\r\nER6r9Uaxr89n/f6azP9ygLggEmunP6XL0kE3o4/PXveCS31i9dzaGFUubke9\r\n8K46168l3Az69vUFqgAXWcQMcKbPPPW8xKPHl6zqTW6HZCvhAU7Y5cK94UP6\r\n+dHIYtNlcJXN8KrDBor0kEk46nSVbY5eWIs=\r\n=CpR6\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"researchgate-bot","email":"stefan.hoth@researchgate.net"},"directories":{},"maintainers":[{"name":"sbekrin","email":"sergey@bekrin.me"},{"name":"researchgate-bot","email":"stefan.hoth@researchgate.net"},{"name":"stefanhoth","email":"stefanhoth.de@gmail.com"},{"name":"mdio","email":"michael.diodone@researchgate.net"},{"name":"justinvdm","email":"justnvdm@gmail.com"},{"name":"weaintplastic","email":"info@weaintplastic.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/spire_5.0.7_1668186749185_0.01280272677213623"},"_hasShrinkwrap":false},"5.0.8":{"name":"spire","version":"5.0.8","description":"Extensible CLI toolkit managment tool","main":"index.js","repository":{"type":"git","url":"git+https://github.com/researchgate/spire.git"},"author":{"name":"Sergey Bekrin","email":"sergey@bekrin.me","url":"https://bekrin.me"},"license":"MIT","bin":{"spire":"bin/spire.js"},"engines":{"node":">=12.20"},"scripts":{"postinstall":"./bin/spire.js hook postinstall","preuninstall":"./bin/spire.js hook preuninstall"},"dependencies":{"cosmiconfig":"7.0.1","detect-indent":"6.1.0","fs-extra":"10.1.0","git-remote-origin-url":"3.1.0","import-from":"4.0.0","invariant":"2.2.4","pretty-format":"27.5.1","signale":"1.4.0","spire-config-default":"^5.0.8","yargs":"17.1.1"},"devDependencies":{"spire-test-utils":"^5.0.5"},"prettier":"spire-plugin-prettier/config","gitHead":"ae64fa70da0622dbd8a1a7642162af8a23348001","bugs":{"url":"https://github.com/researchgate/spire/issues"},"homepage":"https://github.com/researchgate/spire#readme","_id":"spire@5.0.8","_nodeVersion":"16.18.0","_npmVersion":"lerna/4.0.0/node@v16.18.0+x64 (linux)","dist":{"integrity":"sha512-Iajw1gyhr+1jFOmbeSfkifS1MxlfIGi0fvljo0hBs2IuiWJw0ATGDOMvwRVIcvwBDKRHfn3ZLX7zi8mT+BiguQ==","shasum":"0d34b36368ef859e2ec2abfdf2178f2acf75d9fc","tarball":"https://registry.npmjs.org/spire/-/spire-5.0.8.tgz","fileCount":23,"unpackedSize":49721,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCHgGrxcDKntajWjRalfzPoecmzf+CjRYMMdZfz8e39fAIgYqKe1VG4TkQG47yJWI5N24MRaLaa9EmzrjeVnpCpWdQ="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjbok+ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqLHQ//QKUGrzm3U5o6+QervUMG+w/qPeaxjbhGhTlwrShO9ESJjibx\r\nahL7EOvcZFCe0Ipt1X84d7MoPF0V9TCqnHnywHB6j5oUZZiQDZN1vGr3TR2e\r\nTVbi0oNRb2sgPkL/QqO4Qy6Mx4GwbJKJPApm+F/PPKkoKHLwdBEgt9rDu/tb\r\nMxNX31yl6/eVwjuh/v1NVzPEJWfFwAu/0VZDSjHXFFACFkDeRddRWiwk/NOz\r\n7/3Ue30c9UULeH14U9fGTf0p7xKKBwaK0sh54q0uh+ETyqiIQFjtV4s5DHWn\r\n8KBQweBNvS99K0ZnDg+FcHwFcuHRMLinMRawf0BK1QL+vtSwI/O2HfoPVbcQ\r\na4FGOZdld9DHAdAl30oBenJliYSiOQIMkGOftlhxA/CJT+d3NB0A4HZk7ceW\r\nECo+beHLwhFbXD3h0wQPWHZfvZFX/Hz+cSnq7KSVVF60z9a0ItoVtayvQLIL\r\nD8hCtn/SuMkcv7Z3sOrRpBioodmnZiNIsF9c6mughomy7UkXVKp8cPbxsVMk\r\nev65dQJj6O1Gdvks8r9jqay/ph4oqQA63u+lNUU7IIR2SEq61fsOrB+90cvT\r\nHYQe+gwEoTV+jzMgPCLvbvgoq1vWIKA8mgoWPUiYgksDsOMgDbc65rh0d3Ls\r\nzyx3mCF/O0PnsvaGoxfKq+Ek1ke/8jNxrvs=\r\n=nCFY\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"researchgate-bot","email":"stefan.hoth@researchgate.net"},"directories":{},"maintainers":[{"name":"sbekrin","email":"sergey@bekrin.me"},{"name":"researchgate-bot","email":"stefan.hoth@researchgate.net"},{"name":"stefanhoth","email":"stefanhoth.de@gmail.com"},{"name":"mdio","email":"michael.diodone@researchgate.net"},{"name":"justinvdm","email":"justnvdm@gmail.com"},{"name":"weaintplastic","email":"info@weaintplastic.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/spire_5.0.8_1668188477966_0.7240497558822712"},"_hasShrinkwrap":false}},"readme":"# 🗼 Spire\n\nExtensible JavaScript toolbox management.\n\n<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->\n\n- [Motivation](#motivation)\n- [Quick Start](#quick-start)\n- [Configuration](#configuration)\n  - [Using a Custom Preset](#using-a-custom-preset)\n  - [Using a Local Preset](#using-a-local-preset)\n  - [Passing Options](#passing-options)\n- [Guides](#guides)\n  - [Writing a Config](#writing-a-config)\n  - [Writing a Plugin](#writing-a-plugin)\n  - [Migrating to Spire](#migrating-to-spire)\n  - [Using without Git](#using-without-git)\n  - [Using in monorepos](#using-in-monorepos)\n- [API](#api)\n  - [CLI](#cli)\n  - [`spire`](#spire)\n  - [`context`](#context)\n- [References](#references)\n- [License](#license)\n\n<!-- END doctoc generated TOC please keep comment here to allow auto update -->\n\n## Motivation\n\n**Problem:** Maintaining tools and configurations for linting, testing and\nbuilding your code is hard. The more projects you have, the more time it takes\nto keep your setup consistent and up-to-date.\n\n**Solution:** Spire is a pluggable CLI tool which allows you to abstract all of\nyour tools and configurations into reusable plugins and presets. Think of it as\n“babel for infrastructure”.\n\n## Quick Start\n\n1. Install `spire`:\n\n```sh\n# yarn\nyarn add --dev spire\n\n# npm\nnpm install --save-dev spire\n```\n\n2. Start using in your project:\n\n```sh\n# npx\nnpx spire --help\n\n# yarn\nyarn spire --help\n```\n\n3. Depending on your tech stack, you can start using Spire as zero-config tool.\n   See [spire-config-default] for a list of default tools and\n   [configuration section](#configuration) for how to customise it.\n\n- _Using yarn? Consider installing [spire-plugin-yarn] for few power features._\n\n- _Want to have automated release w/ changelog generation? Check out\n  [spire-plugin-semantic-release] and [spire-plugin-lerna-release] for lerna\n  monorepos._\n\n## Configuration\n\nSpire is based on config presets, which is the same concept for tools like\n[Babel](https://babeljs.io/) and [ESLint](https://eslint.org/). Configs are a\nset of predefined plugins and their options. Configs can also extend a chain of\nother configs. By default, Spire is shipped with [spire-config-default].\n\n### Using a Custom Preset\n\nTo use your preferred configuration, install it as dev dependency and reference\nit by module name in [`extends` property](#writing-a-config). To extend multiple\nconfigs, provide it as an array. You can also use individual plugins along with\nconfigs with [`plugins` property](#writing-a-config).\n\n<details open>\n  <summary>via <code>package.json#spire</code> (recommended)</summary>\n\n```json\n{\n  \"name\": \"acme-project\",\n  \"devDependencies\": {\n    \"spire\": \"^3.0.0\",\n    \"spire-config-acme\": \"^1.0.0\"\n  },\n  \"spire\": {\n    \"extends\": \"spire-config-acme\"\n  }\n}\n```\n\n</details>\n\n<details>\n  <summary>via <code>spire.config.js</code></summary>\n\n```js\nmodule.exports = {\n  extends: 'spire-config-acme',\n};\n```\n\n</details>\n\n<details>\n  <summary>via <code>.spirerc</code></summary>\n\n```js\n{\n  \"extends\": \"spire-config-acme\",\n}\n```\n\n</details>\n\n### Using a Local Preset\n\n_Note: It is recommended to enable Local Presets only for development._\n\nYou can reference a Local Preset or plugin using `<rootDir>` placeholder which\npoints to the current project directory:\n\n```json\n{\n  \"spire\": {\n    \"extends\": \"<rootDir>/spire-config.js\",\n    \"plugins\": [\"<rootDir>/spire-plugin.js\"]\n  }\n}\n```\n\n### Passing Options\n\nIf the config preset or plugin you're using supports customisation, you can pass\noptions to it:\n\n```json\n{\n  \"spire\": {\n    \"extends\": [[\"spire-config-acme\", { \"fictional\": false }]],\n    \"plugins\": [[\"spire-plugin-acme\", { \"company\": true }]]\n  }\n}\n```\n\n## Guides\n\n### Writing a Config\n\nA Config is a module which exports a function returning an object.\n\n- `config` \\<[function]([Object], [Object])\\>\n  - `spire` \\<[Object]\\> Spire [API object](#spire).\n  - `options` \\<[Object]\\> User-provided config options.\n- returns: \\<[Object]\\>\n  - `extends` \\<[string]|\\<[Array]\\<[string]\\>\\>\\> Config or an array of config\n    presets to extend.\n  - `plugins` \\<[Array]\\<[string]\\>\\> Array of plugins to include.\n\nExample:\n\n```js\nmodule.exports = (spire, options) => {\n  return {\n    extends: ['spire-config-first', 'spire-config-second'],\n    plugins: ['spire-plugin'],\n  };\n};\n```\n\nYou can dynamically change the behaviour of your preset based on `options` or\n`spire` APIs, but it's recommended to keep it explicit. Check\n[spire-config-default](https://github.com/researchgate/spire/blob/master/packages/spire-config-default/index.js)\nfor a reference.\n\n### Writing a Plugin\n\nA Plugin is a key component of Spire. After it resolves the config, Spire\naccumulates all plugins in chronological order and runs them. A Plugin is a\nfunction returning an object:\n\n_Note: It is recommended to keep plugins scoped to a single feature or tool._\n\n- `plugin` \\<[function]([Object], [Object])\\>\n  - `spire` \\<[Object]\\> Spire [API object](#spire).\n  - `options` \\<[Object]\\> User-provided plugin options.\n- returns: \\<[Object]\\>\n  - `name` \\<[string]\\> Name of the plugin (recommended).\n  - `command` \\<[string]\\> Optional name of command. Leaving it empty will\n    ignore `run` hook completly.\n  - `description` \\<[string]\\> Optional human-readable command description.\n  - `preinstall` \\<[function]\\([Context]\\): [Promise]\\> Executed before\n    `yarn install` or `npm install`\n  - `postinstall` \\<[function]\\([Context]\\): [Promise]\\> Executed after\n    `yarn install` or `npm install`.\n  - `postmerge` \\<[function]\\([Context]\\): [Promise]\\> Executed on `git pull`.\n  - `precommit` \\<[function]\\([Context]\\): [Promise]\\> Executed on `git commit`.\n  - `setup` \\<[function]\\([Context]\\): [Promise]\\> Executed before `run` hook.\n    Use it to prepare arguments or config for your tools. If it fails, Spire\n    stops futher hooks from being executed.\n  - `run` \\<[function]\\([Context]\\): [Promise]\\> Executed as the main logic of\n    the plugin. Use this hook to run the CLI tool or process long-running task.\n  - `teardown` \\<[function]\\([Context]\\): [Promise]\\> Executed after `run` hook,\n    even if it has failed. Use this hook to cleanup locally or to collect some\n    stats.\n  - `preuninstall` \\<[function]\\([Context]\\): [Promise]\\> Executed before\n    `yarn uninstall` or `npm uninstall`. Run it to cleanup external data.\n\nExample:\n\n```js\nmodule.exports = (spire, options) => {\n  return {\n    name: 'my-awesome-tool',\n    command: 'my-tool',\n    description: 'run my awesome tool',\n    async run({ logger }) {\n      logger.log('Hi from my awesome tool!');\n    },\n  };\n};\n```\n\nCheck [spire-plugin-clean], [spire-plugin-doctoc] and [spire-plugin-eslint] for\nmore plugin examples.\n\n### Migrating to Spire\n\n**Identify your tools:** To get started, gather a list of shared tools in your\nexisting projects. This will help to identify which plugins you'll need.\n\n**Pick preset or plugin:** Check if there's already a default or community\nplugin for that.\n[Search for `spire-plugin-*`](https://www.npmjs.com/search?q=spire-plugin-) on\nnpm for individual tools and\n[`spire-config-*`](https://www.npmjs.com/search?q=spire-config-) for specific\necosystems and tech stacks. In case if there's no suitable option for your,\ncheck on how to [write a custom plugin](#writing-a-plugin).\n\n**Make your own preset**: If you find that an existing or default preset works\nfor you, skip this step. If not, create a new module with a name matching\n`spire-config-*`. It can be specific for your personal projects, your company or\na tech stack. Check [writing a config](#writing-a-config) for instructions on\nhow to do this.\n\n**Migrate your projects**: Once you've got a preset ready, go through your\nprojects and [setup Spire](#quick-start) with it. Make sure to delete the\ndependencies it replaces. At this point you're done!\n\n### Using without Git\n\nYou do not need to have git installed to run spire itself. Be aware though that\ncertain plugins might need to have git installed to work. For example the\nsemantic-release and lerna-release plugin obviously need git because they create\ntags and commits.\n\n### Using in monorepos\n\nIt is recommended to install Spire on the root level of a monorepo and run all\ncommands from there. The main motivation behind this is performance and\nconsistency reasons. You can still though run commands in an indivudual package.\nBelow is an example of how to run `spire lint` in a specific monorepo package:\n\n- With [yarn workspaces]:\n  ```sh\n  yarn workspace <pkg-name> spire lint\n  ```\n- With [lerna]:\n  ```sh\n  npx lerna --scope <pkg-name> exec spire lint\n  ```\n\n## API\n\n### CLI\n\nEach plugin can extend a list of available commands and their options. The list\nbelow only includes basic commands.\n\n- `npx spire --help` Prints the list of available commands.\n- `npx spire --version` Prints the current version of Spire.\n- `npx spire <cmd>` Runs a specific command defined by plugins.\n- `npx spire --debug <cmd>` Outputs additional debug information.\n- _(hidden)_ `npx spire hook <name>` Runs specific git or npm plugin hooks.\n  Available hooks are `postinstall`, `preuninstall`, `precommit` and\n  `postmerge`. Use this to test or debug your plugins.\n\n### `spire`\n\nSpire is an object which is passed as the first argument to both configs and\nplugins.\n\n- `spire`\n  - `setState` \\<[function]\\([Object]|[function]\\)\\> Sets state by merging it\n    with previous one (shallow).\n    - `state` \\<[Object]|[function]\\> New state as an object or a function which\n      recevies the previous state and returns an object. Usefull to avoid\n      `getState()` calls.\n  - `getState` \\<[function]\\(\\): [Object]\\> Returns current state.\n  - `hasFile` \\<[function]\\([string]\\): [Promise]\\<[boolean]\\>\\> Checks if\n    current projects contains specific file.\n  - `hasPackageProp` \\<[function]\\([string]\\): [Promise]\\<[boolean]\\>\\> Check if\n    current project's `package.json` contains specific prop.\n\n### `context`\n\nContext is an object which is passed as the first argument to plugin hooks. It's\ndesigned to be read-only. If you want to pass some data futher, consider using\n[`spire.setState` instead](#spire).\n\n- `context`\n  - `argv` \\<[Array]\\<[string]\\>\\> Array of arguments Spire was called with.\n    Defaults to `process.argv.slice(2)`.\n  - `cli` \\<[Object]\\> Instance of [yargs](http://yargs.js.org/) for adding\n    custom commands.\n  - `cwd` \\<[string]\\> Directory Spire is executed in. Defaults to\n    `process.cwd()`.\n  - `env` \\<[Object]\\> Set of environment variables. Defaults to `process.env`.\n  - `logger` \\<[Object]\\> Instance of\n    [Signale](https://github.com/klauscfhq/signale). Use `logger.debug()` to\n    print debug info which is only shown with `--debug` flag.\n  - `config` \\<[Object]\\> Parsed and normalised [config](#writing-a-config).\n  - `options` \\<[Object]\\> Parsed yargs options. Available only after `setup`\n    hook.\n\n## References\n\nThis project is inspired by the great work of JavaScript open source community\n(without particular order):\n\n- [Kent C. Dodds: Tools without config 🛠📦](https://blog.kentcdodds.com/automation-without-config-412ab5e47229)\n- [Dan Abramov: The Melting Pot of JavaScript](https://www.youtube.com/watch?v=nl30vWYKs9A)\n- [Jamie Kyle: Tools 4 Tools 4 Tools](https://www.youtube.com/watch?v=itI5xGyvtho)\n- [semantic-release](https://github.com/semantic-release/semantic-release)\n- [react-scripts](https://github.com/facebook/create-react-app/tree/next/packages/react-scripts)\n- [kcd-scripts](https://github.com/kentcdodds/kcd-scripts)\n- [bolt](https://github.com/boltpkg/bolt)\n\n## License\n\nMIT &copy; [ResearchGate](https://github.com/researchgate)\n\n[context]: #context\n[spire-config-default]:\n  https://github.com/researchgate/spire/blob/master/packages/spire-config-default\n[spire-plugin-yarn]:\n  https://github.com/researchgate/spire/blob/master/packages/spire-plugin-yarn\n[spire-plugin-clean]:\n  https://github.com/researchgate/spire/blob/master/packages/spire-plugin-clean\n[spire-plugin-doctoc]:\n  https://github.com/researchgate/spire/blob/master/packages/spire-plugin-doctoc\n[spire-plugin-eslint]:\n  https://github.com/researchgate/spire/blob/master/packages/spire-plugin-eslint\n[spire-plugin-semantic-release]:\n  https://github.com/researchgate/spire/blob/master/packages/spire-plugin-semantic-release\n[spire-plugin-lerna-release]:\n  https://github.com/researchgate/spire/blob/master/packages/spire-plugin-lerna-release\n[boolean]:\n  https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Boolean_type\n[string]:\n  https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type\n[array]:\n  https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array\n[object]:\n  https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object\n[function]:\n  https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function\n[promise]:\n  https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise\n[symbol]:\n  https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol\n[create-react-app]: https://github.com/facebook/create-react-app\n[yarn workspaces]: https://yarnpkg.com/lang/en/docs/workspaces/\n[lerna]: https://github.com/lerna/lerna\n","maintainers":[{"name":"sbekrin","email":"sergey@bekrin.me"},{"name":"researchgate-bot","email":"stefan.hoth@researchgate.net"},{"name":"stefanhoth","email":"stefanhoth.de@gmail.com"},{"name":"mdio","email":"michael.diodone@researchgate.net"},{"name":"justinvdm","email":"justnvdm@gmail.com"},{"name":"weaintplastic","email":"info@weaintplastic.com"}],"time":{"modified":"2022-11-11T17:41:18.268Z","created":"2016-01-07T06:48:56.740Z","0.6.1":"2016-01-07T06:48:56.740Z","1.3.0":"2019-02-28T14:31:35.300Z","1.4.0":"2019-03-29T10:36:26.414Z","1.4.1":"2019-03-29T15:31:32.917Z","1.7.0":"2019-04-03T15:41:04.988Z","1.7.1":"2019-04-23T10:02:08.942Z","1.7.2-next.1":"2019-05-21T15:49:47.720Z","1.7.2":"2019-05-24T14:36:26.047Z","1.7.4-next.11":"2019-08-23T22:51:08.955Z","1.7.4-next.17":"2019-09-17T11:32:32.246Z","1.7.3":"2019-11-05T11:54:04.030Z","1.8.0":"2019-11-13T15:11:21.130Z","1.8.1":"2019-11-13T15:50:08.719Z","1.7.4-next.32":"2019-11-13T16:18:40.384Z","1.7.4-next.33":"2019-11-13T17:01:53.840Z","1.8.2":"2019-11-15T11:33:21.626Z","1.8.3":"2019-11-15T11:50:16.891Z","1.8.4-next.27":"2019-11-15T12:18:15.781Z","1.8.4-next.33":"2019-11-29T14:55:41.837Z","1.8.4-next.34":"2019-11-29T16:21:32.796Z","1.8.4-next.36":"2019-11-29T16:24:23.896Z","1.8.4-next.38":"2019-12-10T12:24:39.802Z","1.8.4-next.41":"2020-01-05T18:48:25.531Z","1.8.4-next.42":"2020-01-05T19:11:18.368Z","1.8.4-next.45":"2020-02-03T10:35:29.112Z","1.8.4-next.46":"2020-02-03T11:00:05.366Z","1.8.4-next.47":"2020-04-30T09:50:17.118Z","1.8.4-next.48":"2020-04-30T11:18:11.682Z","2.0.0":"2020-04-30T12:17:06.395Z","2.0.1":"2020-04-30T13:05:44.171Z","2.0.2":"2020-04-30T13:10:46.836Z","2.1.0":"2020-04-30T17:31:16.685Z","2.1.2":"2020-05-05T11:12:49.260Z","2.1.4":"2020-05-05T14:39:54.597Z","2.2.0":"2020-06-11T11:17:31.470Z","2.2.1":"2020-06-16T17:27:44.974Z","3.0.0":"2020-07-28T07:59:45.800Z","3.0.1":"2020-08-07T09:02:12.697Z","3.0.2":"2020-08-07T09:45:19.702Z","3.1.0":"2020-08-17T09:22:26.063Z","3.1.2":"2020-09-09T10:32:47.043Z","3.2.1":"2020-11-12T15:24:07.964Z","3.2.2":"2020-12-03T18:22:20.102Z","3.2.3":"2021-05-21T23:05:03.834Z","4.0.0":"2021-05-21T23:34:03.826Z","4.0.1":"2021-05-21T23:52:49.703Z","4.1.0":"2021-05-22T13:00:28.115Z","4.1.1":"2021-07-02T20:17:24.617Z","4.1.2":"2021-09-09T15:41:36.310Z","5.0.0":"2021-09-09T20:45:11.831Z","5.0.1":"2021-09-09T21:20:29.808Z","5.0.2":"2021-09-09T21:24:50.466Z","5.0.3":"2022-06-06T18:21:58.069Z","5.0.4":"2022-06-06T18:35:34.321Z","5.0.5":"2022-11-11T16:43:34.386Z","5.0.6":"2022-11-11T16:47:37.239Z","5.0.7":"2022-11-11T17:12:29.358Z","5.0.8":"2022-11-11T17:41:18.172Z"},"homepage":"https://github.com/researchgate/spire#readme","repository":{"type":"git","url":"git+https://github.com/researchgate/spire.git"},"author":{"name":"Sergey Bekrin","email":"sergey@bekrin.me","url":"https://bekrin.me"},"bugs":{"url":"https://github.com/researchgate/spire/issues"},"license":"MIT","readmeFilename":"README.md"}